Fix: initialize the compute node before initialize the gateway node

Change-Id: Ib37e7e1d9d2a300aad876d1718d63d7499fc2c69
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
index 350655f..214cfe7 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackSyncRulesCommand.java
@@ -21,9 +21,10 @@
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeAdminService;
-import org.onosproject.openstacknode.api.OpenstackNodeService;
 
 import static java.lang.Thread.sleep;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * Re-installs flow rules for OpenStack networking.
@@ -39,28 +40,37 @@
     protected void doExecute() {
         // All handlers in this application reacts the node complete event and
         // tries to re-configure flow rules for the complete node.
-        OpenstackNodeService osNodeService = AbstractShellCommand.get(OpenstackNodeService.class);
-        OpenstackNodeAdminService osNodeAdminService = AbstractShellCommand.get(OpenstackNodeAdminService.class);
+        OpenstackNodeAdminService osNodeService = AbstractShellCommand.get(OpenstackNodeAdminService.class);
         if (osNodeService == null) {
             error("Failed to re-install flow rules for OpenStack networking.");
             return;
         }
-        osNodeService.completeNodes().forEach(osNode -> {
-            OpenstackNode updated = osNode.updateState(NodeState.INIT);
-            osNodeAdminService.updateNode(updated);
 
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
+        // we first initialize the COMPUTE node, in order to feed all instance ports
+        // by referring to ports' information obtained from neutron server
+        osNodeService.completeNodes(COMPUTE).forEach(osNode ->
+                syncRulesBaseForNode(osNodeService, osNode));
+        osNodeService.completeNodes(GATEWAY).forEach(osNode ->
+                syncRulesBaseForNode(osNodeService, osNode));
 
-            if (osNodeService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
-                print("Finished sync rules for node %s", osNode.hostname());
-            } else {
-                error("Failed to sync rules for node %s", osNode.hostname());
-            }
-        });
         print("Successfully requested re-installing flow rules.");
     }
+
+    private void syncRulesBaseForNode(OpenstackNodeAdminService osNodeService,
+                                      OpenstackNode osNode) {
+        OpenstackNode updated = osNode.updateState(NodeState.INIT);
+        osNodeService.updateNode(updated);
+
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during node synchronization...");
+        }
+
+        if (osNodeService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
+            print("Finished sync rules for node %s", osNode.hostname());
+        } else {
+            error("Failed to sync rules for node %s", osNode.hostname());
+        }
+    }
 }
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
index 8b335e6..94470eb 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackManagementWebResource.java
@@ -54,8 +54,13 @@
 
 import static java.lang.Thread.sleep;
 import static org.onlab.util.Tools.nullIsIllegal;
-import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.*;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkActivationFlag;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.CONTROLLER;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
 
 /**
  * REST interface for synchronizing openstack network states and rules.
@@ -317,22 +322,27 @@
     }
 
     private void syncRulesBase() {
-        osNodeAdminService.completeNodes().forEach(osNode -> {
-            OpenstackNode updated = osNode.updateState(NodeState.INIT);
-            osNodeAdminService.updateNode(updated);
+        // we first initialize the COMPUTE node, in order to feed all instance ports
+        // by referring to ports' information obtained from neutron server
+        osNodeAdminService.completeNodes(COMPUTE).forEach(this::syncRulesBaseForNode);
+        osNodeAdminService.completeNodes(GATEWAY).forEach(this::syncRulesBaseForNode);
+    }
 
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
+    private void syncRulesBaseForNode(OpenstackNode osNode) {
+        OpenstackNode updated = osNode.updateState(NodeState.INIT);
+        osNodeAdminService.updateNode(updated);
 
-            if (osNodeAdminService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
-                log.info("Finished sync rules for node {}", osNode.hostname());
-            } else {
-                log.info("Failed to sync rules for node {}", osNode.hostname());
-            }
-        });
+        try {
+            sleep(SLEEP_MS);
+        } catch (InterruptedException e) {
+            log.error("Exception caused during node synchronization...");
+        }
+
+        if (osNodeAdminService.node(osNode.hostname()).state() == NodeState.COMPLETE) {
+            log.info("Finished sync rules for node {}", osNode.hostname());
+        } else {
+            log.info("Failed to sync rules for node {}", osNode.hostname());
+        }
     }
 
     private void purgeRulesBase() {