Support to allocate/release IP address for multiple networks
Change-Id: Ibd9a73fc8675559ed2a1aff47e39759745fad400
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 01c32dd..91984af 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
@@ -52,6 +52,7 @@
import org.slf4j.Logger;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
@@ -61,7 +62,7 @@
import static org.onosproject.kubevirtnetworking.api.Constants.TUNNEL_DEFAULT_TABLE;
import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.FLAT;
import static org.onosproject.kubevirtnetworking.api.KubevirtNetwork.Type.VLAN;
-import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPort;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPorts;
import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.tunnelPort;
import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.tunnelToTenantPort;
import static org.onosproject.kubevirtnetworking.util.RulePopulatorUtil.buildExtension;
@@ -131,62 +132,64 @@
log.info("Stopped");
}
- private KubevirtPort getPortByPod(Pod pod) {
- return getPort(kubevirtNetworkService.networks(), pod);
+ private Set<KubevirtPort> getPortByPod(Pod pod) {
+ return getPorts(kubevirtNetworkService.networks(), pod);
}
private void setIngressRules(Pod pod, boolean install) {
- KubevirtPort port = getPortByPod(pod);
+ Set<KubevirtPort> ports = getPortByPod(pod);
- if (port == null) {
+ if (ports.size() == 0) {
return;
}
- if (port.ipAddress() == null) {
- return;
+ for (KubevirtPort port : ports) {
+ if (port.ipAddress() == null) {
+ return;
+ }
+
+ KubevirtNetwork network = kubevirtNetworkService.network(port.networkId());
+
+ if (network == null) {
+ return;
+ }
+
+ if (network.type() == FLAT || network.type() == VLAN) {
+ return;
+ }
+
+ if (network.segmentId() == null) {
+ return;
+ }
+
+ KubevirtNode localNode = kubevirtNodeService.node(pod.getSpec().getNodeName());
+ if (localNode == null || localNode.type() == MASTER) {
+ return;
+ }
+
+ PortNumber patchPortNumber = tunnelToTenantPort(localNode, network);
+ if (patchPortNumber == null) {
+ return;
+ }
+
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
+ .matchTunnelId(Long.parseLong(network.segmentId()));
+
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
+ .setOutput(patchPortNumber);
+
+ flowRuleService.setRule(
+ appId,
+ localNode.tunBridge(),
+ sBuilder.build(),
+ tBuilder.build(),
+ PRIORITY_TUNNEL_RULE,
+ TUNNEL_DEFAULT_TABLE,
+ install);
+
+ log.debug("Install ingress rules for instance {}, segment ID {}",
+ port.ipAddress(), network.segmentId());
}
-
- KubevirtNetwork network = kubevirtNetworkService.network(port.networkId());
-
- if (network == null) {
- return;
- }
-
- if (network.type() == FLAT || network.type() == VLAN) {
- return;
- }
-
- if (network.segmentId() == null) {
- return;
- }
-
- KubevirtNode localNode = kubevirtNodeService.node(pod.getSpec().getNodeName());
- if (localNode == null || localNode.type() == MASTER) {
- return;
- }
-
- PortNumber patchPortNumber = tunnelToTenantPort(localNode, network);
- if (patchPortNumber == null) {
- return;
- }
-
- TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
- .matchTunnelId(Long.parseLong(network.segmentId()));
-
- TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
- .setOutput(patchPortNumber);
-
- flowRuleService.setRule(
- appId,
- localNode.tunBridge(),
- sBuilder.build(),
- tBuilder.build(),
- PRIORITY_TUNNEL_RULE,
- TUNNEL_DEFAULT_TABLE,
- install);
-
- log.debug("Install ingress rules for instance {}, segment ID {}",
- port.ipAddress(), network.segmentId());
}
private void setEgressRules(Pod pod, boolean install) {
@@ -200,85 +203,87 @@
return;
}
- KubevirtPort port = getPortByPod(pod);
+ Set<KubevirtPort> ports = getPortByPod(pod);
- if (port == null) {
+ if (ports.size() == 0) {
return;
}
- if (port.ipAddress() == null) {
- return;
- }
-
- KubevirtNetwork network = kubevirtNetworkService.network(port.networkId());
-
- if (network == null) {
- return;
- }
-
- if (network.type() == FLAT || network.type() == VLAN) {
- return;
- }
-
- if (network.segmentId() == null) {
- return;
- }
-
- for (KubevirtNode remoteNode : kubevirtNodeService.completeNodes(WORKER)) {
- if (remoteNode.hostname().equals(localNode.hostname())) {
- continue;
- }
-
- PortNumber patchPortNumber = tunnelToTenantPort(remoteNode, network);
- if (patchPortNumber == null) {
+ for (KubevirtPort port : ports) {
+ if (port.ipAddress() == null) {
return;
}
- PortNumber tunnelPortNumber = tunnelPort(remoteNode, network);
- if (tunnelPortNumber == null) {
+ KubevirtNetwork network = kubevirtNetworkService.network(port.networkId());
+
+ if (network == null) {
return;
}
- TrafficSelector.Builder sIpBuilder = DefaultTrafficSelector.builder()
- .matchInPort(patchPortNumber)
- .matchEthType(Ethernet.TYPE_IPV4)
- .matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32));
+ if (network.type() == FLAT || network.type() == VLAN) {
+ return;
+ }
- TrafficSelector.Builder sArpBuilder = DefaultTrafficSelector.builder()
- .matchInPort(patchPortNumber)
- .matchEthType(Ethernet.TYPE_ARP)
- .matchArpTpa(Ip4Address.valueOf(port.ipAddress().toString()));
+ if (network.segmentId() == null) {
+ return;
+ }
- TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
- .setTunnelId(Long.parseLong(network.segmentId()))
- .extension(buildExtension(
- deviceService,
- remoteNode.tunBridge(),
- localNode.dataIp().getIp4Address()),
- remoteNode.tunBridge())
- .setOutput(tunnelPortNumber);
+ for (KubevirtNode remoteNode : kubevirtNodeService.completeNodes(WORKER)) {
+ if (remoteNode.hostname().equals(localNode.hostname())) {
+ continue;
+ }
- flowRuleService.setRule(
- appId,
- remoteNode.tunBridge(),
- sIpBuilder.build(),
- tBuilder.build(),
- PRIORITY_TUNNEL_RULE,
- TUNNEL_DEFAULT_TABLE,
- install);
+ PortNumber patchPortNumber = tunnelToTenantPort(remoteNode, network);
+ if (patchPortNumber == null) {
+ return;
+ }
- flowRuleService.setRule(
- appId,
- remoteNode.tunBridge(),
- sArpBuilder.build(),
- tBuilder.build(),
- PRIORITY_TUNNEL_RULE,
- TUNNEL_DEFAULT_TABLE,
- install);
+ PortNumber tunnelPortNumber = tunnelPort(remoteNode, network);
+ if (tunnelPortNumber == null) {
+ return;
+ }
+
+ TrafficSelector.Builder sIpBuilder = DefaultTrafficSelector.builder()
+ .matchInPort(patchPortNumber)
+ .matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32));
+
+ TrafficSelector.Builder sArpBuilder = DefaultTrafficSelector.builder()
+ .matchInPort(patchPortNumber)
+ .matchEthType(Ethernet.TYPE_ARP)
+ .matchArpTpa(Ip4Address.valueOf(port.ipAddress().toString()));
+
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
+ .setTunnelId(Long.parseLong(network.segmentId()))
+ .extension(buildExtension(
+ deviceService,
+ remoteNode.tunBridge(),
+ localNode.dataIp().getIp4Address()),
+ remoteNode.tunBridge())
+ .setOutput(tunnelPortNumber);
+
+ flowRuleService.setRule(
+ appId,
+ remoteNode.tunBridge(),
+ sIpBuilder.build(),
+ tBuilder.build(),
+ PRIORITY_TUNNEL_RULE,
+ TUNNEL_DEFAULT_TABLE,
+ install);
+
+ flowRuleService.setRule(
+ appId,
+ remoteNode.tunBridge(),
+ sArpBuilder.build(),
+ tBuilder.build(),
+ PRIORITY_TUNNEL_RULE,
+ TUNNEL_DEFAULT_TABLE,
+ install);
+ }
+
+ log.debug("Install egress rules for instance {}, segment ID {}",
+ port.ipAddress(), network.segmentId());
}
-
- log.debug("Install egress rules for instance {}, segment ID {}",
- port.ipAddress(), network.segmentId());
}
private class InternalKubevirtNodeListener implements KubevirtNodeListener {