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/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() {