ONOS-6078
Netconf : Active component

Change-Id: I147193091880c026e198fc723cfe054e5dbea69f
diff --git a/apps/netconf/BUCK b/apps/netconfsb/BUCK
similarity index 72%
rename from apps/netconf/BUCK
rename to apps/netconfsb/BUCK
index f4cc35c..907e4be 100644
--- a/apps/netconf/BUCK
+++ b/apps/netconfsb/BUCK
@@ -1,10 +1,10 @@
 BUNDLES = [
-  '//apps/netconf/client:onos-apps-netconf-client',
-  '//apps/netconf/storeadapter:onos-apps-netconf-storeadapter',
+  '//apps/netconfsb/client:onos-apps-netconfsb-client',
+  '//apps/netconfsb/storeadapter:onos-apps-netconfsb-storeadapter',
 ]
 
 onos_app (
-  app_name = 'org.onosproject.netconf',
+  app_name = 'org.onosproject.netconfsb',
   title = 'NETCONF Application Module',
   category = 'Utility',
   url = 'http://onosproject.org',
diff --git a/apps/netconf/client/BUCK b/apps/netconfsb/client/BUCK
similarity index 100%
rename from apps/netconf/client/BUCK
rename to apps/netconfsb/client/BUCK
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/NetconfTranslator.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/NetconfTranslatorImpl.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/impl/package-info.java
diff --git a/apps/netconf/client/src/main/java/org/onosproject/netconf/client/package-info.java b/apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/package-info.java
similarity index 100%
rename from apps/netconf/client/src/main/java/org/onosproject/netconf/client/package-info.java
rename to apps/netconfsb/client/src/main/java/org/onosproject/netconf/client/package-info.java
diff --git a/apps/netconf/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java b/apps/netconfsb/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
similarity index 100%
rename from apps/netconf/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
rename to apps/netconfsb/client/src/test/java/org/onosproject/netconf/client/NetconfTranslatorImplTest.java
diff --git a/apps/netconf/storeadapter/BUCK b/apps/netconfsb/storeadapter/BUCK
similarity index 69%
rename from apps/netconf/storeadapter/BUCK
rename to apps/netconfsb/storeadapter/BUCK
index 8787855..6444a6c 100644
--- a/apps/netconf/storeadapter/BUCK
+++ b/apps/netconfsb/storeadapter/BUCK
@@ -3,7 +3,10 @@
     '//lib:onos-yang-model',
     '//lib:onos-yang-runtime',
     '//apps/config:onos-apps-config',
-    '//apps/netconf/client:onos-apps-netconf-client'
+    '//protocols/netconf/api:onos-protocols-netconf-api',
+    '//apps/netconfsb/client:onos-apps-netconfsb-client'
+
+
 ]
 
 osgi_jar_with_tests (
@@ -11,12 +14,12 @@
 )
 
 BUNDLES = [
-  '//apps/netconf/client:onos-apps-netconf-client',
-  '//apps/netconf/storeadapter:onos-apps-netconf-storeadapter',
+  '//apps/netconfsb/client:onos-apps-netconfsb-client',
+  '//apps/netconfsb/storeadapter:onos-apps-netconfsb-storeadapter',
 ]
 
 onos_app (
-  app_name = 'org.onosproject.netconf',
+  app_name = 'org.onosproject.netconfsb',
   title = 'NETCONF Application Module',
   category = 'Utility',
   url = 'http://onosproject.org',
diff --git a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java b/apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
similarity index 66%
rename from apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
rename to apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
index e3c94c2..8d824f7 100644
--- a/apps/netconf/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfYangListener.java
+++ b/apps/netconfsb/storeadapter/src/main/java/org/onosproject/netconf/storeadapter/NetconfActiveComponent.java
@@ -32,7 +32,12 @@
 import org.onosproject.net.resource.Resource;
 import org.onosproject.netconf.client.NetconfTranslator;
 import org.onosproject.netconf.client.NetconfTranslator.OperationType;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfController;
+import java.net.URI;
+import java.net.URISyntaxException;
 import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.LeafNode;
 import org.onosproject.yang.model.ResourceId;
 import org.onosproject.yang.runtime.DefaultResourceData;
 import org.slf4j.Logger;
@@ -40,13 +45,14 @@
 
 import java.io.IOException;
 
+
 @Beta
 @Component(immediate = true)
-public class NetconfYangListener implements DynamicConfigListener {
+public class NetconfActiveComponent implements DynamicConfigListener {
 
-    private static final Logger log = LoggerFactory.getLogger(NetconfYangListener.class);
+    private static final Logger log = LoggerFactory.getLogger(NetconfActiveComponent.class);
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DynamicConfigService cfgServcie;
+    protected DynamicConfigService cfgService;
     public static final String DEVNMSPACE = "namespace1";
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -55,35 +61,51 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected MastershipService mastershipService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetconfController controller;
+
     private ResourceId resId = new ResourceId.Builder()
             .addBranchPointSchema("device", DEVNMSPACE )
             .build();
     @Activate
     protected void activate() {
-        cfgServcie.addListener(this);
+        cfgService.addListener(this);
         log.info("Started");
     }
 
     @Deactivate
     protected void deactivate() {
-        cfgServcie.removeListener(this);
+        cfgService.removeListener(this);
         log.info("Stopped");
     }
 
     @Override
     public boolean isRelevant(DynamicConfigEvent event) {
-        if (event.subject().equals(resId) &&
-                mastershipService.isLocalMaster(retrieveDeviceId(event.subject()))) {
-                return true;
-            } else {
+        if (event.subject().equals(resId)) {
+            return true;
+        } else {
             return false;
         }
     }
+
+    public boolean isMaster(DeviceId deviceId) {
+        if (mastershipService.isLocalMaster(deviceId)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     @Override
     public void event(DynamicConfigEvent event) {
         Filter filt = new Filter();
-        DataNode node = cfgServcie.readNode(event.subject(), filt);
-        DeviceId deviceId = retrieveDeviceId(event.subject());
+        DataNode node = cfgService.readNode(event.subject(), filt);
+        DeviceId deviceId = getDeviceId(node);
+        if (!isMaster(deviceId)) {
+            log.info("NetConfListener: not master, ignoring config for {}", event.type());
+            return;
+        }
+        initiateConnection(deviceId);
         switch (event.type()) {
             case NODE_ADDED:
             case NODE_UPDATED:
@@ -150,13 +172,46 @@
     }
 
     /**
-     * Takes a resourceId corresponding to the provided event and uses it to
-     * retrieve/generate a deviceId corresponding to the effected device.
-     * @param resourceId the resourceId associated with the event
+     * Retrieves device id from Data node.
+     *
+     * @param node the node associated with the event
      * @return the deviceId of the effected device
      */
-    private DeviceId retrieveDeviceId(ResourceId resourceId) {
-        /*TODO this requires a real implementation instead of a placeholder */
-        return DeviceId.NONE;
+    public DeviceId getDeviceId(DataNode node) {
+        String[] temp;
+        String ip, port;
+        if (node.type() == DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE) {
+            temp = ((LeafNode) node).asString().split("\\:");
+            if (temp.length != 3) {
+                throw new RuntimeException(new NetconfException("Invalid device id form, cannot apply"));
+            }
+            ip = temp[1];
+            port = temp[2];
+        } else {
+            throw new RuntimeException(new NetconfException("Invalid device id type, cannot apply"));
+        }
+        try {
+            return DeviceId.deviceId(new URI("netconf", ip + ":" + port, (String) null));
+        } catch (URISyntaxException var4) {
+            throw new IllegalArgumentException("Unable to build deviceID for device " + ip + ":" + port, var4);
+        }
+    }
+
+    /**
+     * Inititates a Netconf connection to the device.
+     *
+     * @param deviceId of the added device
+     */
+    private void initiateConnection(DeviceId deviceId) {
+        if (controller.getNetconfDevice(deviceId) == null) {
+            try {
+                //if (this.isReachable(deviceId)) {
+                    this.controller.connectDevice(deviceId);
+                //}
+            } catch (Exception ex) {
+                throw new RuntimeException(new NetconfException("Can\'t " +
+                        "connect to NETCONF device on " + deviceId + ":" + deviceId, ex));
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/apps/pom.xml b/apps/pom.xml
index ebd1d28..ac7b150 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -109,6 +109,16 @@
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.scr.annotations</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-config</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <build>