ONOS-6742 Refactored OpenstackNode

- Removed gateway node uplink interface configuration steps
- Added checking group states
- Refactored interface, store, manager and handler

Change-Id: I9149edbec6481b15377848c8f24bdc5c6c73adc4
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
index 4d54abd..a35ab1b 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeCheckCommand.java
@@ -25,14 +25,14 @@
 import org.onosproject.net.behaviour.BridgeConfig;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.PortDescription;
-import org.onosproject.openstacknode.OpenstackNode;
-import org.onosproject.openstacknode.OpenstackNodeService;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 import java.util.Optional;
 
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
-import static org.onosproject.openstacknode.Constants.*;
-import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWAY;
+import static org.onosproject.openstacknode.api.Constants.*;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * Checks detailed node init state.
@@ -50,22 +50,17 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
         DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
 
-        OpenstackNode node = nodeService.nodes()
-                .stream()
-                .filter(n -> n.hostname().equals(hostname))
-                .findFirst()
-                .orElse(null);
-
-        if (node == null) {
-            print("Cannot find %s from registered nodes", hostname);
+        OpenstackNode osNode = osNodeService.node(hostname);
+        if (osNode == null) {
+            error("Cannot find %s from registered nodes", hostname);
             return;
         }
 
         print("[Integration Bridge Status]");
-        Device device = deviceService.getDevice(node.intBridge());
+        Device device = deviceService.getDevice(osNode.intgBridge());
         if (device != null) {
             print("%s %s=%s available=%s %s",
                     deviceService.isAvailable(device.id()) ? MSG_OK : MSG_NO,
@@ -73,41 +68,39 @@
                     device.id(),
                     deviceService.isAvailable(device.id()),
                     device.annotations());
-
-            node.dataIp().ifPresent(ip -> print(getPortState(deviceService, node.intBridge(), DEFAULT_TUNNEL)));
-            node.vlanPort().ifPresent(p -> print(getPortState(deviceService, node.intBridge(), p)));
+            if (osNode.dataIp() != null) {
+                print(getPortState(deviceService, osNode.intgBridge(), DEFAULT_TUNNEL));
+            }
+            if (osNode.vlanIntf() != null) {
+                print(getPortState(deviceService, osNode.intgBridge(), osNode.vlanIntf()));
+            }
         } else {
             print("%s %s=%s is not available",
                     MSG_NO,
                     INTEGRATION_BRIDGE,
-                    node.intBridge());
+                    osNode.intgBridge());
         }
 
-        if (node.type().equals(GATEWAY)) {
-            print(getPortState(deviceService, node.intBridge(), PATCH_INTG_BRIDGE));
+        if (osNode.type() == GATEWAY) {
+            print(getPortState(deviceService, osNode.intgBridge(), PATCH_INTG_BRIDGE));
 
             print("%n[Router Bridge Status]");
-            device = deviceService.getDevice(node.ovsdbId());
+            device = deviceService.getDevice(osNode.ovsdb());
             if (device == null || !device.is(BridgeConfig.class)) {
                 print("%s %s=%s is not available(unable to connect OVSDB)",
                       MSG_NO,
                       ROUTER_BRIDGE,
-                      node.intBridge());
+                      osNode.intgBridge());
             } else {
                 BridgeConfig bridgeConfig = device.as(BridgeConfig.class);
                 boolean available = bridgeConfig.getBridges().stream()
-                        .filter(bridge -> bridge.name().equals(ROUTER_BRIDGE))
-                        .findAny()
-                        .isPresent();
-
+                        .anyMatch(bridge -> bridge.name().equals(ROUTER_BRIDGE));
                 print("%s %s=%s available=%s",
                       available ? MSG_OK : MSG_NO,
                       ROUTER_BRIDGE,
-                      node.routerBridge().get(),
+                      osNode.routerBridge(),
                       available);
-
-                print(getPortStateOvsdb(deviceService, node.ovsdbId(), PATCH_ROUT_BRIDGE));
-                print(getPortStateOvsdb(deviceService, node.ovsdbId(), node.uplink().get()));
+                print(getPortStateOvsdb(deviceService, osNode.ovsdb(), PATCH_ROUT_BRIDGE));
             }
         }
     }
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
index 8f4dbb1..85da391 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeInitCommand.java
@@ -19,10 +19,10 @@
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.openstacknode.OpenstackNode;
-import org.onosproject.openstacknode.OpenstackNodeService;
-
-import java.util.NoSuchElementException;
+import org.onosproject.openstacknode.api.NodeState;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 /**
  * Initializes nodes for OpenStack node service.
@@ -37,21 +37,19 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeService osNodeService =
+                AbstractShellCommand.get(OpenstackNodeService.class);
+        OpenstackNodeAdminService osNodeAdminService =
+                AbstractShellCommand.get(OpenstackNodeAdminService.class);
 
         for (String hostname : hostnames) {
-            OpenstackNode node;
-            try {
-                node = nodeService.nodes()
-                        .stream()
-                        .filter(n -> n.hostname().equals(hostname))
-                        .findFirst().get();
-            } catch (NoSuchElementException e) {
+            OpenstackNode osNode = osNodeService.node(hostname);
+            if (osNode == null) {
                 print("Unable to find %s", hostname);
                 continue;
             }
-
-            nodeService.addOrUpdateNode(node);
+            OpenstackNode updated = osNode.updateState(NodeState.INIT);
+            osNodeAdminService.updateNode(updated);
         }
     }
 }
diff --git a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
index 65a77e6..ceed2a7 100644
--- a/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
+++ b/apps/openstacknode/src/main/java/org/onosproject/openstacknode/cli/OpenstackNodeListCommand.java
@@ -19,11 +19,13 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.collect.Lists;
 import org.apache.karaf.shell.commands.Command;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.openstacknode.OpenstackNode;
-import org.onosproject.openstacknode.OpenstackNodeService;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
 
+import java.util.Comparator;
 import java.util.List;
 
 /**
@@ -37,43 +39,45 @@
 
     @Override
     protected void execute() {
-        OpenstackNodeService nodeService = AbstractShellCommand.get(OpenstackNodeService.class);
-        List<OpenstackNode> nodes = nodeService.nodes();
-        nodes.sort(OpenstackNode.OPENSTACK_NODE_COMPARATOR);
+        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
+        List<OpenstackNode> osNodes = Lists.newArrayList(osNodeService.nodes());
+        osNodes.sort(Comparator.comparing(OpenstackNode::hostname));
 
         if (outputJson()) {
-            print("%s", json(nodes));
+            print("%s", json(osNodes));
         } else {
             print(FORMAT, "Hostname", "Type", "Integration Bridge", "Router Bridge",
                     "Management IP", "Data IP", "VLAN Intf", "State");
-            for (OpenstackNode node : nodes) {
+            for (OpenstackNode osNode : osNodes) {
                 print(FORMAT,
-                        node.hostname(),
-                        node.type(),
-                        node.intBridge(),
-                        node.routerBridge().isPresent() ? node.routerBridge().get() : "",
-                        node.managementIp(),
-                        node.dataIp().isPresent() ? node.dataIp().get() : "",
-                        node.vlanPort().isPresent() ? node.vlanPort().get() : "",
-                        node.state());
+                        osNode.hostname(),
+                        osNode.type(),
+                        osNode.intgBridge(),
+                        osNode.routerBridge() != null ? osNode.routerBridge() : "",
+                        osNode.managementIp(),
+                        osNode.dataIp() != null ? osNode.dataIp() : "",
+                        osNode.vlanIntf() != null ? osNode.vlanIntf() : "",
+                        osNode.state());
             }
-            print("Total %s nodes", nodeService.nodes().size());
+            print("Total %s nodes", osNodeService.nodes().size());
         }
     }
 
-    private JsonNode json(List<OpenstackNode> nodes) {
+    private JsonNode json(List<OpenstackNode> osNodes) {
         ObjectMapper mapper = new ObjectMapper();
         ArrayNode result = mapper.createArrayNode();
-        for (OpenstackNode node : nodes) {
+        for (OpenstackNode osNode : osNodes) {
             result.add(mapper.createObjectNode()
-                    .put("hostname", node.hostname())
-                    .put("type", node.type().name())
-                    .put("intBridge", node.intBridge().toString())
-                    .put("routerBridge", node.routerBridge().toString())
-                    .put("managementIp", node.managementIp().toString())
-                    .put("dataIp", node.dataIp().toString())
-                    .put("vlanPort", node.vlanPort().toString())
-                    .put("state", node.state().name()));
+                    .put("hostname", osNode.hostname())
+                    .put("type", osNode.type().name())
+                    .put("integrationBridge", osNode.intgBridge().toString())
+                    .put("routerBridge", osNode.routerBridge().toString())
+                    .put("managementIp", osNode.managementIp().toString())
+                    .put("dataIp", osNode.dataIp().toString())
+                    .put("vlanIntf", osNode.vlanIntf())
+                    .put("tunnelPortNum", osNode.tunnelPortNum().toString())
+                    .put("vlanPortNum", osNode.vlanPortNum().toString())
+                    .put("state", osNode.state().name()));
         }
         return result;
     }