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).