CORD-333 Minimized OVSDB provider dependency

With this patch, cordvtn doesn't need to care for OVSDB connection state
anymore. It will make a connection to OVSDB server like befor but just
for node init and disconnect the OVSDB right after init is done.
- Changed OvsdbNode to CordVtnNode
- Removed OVSDB connect/disconnect and added initNode instead
- Changed ovsdb* commands to cordvtn-node* command, and removed
  connect/disconnect command and added init instead
- Fixed to remove OVSDB device from the system after node init or before
  making a connection to work around OVSDB device re-connect issue

Change-Id: If69369a06526947122494b2f7e816e37aa931f2c
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeAddCommand.java
similarity index 63%
rename from apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java
rename to apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeAddCommand.java
index 88d1634..1b7d986 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeAddCommand.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeAddCommand.java
@@ -22,27 +22,26 @@
 import org.onlab.packet.TpPort;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.DefaultOvsdbNode;
-import org.onosproject.cordvtn.OvsdbNode;
+import org.onosproject.cordvtn.CordVtnNode;
 import org.onosproject.net.DeviceId;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
 /**
- * Adds a new OVSDB nodes.
+ * Adds a new node to the service.
  */
-@Command(scope = "onos", name = "ovsdb-add",
-        description = "Adds a new OVSDB node to cordvtn")
-public class OvsdbNodeAddCommand extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-node-add",
+        description = "Adds a new node to CORD VTN service")
+public class CordVtnNodeAddCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "host", description = "Hostname or IP",
+    @Argument(index = 0, name = "hostname", description = "Hostname",
             required = true, multiValued = false)
-    private String host = null;
+    private String hostname = null;
 
-    @Argument(index = 1, name = "address",
+    @Argument(index = 1, name = "ovsdb",
             description = "OVSDB server listening address (ip:port)",
             required = true, multiValued = false)
-    private String address = null;
+    private String ovsdb = null;
 
     @Argument(index = 2, name = "bridgeId",
             description = "Device ID of integration bridge",
@@ -51,15 +50,15 @@
 
     @Override
     protected void execute() {
-        checkArgument(address.contains(":"), "address should be ip:port format");
+        checkArgument(ovsdb.contains(":"), "OVSDB address should be ip:port format");
         checkArgument(bridgeId.startsWith("of:"), "bridgeId should be of:dpid format");
 
         CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
-        String[] ipPort = address.split(":");
-        OvsdbNode ovsdb = new DefaultOvsdbNode(host,
-                                               IpAddress.valueOf(ipPort[0]),
-                                               TpPort.tpPort(Integer.parseInt(ipPort[1])),
-                                               DeviceId.deviceId(bridgeId));
-        service.addNode(ovsdb);
+        String[] ipPort = ovsdb.split(":");
+        CordVtnNode node = new CordVtnNode(hostname,
+                                           IpAddress.valueOf(ipPort[0]),
+                                           TpPort.tpPort(Integer.parseInt(ipPort[1])),
+                                           DeviceId.deviceId(bridgeId));
+        service.addNode(node);
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeDeleteCommand.java
similarity index 64%
copy from apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java
copy to apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeDeleteCommand.java
index a500d0d..0446fc6 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeDeleteCommand.java
@@ -20,38 +20,38 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.OvsdbNode;
+import org.onosproject.cordvtn.CordVtnNode;
 
 import java.util.NoSuchElementException;
 
 /**
- * Deletes OVSDB nodes from cordvtn.
+ * Deletes nodes from the service.
  */
-@Command(scope = "onos", name = "ovsdb-delete",
-        description = "Deletes OVSDB nodes from cordvtn")
-public class OvsdbNodeDeleteCommand extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-node-delete",
+        description = "Deletes nodes from CORD VTN service")
+public class CordVtnNodeDeleteCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)",
+    @Argument(index = 0, name = "hostnames", description = "Hostname(s)",
             required = true, multiValued = true)
-    private String[] hosts = null;
+    private String[] hostnames = null;
 
     @Override
     protected void execute() {
         CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
 
-        for (String host : hosts) {
-            OvsdbNode ovsdb;
+        for (String hostname : hostnames) {
+            CordVtnNode node;
             try {
-                ovsdb = service.getNodes().stream()
-                        .filter(node -> node.host().equals(host))
+                node = service.getNodes()
+                        .stream()
+                        .filter(n -> n.hostname().equals(hostname))
                         .findFirst().get();
-
             } catch (NoSuchElementException e) {
-                print("Unable to find %s", host);
+                print("Unable to find %s", hostname);
                 continue;
             }
 
-            service.deleteNode(ovsdb);
+            service.deleteNode(node);
         }
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeInitCommand.java
similarity index 64%
rename from apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java
rename to apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeInitCommand.java
index a500d0d..dd77a9c 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDeleteCommand.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeInitCommand.java
@@ -20,38 +20,38 @@
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.OvsdbNode;
+import org.onosproject.cordvtn.CordVtnNode;
 
 import java.util.NoSuchElementException;
 
 /**
- * Deletes OVSDB nodes from cordvtn.
+ * Initializes nodes for CordVtn service.
  */
-@Command(scope = "onos", name = "ovsdb-delete",
-        description = "Deletes OVSDB nodes from cordvtn")
-public class OvsdbNodeDeleteCommand extends AbstractShellCommand {
+@Command(scope = "onos", name = "cordvtn-node-init",
+        description = "Initializes nodes for CORD VTN service")
+public class CordVtnNodeInitCommand extends AbstractShellCommand {
 
-    @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)",
+    @Argument(index = 0, name = "hostnames", description = "Hostname(s)",
             required = true, multiValued = true)
-    private String[] hosts = null;
+    private String[] hostnames = null;
 
     @Override
     protected void execute() {
         CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
 
-        for (String host : hosts) {
-            OvsdbNode ovsdb;
+        for (String hostname : hostnames) {
+            CordVtnNode node;
             try {
-                ovsdb = service.getNodes().stream()
-                        .filter(node -> node.host().equals(host))
+                node = service.getNodes()
+                        .stream()
+                        .filter(n -> n.hostname().equals(hostname))
                         .findFirst().get();
-
             } catch (NoSuchElementException e) {
-                print("Unable to find %s", host);
+                print("Unable to find %s", hostname);
                 continue;
             }
 
-            service.deleteNode(ovsdb);
+            service.initNode(node);
         }
     }
 }
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeListCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeListCommand.java
new file mode 100644
index 0000000..83e5859
--- /dev/null
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/CordVtnNodeListCommand.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.cordvtn.cli;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.cordvtn.CordVtnService;
+import org.onosproject.cordvtn.CordVtnNode;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Lists all nodes registered to the service.
+ */
+@Command(scope = "onos", name = "cordvtn-nodes",
+        description = "Lists all nodes registered in CORD VTN service")
+public class CordVtnNodeListCommand extends AbstractShellCommand {
+
+    @Override
+    protected void execute() {
+        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
+        List<CordVtnNode> nodes = service.getNodes();
+        Collections.sort(nodes, CordVtnNode.CORDVTN_NODE_COMPARATOR);
+
+        if (outputJson()) {
+            print("%s", json(service, nodes));
+        } else {
+            for (CordVtnNode node : nodes) {
+                print("hostname=%s, ovsdb=%s, br-int=%s, init=%s",
+                      node.hostname(),
+                      node.ovsdbIp().toString() + ":" + node.ovsdbPort().toString(),
+                      node.intBrId().toString(),
+                      getState(service, node));
+            }
+            print("Total %s nodes", service.getNodeCount());
+        }
+    }
+
+    private JsonNode json(CordVtnService service, List<CordVtnNode> nodes) {
+        ObjectMapper mapper = new ObjectMapper();
+        ArrayNode result = mapper.createArrayNode();
+        for (CordVtnNode node : nodes) {
+            String ipPort = node.ovsdbIp().toString() + ":" + node.ovsdbPort().toString();
+            result.add(mapper.createObjectNode()
+                               .put("hostname", node.hostname())
+                               .put("ovsdb", ipPort)
+                               .put("brInt", node.intBrId().toString())
+                               .put("init", getState(service, node)));
+        }
+        return result;
+    }
+
+    private String getState(CordVtnService service, CordVtnNode node) {
+        return service.getNodeInitState(node) ? "COMPLETE" : "INCOMPLETE";
+    }
+}
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java
deleted file mode 100644
index e4ca0f3..0000000
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeConnectCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.cordvtn.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.OvsdbNode;
-
-import java.util.NoSuchElementException;
-
-/**
- * Connects to OVSDBs.
- */
-@Command(scope = "onos", name = "ovsdb-connect",
-        description = "Connects to OVSDBs")
-public class OvsdbNodeConnectCommand extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)",
-            required = true, multiValued = true)
-    private String[] hosts = null;
-
-    @Override
-    protected void execute() {
-        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
-
-        for (String host : hosts) {
-            OvsdbNode ovsdb;
-            try {
-                ovsdb = service.getNodes().stream()
-                        .filter(node -> node.host().equals(host))
-                        .findFirst().get();
-            } catch (NoSuchElementException e) {
-                print("Unable to find %s", host);
-                continue;
-            }
-
-            if (service.isNodeConnected(ovsdb)) {
-                print("OVSDB %s is already in connected state, do nothing", host);
-            } else {
-                service.connect(ovsdb);
-            }
-        }
-    }
-}
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java
deleted file mode 100644
index 14e44e0..0000000
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeDisconnectCommand.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.cordvtn.cli;
-
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.OvsdbNode;
-
-import java.util.NoSuchElementException;
-
-/**
- * Disconnects OVSDBs.
- */
-@Command(scope = "onos", name = "ovsdb-disconnect",
-        description = "Disconnects OVSDBs")
-public class OvsdbNodeDisconnectCommand extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "hosts", description = "Hostname(s) or IP(s)",
-            required = true, multiValued = true)
-    private String[] hosts = null;
-
-    @Override
-    protected void execute() {
-        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
-
-        for (String host : hosts) {
-            OvsdbNode ovsdb;
-            try {
-                ovsdb = service.getNodes().stream()
-                        .filter(node -> node.host().equals(host))
-                        .findFirst().get();
-            } catch (NoSuchElementException e) {
-                print("Unable to find %s", host);
-                continue;
-            }
-
-            if (!service.isNodeConnected(ovsdb)) {
-                print("OVSDB %s is already in disconnected state, do nothing", host);
-            } else {
-                service.disconnect(ovsdb);
-            }
-        }
-    }
-}
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java
deleted file mode 100644
index 7d125ca..0000000
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/cli/OvsdbNodeListCommand.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2015 Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onosproject.cordvtn.cli;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.cordvtn.CordVtnService;
-import org.onosproject.cordvtn.OvsdbNode;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Lists all OVSDB nodes.
- */
-@Command(scope = "onos", name = "ovsdbs",
-        description = "Lists all OVSDB nodes registered in cordvtn application")
-public class OvsdbNodeListCommand extends AbstractShellCommand {
-
-    @Override
-    protected void execute() {
-        CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
-        List<OvsdbNode> ovsdbs = service.getNodes();
-        Collections.sort(ovsdbs, OvsdbNode.OVSDB_NODE_COMPARATOR);
-
-        if (outputJson()) {
-            print("%s", json(service, ovsdbs));
-        } else {
-            for (OvsdbNode ovsdb : ovsdbs) {
-                print("host=%s, address=%s, br-int=%s, state=%s",
-                      ovsdb.host(),
-                      ovsdb.ip().toString() + ":" + ovsdb.port().toString(),
-                      ovsdb.intBrId().toString(),
-                      getState(service, ovsdb));
-            }
-            print("Total %s nodes", service.getNodeCount());
-        }
-    }
-
-    private JsonNode json(CordVtnService service, List<OvsdbNode> ovsdbs) {
-        ObjectMapper mapper = new ObjectMapper();
-        ArrayNode result = mapper.createArrayNode();
-        for (OvsdbNode ovsdb : ovsdbs) {
-            String ipPort = ovsdb.ip().toString() + ":" + ovsdb.port().toString();
-            result.add(mapper.createObjectNode()
-                               .put("host", ovsdb.host())
-                               .put("address", ipPort)
-                               .put("brInt", ovsdb.intBrId().toString())
-                               .put("state", getState(service, ovsdb)));
-        }
-        return result;
-    }
-
-    private String getState(CordVtnService service, OvsdbNode ovsdb) {
-        return service.isNodeConnected(ovsdb) ? "CONNECTED" : "DISCONNECTED";
-    }
-}