Support VM resize and cold migration in openstack networking app
Change-Id: I46ecae7a1eb2bfe9a4093be6893e65db485b7f58
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
index b313cce..e9d2b2f 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DistributedInstancePortStore.java
@@ -190,7 +190,7 @@
InstancePort.State oldState = event.oldValue().value().state();
InstancePort.State newState = event.newValue().value().state();
- if (oldState == ACTIVE && newState == MIGRATING) {
+ if ((oldState == ACTIVE || oldState == INACTIVE) && newState == MIGRATING) {
notifyDelegate(new InstancePortEvent(
OPENSTACK_INSTANCE_MIGRATION_STARTED,
event.newValue().value()));
@@ -227,8 +227,6 @@
notifyDelegate(new InstancePortEvent(
OPENSTACK_INSTANCE_PORT_UPDATED,
event.newValue().value()));
-
- // TODO: need to handle cold migration
}
}
}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
index 2383e62..0935f53 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/InstancePortManager.java
@@ -246,15 +246,34 @@
// first time to add instance
createInstancePort(instPort);
} else {
- // the instance was restarted
if (existingPort.state() == INACTIVE) {
- updateInstancePort(instPort);
+
+ if (instPort.deviceId().equals(existingPort.deviceId())) {
+
+ // VM RESTART case
+ // if the ID of switch where VM is attached to is
+ // identical, we can assume that the VM was
+ // restarted in the same location;
+ // note that the switch port number where VM is
+ // attached can be varied per each restart
+ updateInstancePort(instPort);
+ } else {
+
+ // VM COLD MIGRATION case
+ // if the ID of switch where VM is attached to is
+ // varied, we can assume that the VM was migrated
+ // to a new location
+ updateInstancePort(instPort.updateState(MIGRATING));
+ InstancePort updated = instPort.updateState(MIGRATED);
+ updateInstancePort(updated.updatePrevLocation(
+ existingPort.deviceId(), existingPort.portNumber()));
+ }
}
}
break;
case HOST_REMOVED:
// we will remove instance port from persistent store,
- // only if we receive port removal signal from neutron
+ // only if we receive port removal signal from neutron.
// by default, we update the instance port state to INACTIVE
// to indicate the instance is terminated
updateInstancePort(instPort.updateState(INACTIVE));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
index de9da5d..b19d78d 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHostProvider.java
@@ -197,7 +197,7 @@
long createTime = System.currentTimeMillis();
- // we check whether the host already attached to some locations
+ // we check whether the host already attached to same locations
Host host = hostService.getHost(hostId);
// build host annotations to include a set of meta info from neutron
@@ -206,7 +206,7 @@
.set(ANNOTATION_PORT_ID, osPort.getId())
.set(ANNOTATION_CREATE_TIME, String.valueOf(createTime));
- // FLAT does not require segment ID
+ // FLAT typed network does not require segment ID
if (osNet.getNetworkType() != NetworkType.FLAT) {
annotations.set(ANNOTATION_SEGMENT_ID, osNet.getProviderSegID());
}