use of org.onosproject.kubevirtnode.api.KubevirtNode in project onos by opennetworkinglab.
the class KubevirtNetworkHandler method setGatewayInterNetworkRoutingFromNetworkToPort.
private void setGatewayInterNetworkRoutingFromNetworkToPort(KubevirtRouter router, KubevirtNetwork srcNetwork, KubevirtPort dstPort, KubevirtNode gatewayNode, boolean install) {
Device gwDevice = deviceService.getDevice(gatewayNode.intgBridge());
if (gwDevice == null) {
log.warn("Failed to set internal network routing rule because " + "there's no device Id for device {}", gatewayNode.intgBridge());
return;
}
MacAddress routerMacAddress = getRouterMacAddress(router);
if (routerMacAddress == null) {
log.warn("Failed to set internal network routing rule because " + "there's no br-int port for device {}", gatewayNode.intgBridge());
return;
}
TrafficSelector.Builder sBuilder;
TrafficTreatment treatment;
if (srcNetwork.type() == FLAT || srcNetwork.type() == VLAN) {
sBuilder = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchEthDst(routerMacAddress).matchIPSrc(IpPrefix.valueOf(srcNetwork.cidr())).matchIPDst(IpPrefix.valueOf(dstPort.ipAddress(), 32));
treatment = DefaultTrafficTreatment.builder().setEthSrc(routerMacAddress).setEthDst(dstPort.macAddress()).transition(FORWARDING_TABLE).build();
flowService.setRule(appId, gwDevice.id(), sBuilder.build(), treatment, PRIORITY_INTERNAL_ROUTING_RULE, GW_ENTRY_TABLE, install);
} else {
KubevirtNetwork dstNetwork = kubevirtNetworkService.network(dstPort.networkId());
if (dstNetwork == null) {
return;
}
KubevirtNode dstPortWorkerNode = kubevirtNodeService.node(dstPort.deviceId());
if (dstPortWorkerNode == null) {
return;
}
sBuilder = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchEthDst(routerMacAddress).matchTunnelId(Long.parseLong(srcNetwork.segmentId())).matchIPSrc(IpPrefix.valueOf(srcNetwork.cidr())).matchIPDst(IpPrefix.valueOf(dstPort.ipAddress(), 32));
treatment = DefaultTrafficTreatment.builder().setTunnelId(Long.parseLong(dstNetwork.segmentId())).setEthSrc(routerMacAddress).setEthDst(dstPort.macAddress()).extension(buildExtension(deviceService, gatewayNode.tunBridge(), dstPortWorkerNode.dataIp().getIp4Address()), gatewayNode.tunBridge()).setOutput(PortNumber.IN_PORT).build();
flowService.setRule(appId, gatewayNode.tunBridge(), sBuilder.build(), treatment, PRIORITY_INTERNAL_ROUTING_RULE, TUNNEL_DEFAULT_TABLE, install);
}
}
use of org.onosproject.kubevirtnode.api.KubevirtNode in project onos by opennetworkinglab.
the class KubevirtFloatingIpHandler method setFloatingIpDownstreamRulesToGatewayTunBridge.
private void setFloatingIpDownstreamRulesToGatewayTunBridge(KubevirtFloatingIp floatingIp, KubevirtNode electedGw, KubevirtNetwork network, KubevirtPort port, boolean install) {
KubevirtNode workerNode = kubevirtNodeService.node(port.deviceId());
if (workerNode == null) {
log.warn("Failed to install floating Ip rules for floating ip {} " + "because fail to fine the worker node that the associated port is running on", floatingIp.floatingIp());
return;
}
PortNumber tunnelPortNumber = tunnelPort(electedGw, network);
if (tunnelPortNumber == null) {
return;
}
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32)).matchEthDst(port.macAddress());
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder().setTunnelId(Long.parseLong(network.segmentId())).extension(buildExtension(deviceService, electedGw.tunBridge(), workerNode.dataIp().getIp4Address()), electedGw.tunBridge()).setOutput(tunnelPortNumber);
flowService.setRule(appId, electedGw.tunBridge(), sBuilder.build(), tBuilder.build(), PRIORITY_FLOATING_GATEWAY_TUN_BRIDGE_RULE, TUNNEL_DEFAULT_TABLE, install);
}
use of org.onosproject.kubevirtnode.api.KubevirtNode in project onos by opennetworkinglab.
the class KubevirtLbHandler method setLbDownStreamRulesForTunBridge.
private void setLbDownStreamRulesForTunBridge(KubevirtLoadBalancer loadBalancer, KubevirtNode gateway, boolean install) {
Set<KubevirtPort> ports = portService.ports(loadBalancer.networkId());
KubevirtNetwork network = networkService.network(loadBalancer.networkId());
PortNumber tunnelPortNumber = tunnelPort(gateway, network);
if (tunnelPortNumber == null) {
return;
}
loadBalancer.members().forEach(ip -> {
ports.stream().filter(port -> port.ipAddress().equals(ip) && port.macAddress() != null).findAny().ifPresent(port -> {
KubevirtNode workerNode = nodeService.node(port.deviceId());
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32)).matchEthDst(port.macAddress());
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder().setTunnelId(Long.parseLong(network.segmentId())).extension(buildExtension(deviceService, gateway.tunBridge(), workerNode.dataIp().getIp4Address()), gateway.tunBridge()).setOutput(tunnelPortNumber);
flowRuleService.setRule(appId, gateway.tunBridge(), sBuilder.build(), tBuilder.build(), PRIORITY_LB_GATEWAY_TUN_BRIDGE_RULE, TUNNEL_DEFAULT_TABLE, install);
});
});
}
use of org.onosproject.kubevirtnode.api.KubevirtNode in project onos by opennetworkinglab.
the class KubevirtRoutingSnatHandler method setDownStreamRulesToGatewayTunBridge.
private void setDownStreamRulesToGatewayTunBridge(KubevirtNetwork network, KubevirtNode electedGw, KubevirtPort port, boolean install) {
KubevirtNode workerNode = kubevirtNodeService.node(port.deviceId());
if (workerNode == null) {
return;
}
PortNumber tunnelPortNumber = tunnelPort(electedGw, network);
if (tunnelPortNumber == null) {
return;
}
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder().matchEthType(Ethernet.TYPE_IPV4).matchIPDst(IpPrefix.valueOf(port.ipAddress(), 32)).matchEthDst(port.macAddress());
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder().setTunnelId(Long.parseLong(network.segmentId())).extension(buildExtension(deviceService, electedGw.tunBridge(), workerNode.dataIp().getIp4Address()), electedGw.tunBridge()).setOutput(tunnelPortNumber);
flowService.setRule(appId, electedGw.tunBridge(), sBuilder.build(), tBuilder.build(), PRIORITY_FORWARDING_RULE, TUNNEL_DEFAULT_TABLE, install);
}
use of org.onosproject.kubevirtnode.api.KubevirtNode in project onos by opennetworkinglab.
the class KubevirtSwitchingTenantHandler method setIngressRules.
private void setIngressRules(KubevirtNode node, boolean install) {
for (KubevirtNetwork network : kubevirtNetworkService.tenantNetworks()) {
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()));
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder().setOutput(patchPortNumber);
flowRuleService.setRule(appId, node.tunBridge(), sBuilder.build(), tBuilder.build(), PRIORITY_TUNNEL_RULE, TUNNEL_DEFAULT_TABLE, install);
log.debug("Install ingress rules for segment ID {}", network.segmentId());
}
}
Aggregations