Fix: do not (dis)associate fip if the inst port is not available

Change-Id: I5c6db075f1a4c6653f45b6bea3c772dfa6392994
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index dc83d98..39975dc 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -527,16 +527,26 @@
                     );
                     break;
                 case OPENSTACK_FLOATING_IP_ASSOCIATED:
-                    eventExecutor.execute(() ->
-                        // associate a floating IP with an existing VM
-                        setFloatingIpArpRule(event.floatingIp(), completedGws, true)
-                    );
+                    eventExecutor.execute(() -> {
+                        NetFloatingIP osFip = event.floatingIp();
+
+                        if (!Strings.isNullOrEmpty(osFip.getPortId()) &&
+                                instancePortService.instancePort(osFip.getPortId()) != null) {
+                            // associate a floating IP with an existing VM
+                            setFloatingIpArpRule(event.floatingIp(), completedGws, true);
+                        }
+                    });
                     break;
                 case OPENSTACK_FLOATING_IP_DISASSOCIATED:
-                    eventExecutor.execute(() ->
-                        // disassociate a floating IP with the existing VM
-                        setFloatingIpArpRule(event.floatingIp(), completedGws, false)
-                    );
+                    eventExecutor.execute(() -> {
+                        NetFloatingIP osFip = event.floatingIp();
+
+                        if (!Strings.isNullOrEmpty(osFip.getPortId()) &&
+                                instancePortService.instancePort(osFip.getPortId()) != null) {
+                            // associate a floating IP with an existing VM
+                            setFloatingIpArpRule(event.floatingIp(), completedGws, false);
+                        }
+                    });
                     break;
                 case OPENSTACK_FLOATING_IP_CREATED:
                     eventExecutor.execute(() -> {
@@ -545,7 +555,8 @@
                         // during floating IP creation, if the floating IP is
                         // associated with any port of VM, then we will set
                         // floating IP related ARP rules to gateway node
-                        if (!Strings.isNullOrEmpty(osFip.getPortId())) {
+                        if (!Strings.isNullOrEmpty(osFip.getPortId()) &&
+                                instancePortService.instancePort(osFip.getPortId()) != null) {
                             setFloatingIpArpRule(osFip, completedGws, true);
                         }
                     });
@@ -557,7 +568,8 @@
                         // during floating IP deletion, if the floating IP is
                         // still associated with any port of VM, then we will
                         // remove floating IP related ARP rules from gateway node
-                        if (!Strings.isNullOrEmpty(osFip.getPortId())) {
+                        if (!Strings.isNullOrEmpty(osFip.getPortId()) &&
+                                instancePortService.instancePort(osFip.getPortId()) != null) {
                             setFloatingIpArpRule(event.floatingIp(), completedGws, false);
                         }
                     });
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index 578e7e4..172dd78 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -92,6 +92,7 @@
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
+import static org.openstack4j.model.network.NetworkType.FLAT;
 
 /**
  * Handles OpenStack floating IP events.
@@ -681,7 +682,11 @@
                     eventExecutor.execute(() -> {
                         NetFloatingIP osFip = event.floatingIp();
                         if (!Strings.isNullOrEmpty(osFip.getPortId())) {
-                            disassociateFloatingIp(osFip, osFip.getPortId());
+                            // in case the floating IP is not associated with any port due to
+                            // port removal, we simply do not execute floating IP disassociation
+                            if (osNetworkService.port(osFip.getPortId()) != null) {
+                                disassociateFloatingIp(osFip, osFip.getPortId());
+                            }
                         }
                         log.info("Removed floating IP {}", osFip.getFloatingIpAddress());
                     });
@@ -939,7 +944,8 @@
         public boolean isRelevant(OpenstackNetworkEvent event) {
             // do not allow to proceed without leadership
             NodeId leader = leadershipService.getLeader(appId.name());
-            return Objects.equals(localNodeId, leader);
+            return Objects.equals(localNodeId, leader) &&
+                    event.subject().getNetworkType() != FLAT;
         }
 
         @Override
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
index e5ecd1c..9a7d488 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingHandler.java
@@ -97,6 +97,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_SWITCHING_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.ROUTING_TABLE;
 import static org.onosproject.openstacknetworking.api.Constants.STAT_OUTBOUND_TABLE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.COMPUTE;
 import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
@@ -353,6 +354,8 @@
         osNodeService.completeNodes(OpenstackNode.NodeType.GATEWAY)
                 .forEach(gwNode -> {
                         instancePortService.instancePorts(netId)
+                                .stream()
+                                .filter(port -> port.state() == ACTIVE)
                                 .forEach(port -> setRulesForSnatIngressRule(gwNode.intgBridge(),
                                     Long.parseLong(osNet.getProviderSegID()),
                                     IpPrefix.valueOf(port.ipAddress(), 32),
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
index 3131263..59241cb 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackSwitchingArpHandler.java
@@ -85,6 +85,7 @@
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REPLY_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_REQUEST_RULE;
 import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_ARP_SUBNET_RULE;
+import static org.onosproject.openstacknetworking.api.InstancePort.State.ACTIVE;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 import static org.onosproject.openstacknetworking.util.RulePopulatorUtil.buildExtension;
@@ -718,6 +719,7 @@
         private void setAllArpRules(OpenstackNode osNode, boolean install) {
             if (ARP_BROADCAST_MODE.equals(getArpMode())) {
                 instancePortService.instancePorts().stream()
+                        .filter(p -> p.state() == ACTIVE)
                         .filter(p -> p.deviceId().equals(osNode.intgBridge()))
                         .forEach(p -> {
                             setArpRequestRule(p, install);
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 5519f37..6c9e3ea 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
@@ -315,7 +315,6 @@
                 install);
     }
 
-
     /**
      * Configures the flow rules which are used for L2 packet switching.
      * Note that these rules will be inserted in switching table (table 5).