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