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());
         }