DCS check and create built-in nodes
Change-Id: I14b93b9f7ea4a1b69f8b16598dd58d5300dc7595
diff --git a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
index b7ae330..202f178 100644
--- a/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
+++ b/apps/config/src/main/java/org/onosproject/config/impl/DistributedDynamicConfigStore.java
@@ -122,14 +122,14 @@
.build();
keystore.addListener(klistener);
objectStore.addListener(olistener);
- log.info("DyanmicConfig Store Active");
+ log.info("Started");
}
@Deactivate
public void deactivateStore() {
keystore.removeListener(klistener);
objectStore.removeListener(olistener);
- log.info("DyanmicConfig Store Stopped");
+ log.info("Stopped");
}
@Override
@@ -139,7 +139,7 @@
log.trace(" addNode({}, {})", parent, node);
log.trace(" spath={}", spath);
if (spath == null) {
- throw new FailedException("Invalid RsourceId, cannot create Node");
+ throw new FailedException("Invalid ResourceId, cannot create Node");
}
if (!spath.equals(ResourceIdParser.ROOT)) {
if (completeVersioned(keystore.get(DocumentPath.from(spath))) == null) {
diff --git a/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java b/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
index 39820b4..d90a938 100644
--- a/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
+++ b/apps/config/src/main/java/org/onosproject/config/impl/DynamicConfigManager.java
@@ -24,6 +24,8 @@
import org.onosproject.config.ResourceIdParser;
import org.onosproject.config.RpcExecutor;
import org.onosproject.config.RpcMessageId;
+import org.onosproject.d.config.DeviceResourceIds;
+import org.onosproject.d.config.ResourceIds;
import org.onosproject.event.AbstractListenerManager;
import org.onosproject.config.DynamicConfigEvent;
import org.onosproject.config.DynamicConfigListener;
@@ -35,10 +37,11 @@
import org.onosproject.yang.model.RpcInput;
import org.onosproject.yang.model.RpcOutput;
import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DataNode.Type;
+import org.onosproject.yang.model.InnerNode;
import org.onosproject.yang.model.ResourceId;
import org.onosproject.yang.model.RpcRegistry;
import org.onosproject.yang.model.RpcService;
-
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -47,6 +50,8 @@
import java.util.concurrent.Executors;
import org.slf4j.Logger;
+
+import static org.onosproject.d.config.DeviceResourceIds.DCS_NAMESPACE;
import static org.slf4j.LoggerFactory.getLogger;
/**
@@ -58,19 +63,47 @@
public class DynamicConfigManager
extends AbstractListenerManager<DynamicConfigEvent, DynamicConfigListener>
implements DynamicConfigService, RpcRegistry {
+
private final Logger log = getLogger(getClass());
private final DynamicConfigStoreDelegate storeDelegate = new InternalStoreDelegate();
+
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DynamicConfigStore store;
private ConcurrentHashMap<String, RpcService> handlerRegistry = new ConcurrentHashMap<>();
@Activate
public void activate() {
+ initStore();
store.setDelegate(storeDelegate);
eventDispatcher.addSink(DynamicConfigEvent.class, listenerRegistry);
log.info("Started");
}
+ /**
+ * Ensure built-in tree nodes exists.
+ */
+ private void initStore() {
+ store.nodeExist(ResourceIds.ROOT_ID)
+ .thenAccept(exists -> {
+ if (!exists) {
+ log.info("Root node does not exist!, creating...");
+ store.addNode(null,
+ InnerNode.builder(DeviceResourceIds.ROOT_NAME, DCS_NAMESPACE)
+ .type(Type.SINGLE_INSTANCE_NODE).build());
+ }
+ }).join();
+
+ store.nodeExist(DeviceResourceIds.DEVICES_ID)
+ .thenAccept(exists -> {
+ if (!exists) {
+ log.info("devices node does not exist!, creating...");
+ store.addNode(ResourceIds.ROOT_ID,
+ InnerNode.builder(DeviceResourceIds.DEVICES_NAME, DCS_NAMESPACE)
+ .type(Type.SINGLE_INSTANCE_NODE).build());
+ }
+ }).join();
+ }
+
@Deactivate
public void deactivate() {
store.unsetDelegate(storeDelegate);
@@ -79,30 +112,37 @@
log.info("Stopped");
}
+ @Override
public void createNode(ResourceId path, DataNode node) {
store.addNode(path, node).join();
}
+ @Override
public DataNode readNode(ResourceId path, Filter filter) {
return store.readNode(path, filter).join();
}
+ @Override
public void updateNode(ResourceId path, DataNode node) {
store.updateNode(path, node).join();
}
+ @Override
public void deleteNode(ResourceId path) {
store.deleteNodeRecursive(path).join();
}
+ @Override
public void replaceNode(ResourceId path, DataNode node) {
throw new FailedException("Not yet implemented");
}
+ @Override
public Boolean nodeExist(ResourceId path) {
return store.nodeExist(path).join();
}
+ @Override
public Set<RpcService> getRpcServices() {
Set<RpcService> res = new HashSet();
for (Map.Entry<String, RpcService> e : handlerRegistry.entrySet()) {
@@ -111,10 +151,12 @@
return res;
}
+ @Override
public RpcService getRpcService(Class<? extends RpcService> intfc) {
return handlerRegistry.get(intfc.getSimpleName());
}
+ @Override
public void registerRpcService(RpcService handler) {
for (Class<?> intfc : handler.getClass().getInterfaces()) {
if (RpcService.class.isAssignableFrom(intfc)) {
@@ -123,6 +165,7 @@
}
}
+ @Override
public void unregisterRpcService(RpcService handler) {
for (Class<?> intfc : handler.getClass().getInterfaces()) {
if (RpcService.class.isAssignableFrom(intfc)) {
@@ -145,6 +188,7 @@
throw new FailedException("No handler found, cannot invoke");
}
+ @Override
public CompletableFuture<RpcOutput> invokeRpc(ResourceId id, RpcInput input) {
String[] ctxt = ResourceIdParser.getService(id);
RpcService handler = handlerRegistry.get(ctxt[0]);
@@ -160,6 +204,7 @@
* Auxiliary store delegate to receive notification about changes in the store.
*/
private class InternalStoreDelegate implements DynamicConfigStoreDelegate {
+ @Override
public void notify(DynamicConfigEvent event) {
post(event);
}