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);
         }