[ONOS-7684] Support VM Live Migration (FLAT)

Change-Id: I991e82db6439a271dcef723e098318c5d150a87a
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
index aab3780..5dc3f9b 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingHandler.java
@@ -144,7 +144,7 @@
         switch (type) {
             case VXLAN:
                 setTunnelTagFlowRules(instPort, install);
-                setForwardingRules(instPort, install);
+                setForwardingRulesForVxlan(instPort, install);
                 break;
             case VLAN:
                 setVlanTagFlowRules(instPort, install);
@@ -152,8 +152,8 @@
                 break;
             case FLAT:
                 setFlatJumpRules(instPort, install);
-                setDownstreamRules(instPort, install);
-                setUpstreamRules(instPort, install);
+                setDownstreamRulesForFlat(instPort, install);
+                setUpstreamRulesForFlat(instPort, install);
                 break;
             default:
                 log.warn("Unsupported network tunnel type {}", type.name());
@@ -176,8 +176,12 @@
             case VLAN:
                 setVlanTagFlowRules(instPort, false);
                 break;
+            case FLAT:
+                setFlatJumpRules(instPort, false);
+                setUpstreamRulesForFlat(instPort, false);
+                setDownstreamRulesForFlat(instPort, false);
             default:
-                log.warn("Unsupported network tunnel type {}", type.name());
+                log.warn("Unsupported network type {}", type.name());
                 break;
         }
     }
@@ -241,7 +245,7 @@
                 install);
     }
 
-    private void setDownstreamRules(InstancePort instPort, boolean install) {
+    private void setDownstreamRulesForFlat(InstancePort instPort, boolean install) {
         TrafficSelector selector = DefaultTrafficSelector.builder()
                 .matchEthType(Ethernet.TYPE_IPV4)
                 .matchIPDst(instPort.ipAddress().toIpPrefix())
@@ -274,7 +278,7 @@
                 install);
     }
 
-    private void setUpstreamRules(InstancePort instPort, boolean install) {
+    private void setUpstreamRulesForFlat(InstancePort instPort, boolean install) {
         TrafficSelector selector = DefaultTrafficSelector.builder()
                 .matchInPort(instPort.portNumber())
                 .build();
@@ -316,7 +320,7 @@
      * @param instPort instance port object
      * @param install install flag, add the rule if true, remove it otherwise
      */
-    private void setForwardingRules(InstancePort instPort, boolean install) {
+    private void setForwardingRulesForVxlan(InstancePort instPort, boolean install) {
         // switching rules for the instPorts in the same node
         TrafficSelector selector = DefaultTrafficSelector.builder()
                 // TODO: need to handle IPv6 in near future
@@ -600,31 +604,41 @@
         @Override
         public void event(InstancePortEvent event) {
             InstancePort instPort = event.subject();
+
             switch (event.type()) {
                 case OPENSTACK_INSTANCE_PORT_UPDATED:
                 case OPENSTACK_INSTANCE_PORT_DETECTED:
-                    eventExecutor.execute(() -> {
-                        log.info("Instance port detected MAC:{} IP:{}",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
-                        instPortDetected(event.subject());
-                    });
+                    log.info("Instance port detected MAC:{} IP:{}",
+                                                        instPort.macAddress(),
+                                                        instPort.ipAddress());
+                    eventExecutor.execute(() ->
+                        instPortDetected(instPort)
+                    );
+
                     break;
                 case OPENSTACK_INSTANCE_PORT_VANISHED:
-                    eventExecutor.execute(() -> {
-                        log.info("Instance port vanished MAC:{} IP:{}",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
-                        instPortRemoved(event.subject());
-                    });
+                    log.info("Instance port vanished MAC:{} IP:{}",
+                                                        instPort.macAddress(),
+                                                        instPort.ipAddress());
+                    eventExecutor.execute(() ->
+                        instPortRemoved(instPort)
+                    );
+
                     break;
+
+                // we do not consider MIGRATION_STARTED case, because the rules
+                // will be installed to corresponding switches at
+                // OPENSTACK_INSTANCE_PORT_UPDATED phase
+
+                // TODO: we may need to consider to refactor the VM migration
+                // event detection logic for better code readability
                 case OPENSTACK_INSTANCE_MIGRATION_ENDED:
-                    eventExecutor.execute(() -> {
-                        log.info("Instance port vanished MAC:{} IP:{}, due to VM migration",
-                                instPort.macAddress(),
-                                instPort.ipAddress());
-                        removeVportRules(event.subject());
-                    });
+                    log.info("Instance port vanished MAC:{} IP:{}, " +
+                                 "due to VM migration", instPort.macAddress(),
+                                                        instPort.ipAddress());
+                    eventExecutor.execute(() ->
+                        removeVportRules(instPort)
+                    );
                     break;
                 default:
                     break;