Fix: ensure to install rules while waiting for patch port creation
Change-Id: I0a7aa8ebd34a85bed6b8feb3ade5551b36be18cf
(cherry picked from commit c59f83c4dc333357680d22ca731f10340fab24b7)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index 241b3c5..d4a90a5 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -504,21 +504,20 @@
MacAddress routerMacAddress = getRouterMacAddress(router);
if (routerMacAddress == null) {
- log.warn("Setting gateway default eggress rule to gateway for tenant internal network because " +
- "there's no br-int port for device {}", gwDeviceId);
+ log.warn("Setting gateway default egress rule to gateway for tenant " +
+ "internal network because there's no br-int port for device {}", gwDeviceId);
return;
}
KubevirtNode gwNode = kubevirtNodeService.node(gwDeviceId);
if (gwNode == null) {
- log.warn("Setting gateway default eggress rule to gateway for tenant internal network because " +
- "there's no gateway node for device {}", gwDeviceId);
+ log.warn("Setting gateway default egress rule to gateway for tenant " +
+ "internal network because there's no gateway node for device {}", gwDeviceId);
return;
}
-
- PortNumber patchPortNumber = tunnelToTenantPort(workerNode, network);
+ PortNumber patchPortNumber = tunnelToTenantPort(deviceService, workerNode, network);
if (patchPortNumber == null) {
return;
}
@@ -608,7 +607,7 @@
return;
}
- PortNumber tunToIntPortNum = portNumber(gwNode.tunBridge(), TUNNEL_TO_INTEGRATION);
+ PortNumber tunToIntPortNum = portNumber(deviceService, gwNode.tunBridge(), TUNNEL_TO_INTEGRATION);
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
.matchTunnelId(Long.parseLong(network.segmentId()));
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
index 3967d6a..3d0045d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
@@ -152,14 +152,17 @@
for (KubevirtNode localNode : kubevirtNodeService.completeNodes(WORKER)) {
while (true) {
- if (tunnelToTenantPort(localNode, network) != null) {
+ KubevirtNode updatedNode = kubevirtNodeService.node(localNode.hostname());
+ if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
break;
} else {
+ log.info("Waiting for tunnel to tenant patch port creation " +
+ "on ingress rule setup on node {}", updatedNode);
waitFor(3);
}
}
- PortNumber patchPortNumber = tunnelToTenantPort(localNode, network);
+ PortNumber patchPortNumber = tunnelToTenantPort(deviceService, localNode, network);
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
.matchTunnelId(Long.parseLong(network.segmentId()));
@@ -182,11 +185,24 @@
private void setIngressRules(KubevirtNode node, boolean install) {
for (KubevirtNetwork network : kubevirtNetworkService.tenantNetworks()) {
- PortNumber patchPortNumber = tunnelToTenantPort(node, network);
- if (patchPortNumber == null) {
+
+ if (node == null || node.type() != WORKER) {
return;
}
+ while (true) {
+ KubevirtNode updatedNode = kubevirtNodeService.node(node.hostname());
+ if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
+ break;
+ } else {
+ log.info("Waiting for tunnel to tenant patch port creation " +
+ "on ingress rule setup on node {}", updatedNode);
+ waitFor(3);
+ }
+ }
+
+ PortNumber patchPortNumber = tunnelToTenantPort(deviceService, node, network);
+
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
.matchTunnelId(Long.parseLong(network.segmentId()));
@@ -236,11 +252,19 @@
continue;
}
- PortNumber patchPortNumber = tunnelToTenantPort(remoteNode, network);
- if (patchPortNumber == null) {
- return;
+ while (true) {
+ KubevirtNode updatedNode = kubevirtNodeService.node(localNode.hostname());
+ if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
+ break;
+ } else {
+ log.info("Waiting for tunnel to tenant patch port creation " +
+ "on egress rule setup on node {}", updatedNode);
+ waitFor(3);
+ }
}
+ PortNumber patchPortNumber = tunnelToTenantPort(deviceService, remoteNode, network);
+
PortNumber tunnelPortNumber = tunnelPort(remoteNode, network);
if (tunnelPortNumber == null) {
return;
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index 89ff8b2..21353b9 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -27,7 +27,6 @@
import org.apache.commons.net.util.SubnetUtils;
import org.json.JSONException;
import org.json.JSONObject;
-import org.onlab.osgi.DefaultServiceDirectory;
import org.onlab.packet.ARP;
import org.onlab.packet.Ethernet;
import org.onlab.packet.Ip4Address;
@@ -405,11 +404,13 @@
/**
* Obtains the tunnel bridge to tenant bridge patch port number.
*
+ * @param deviceService device service
* @param node kubevirt node
* @param network kubevirt network
* @return patch port number
*/
- public static PortNumber tunnelToTenantPort(KubevirtNode node, KubevirtNetwork network) {
+ public static PortNumber tunnelToTenantPort(DeviceService deviceService,
+ KubevirtNode node, KubevirtNetwork network) {
if (network.segmentId() == null) {
return null;
}
@@ -419,7 +420,7 @@
}
String tunToTenantPortName = TUNNEL_TO_TENANT_PREFIX + segmentIdHex(network.segmentId());
- return portNumber(node.tunBridge(), tunToTenantPortName);
+ return portNumber(deviceService, node.tunBridge(), tunToTenantPortName);
}
/**
@@ -463,8 +464,7 @@
return "";
}
- public static PortNumber portNumber(DeviceId deviceId, String portName) {
- DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
+ public static PortNumber portNumber(DeviceService deviceService, DeviceId deviceId, String portName) {
Port port = deviceService.getPorts(deviceId).stream()
.filter(p -> p.isEnabled() &&
Objects.equals(p.annotations().value(PORT_NAME), portName))