Fix: ensure to install rules while waiting for patch port creation

Change-Id: I0a7aa8ebd34a85bed6b8feb3ade5551b36be18cf
(cherry picked from commit c59f83c4dc333357680d22ca731f10340fab24b7)
This commit is contained in:
Jian Li 2021-07-01 10:04:04 +09:00
parent 6cb4867a83
commit 34fff804f0
3 changed files with 42 additions and 19 deletions

View File

@ -504,21 +504,20 @@ public class KubevirtNetworkHandler {
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 @@ public class KubevirtNetworkHandler {
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()));

View File

@ -152,14 +152,17 @@ public class KubevirtSwitchingTenantHandler {
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 @@ public class KubevirtSwitchingTenantHandler {
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 @@ public class KubevirtSwitchingTenantHandler {
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;

View File

@ -27,7 +27,6 @@ import org.apache.commons.lang.StringUtils;
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 @@ public final class KubevirtNetworkingUtil {
/**
* 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 @@ public final class KubevirtNetworkingUtil {
}
String tunToTenantPortName = TUNNEL_TO_TENANT_PREFIX + segmentIdHex(network.segmentId());
return portNumber(node.tunBridge(), tunToTenantPortName);
return portNumber(deviceService, node.tunBridge(), tunToTenantPortName);
}
/**
@ -463,8 +464,7 @@ public final class KubevirtNetworkingUtil {
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))