diff --git a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java index d93cd911a3..b167297e7a 100644 --- a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java +++ b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java @@ -81,5 +81,14 @@ public interface ComponentConfigService { */ void unsetProperty(String componentName, String name); + /** + * Returns configuration property of the named components. + * + * @param componentName component name + * @param attribute component attribute + * @return configuration property + */ + ConfigProperty getProperty(String componentName, String attribute); + } diff --git a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java index e0e2accf88..97fa037f10 100644 --- a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java +++ b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java @@ -57,4 +57,9 @@ public class ComponentConfigAdapter implements ComponentConfigService { public void unsetProperty(String componentName, String name) { } + + @Override + public ConfigProperty getProperty(String componentName, String attribute) { + return null; + } } diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java index 21a54b39a9..b6e6a0f3f6 100644 --- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java +++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java @@ -195,6 +195,19 @@ public class ComponentConfigManager implements ComponentConfigService { store.unsetProperty(componentName, name); } + @Override + public ConfigProperty getProperty(String componentName, String attribute) { + checkPermission(CONFIG_READ); + + Map map = properties.get(componentName); + if (map != null) { + return map.get(attribute); + } else { + log.error("Attribute {} not present in component {}", attribute, componentName); + return null; + } + } + private class InternalStoreDelegate implements ComponentConfigStoreDelegate { @Override diff --git a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java index 54f361e740..149e64be70 100644 --- a/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java +++ b/core/store/dist/src/test/java/org/onosproject/store/intent/impl/GossipIntentStoreTest.java @@ -276,5 +276,10 @@ public class GossipIntentStoreTest extends AbstractIntentTest { public void unsetProperty(String componentName, String name) { } + + @Override + public ConfigProperty getProperty(String componentName, String attribute) { + return null; + } } } diff --git a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java index 011de5a235..2b6021c403 100644 --- a/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java +++ b/incubator/protobuf/services/nb/src/test/java/org/onosproject/incubator/protobuf/services/nb/GrpcNbComponentConfigServiceTest.java @@ -273,5 +273,10 @@ public class GrpcNbComponentConfigServiceTest { public void unsetProperty(String componentName, String name) { STRING_MAP2.remove(componentName + "#" + name); } + + @Override + public ConfigProperty getProperty(String componentName, String attribute) { + return null; + } } } diff --git a/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java b/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java index 9d3bcca23b..bf0449c965 100644 --- a/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java +++ b/web/api/src/main/java/org/onosproject/rest/resources/ComponentConfigWebResource.java @@ -156,4 +156,34 @@ public class ComponentConfigWebResource extends AbstractWebResource { props.fieldNames().forEachRemaining(k -> service.unsetProperty(component, k)); return Response.noContent().build(); } + + /** + * Gets specified value of a specified component and variable. + * + * @param component component name + * @param attribute attribute name + * @return 200 OK with a collection of component configurations + */ + @GET + @Path("{component}/{attribute}") + @Produces(MediaType.APPLICATION_JSON) + public Response getComponentConfig(@PathParam("component") String component, + @PathParam("attribute") String attribute) { + ComponentConfigService service = get(ComponentConfigService.class); + ObjectNode root = mapper().createObjectNode(); + encodeConfigs(component, attribute, + nullIsNotFound(service.getProperty(component, attribute), + (service.getProperties(component) == null) ? + "No such component" : (service.getProperty(component, attribute) == null) ? + ("No such attribute in " + component) : "No such attribute and component"), root); + return ok(root).build(); + } + + // Encodes the specified property with attribute as an object in the given node. + private void encodeConfigs(String component, String attribute, ConfigProperty props, + ObjectNode node) { + ObjectNode compNode = mapper().createObjectNode(); + node.set(component, compNode); + compNode.put(attribute, props.value()); + } }