Simplified the port handling logic for VM live migration case

Change-Id: Ib28978bb2ee62c4719261c38eebb72a006f81f19
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
index b1addf0..0a53885 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/DefaultInstancePort.java
@@ -45,24 +45,30 @@
     private final MacAddress macAddress;
     private final IpAddress ipAddress;
     private final DeviceId deviceId;
+    private final DeviceId oldDeviceId;
     private final PortNumber portNumber;
+    private final PortNumber oldPortNumber;
     private final State state;
 
     // private constructor not intended for invoked from external
     private DefaultInstancePort(String networkId, String portId,
                                 MacAddress macAddress, IpAddress ipAddress,
-                                DeviceId deviceId, PortNumber portNumber,
+                                DeviceId deviceId, DeviceId oldDeviceId,
+                                PortNumber portNumber, PortNumber oldPortNumber,
                                 State state) {
         this.networkId = networkId;
         this.portId = portId;
         this.macAddress = macAddress;
         this.ipAddress = ipAddress;
         this.deviceId = deviceId;
+        this.oldDeviceId = oldDeviceId;
         this.portNumber = portNumber;
+        this.oldPortNumber = oldPortNumber;
         this.state = state;
     }
 
-    private DefaultInstancePort(Host host, State state) {
+    private DefaultInstancePort(Host host, State state,
+                                DeviceId oldDeviceId, PortNumber oldPortNumber) {
         this.networkId = host.annotations().value(ANNOTATION_NETWORK_ID);
         this.portId = host.annotations().value(ANNOTATION_PORT_ID);
         this.macAddress = host.mac();
@@ -72,6 +78,8 @@
         this.deviceId = host.location().deviceId();
         this.portNumber = host.location().port();
         this.state = state;
+        this.oldDeviceId = oldDeviceId;
+        this.oldPortNumber = oldPortNumber;
     }
 
     public static DefaultInstancePort from(Host host, State state) {
@@ -83,7 +91,22 @@
         checkArgument(!Strings.isNullOrEmpty(
                                 host.annotations().value(ANNOTATION_CREATE_TIME)));
 
-        return new DefaultInstancePort(host, state);
+        return new DefaultInstancePort(host, state, null, null);
+    }
+
+    public static DefaultInstancePort from(Host host,
+                                           State state,
+                                           DeviceId oldDeviceId,
+                                           PortNumber oldPortNumber) {
+        checkNotNull(host);
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_NETWORK_ID)));
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_PORT_ID)));
+        checkArgument(!Strings.isNullOrEmpty(
+                host.annotations().value(ANNOTATION_CREATE_TIME)));
+
+        return new DefaultInstancePort(host, state, oldDeviceId, oldPortNumber);
     }
 
     @Override
@@ -112,15 +135,34 @@
     }
 
     @Override
+    public DeviceId oldDeviceId() {
+        return oldDeviceId;
+    }
+
+    @Override
     public PortNumber portNumber() {
         return portNumber;
     }
 
     @Override
+    public PortNumber oldPortNumber() {
+        return oldPortNumber;
+    }
+
+    @Override
     public State state() {
         return state;
     }
 
+    /**
+     * Obtains an instance port builder.
+     *
+     * @return instance port builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
     @Override
     public InstancePort updateState(State newState) {
         return new Builder()
@@ -129,12 +171,30 @@
                 .macAddress(macAddress)
                 .ipAddress(ipAddress)
                 .deviceId(deviceId)
+                .oldDeviceId(oldDeviceId)
                 .portNumber(portNumber)
+                .oldPortNumber(oldPortNumber)
                 .state(newState)
                 .build();
     }
 
     @Override
+    public InstancePort updatePrevData(DeviceId oldDeviceId,
+                                       PortNumber oldPortNumber) {
+        return new Builder()
+                .networkId(networkId)
+                .portId(portId)
+                .macAddress(macAddress)
+                .ipAddress(ipAddress)
+                .deviceId(deviceId)
+                .oldDeviceId(oldDeviceId)
+                .portNumber(portNumber)
+                .oldPortNumber(oldPortNumber)
+                .state(state)
+                .build();
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .add("networkId", networkId)
@@ -142,7 +202,9 @@
                 .add("macAddress", macAddress)
                 .add("ipAddress", ipAddress)
                 .add("deviceId", deviceId)
+                .add("oldDeviceId", oldDeviceId)
                 .add("portNumber", portNumber)
+                .add("oldPortNumber", oldPortNumber)
                 .add("state", state)
                 .toString();
     }
@@ -159,7 +221,9 @@
                     Objects.equals(macAddress, that.macAddress) &&
                     Objects.equals(ipAddress, that.ipAddress) &&
                     Objects.equals(deviceId, that.deviceId) &&
+                    Objects.equals(oldDeviceId, that.oldDeviceId) &&
                     Objects.equals(portNumber, that.portNumber) &&
+                    Objects.equals(oldPortNumber, that.oldPortNumber) &&
                     Objects.equals(state, that.state);
         }
         return false;
@@ -172,7 +236,9 @@
                 macAddress,
                 ipAddress,
                 deviceId,
+                oldDeviceId,
                 portNumber,
+                oldPortNumber,
                 state);
     }
 
@@ -186,7 +252,9 @@
         private MacAddress macAddress;
         private IpAddress ipAddress;
         private DeviceId deviceId;
+        private DeviceId oldDeviceId;
         private PortNumber portNumber;
+        private PortNumber oldPortNumber;
         private State state;
 
         // private constructor not intended to use from external
@@ -209,7 +277,9 @@
                     macAddress,
                     ipAddress,
                     deviceId,
+                    oldDeviceId,
                     portNumber,
+                    oldPortNumber,
                     state);
         }
 
@@ -244,12 +314,24 @@
         }
 
         @Override
+        public InstancePort.Builder oldDeviceId(DeviceId oldDeviceId) {
+            this.oldDeviceId = oldDeviceId;
+            return this;
+        }
+
+        @Override
         public InstancePort.Builder portNumber(PortNumber portNumber) {
             this.portNumber = portNumber;
             return this;
         }
 
         @Override
+        public InstancePort.Builder oldPortNumber(PortNumber oldPortNumber) {
+            this.oldPortNumber = oldPortNumber;
+            return this;
+        }
+
+        @Override
         public InstancePort.Builder state(State state) {
             this.state = state;
             return this;