ONOS-6742 Refactored OpenstackNode
- Removed gateway node uplink interface configuration steps
- Added checking group states
- Refactored interface, store, manager and handler
Change-Id: I9149edbec6481b15377848c8f24bdc5c6c73adc4
diff --git a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index f1fdf29..50110a2 100644
--- a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -44,9 +44,10 @@
import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
import org.onosproject.openstacknetworking.api.OpenstackRouterService;
-import org.onosproject.openstacknode.OpenstackNodeEvent;
-import org.onosproject.openstacknode.OpenstackNodeListener;
-import org.onosproject.openstacknode.OpenstackNodeService;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.api.OpenstackNodeEvent;
+import org.onosproject.openstacknode.api.OpenstackNodeListener;
+import org.onosproject.openstacknode.api.OpenstackNodeService;
import org.openstack4j.model.network.NetFloatingIP;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.NetworkType;
@@ -55,7 +56,6 @@
import org.slf4j.LoggerFactory;
import java.util.Objects;
-import java.util.Optional;
import java.util.concurrent.ExecutorService;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
@@ -65,7 +65,7 @@
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_EXTERNAL;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_FLOATING_INTERNAL;
import static org.onosproject.openstacknetworking.impl.RulePopulatorUtil.buildExtension;
-import static org.onosproject.openstacknode.OpenstackNodeService.NodeType.GATEWAY;
+import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
/**
* Handles OpenStack floating IP events.
@@ -107,7 +107,7 @@
private final ExecutorService eventExecutor = newSingleThreadExecutor(
groupedThreads(this.getClass().getSimpleName(), "event-handler", log));
- private final OpenstackRouterListener floatingIpLisener = new InternalFloatingIpLisener();
+ private final OpenstackRouterListener floatingIpLisener = new InternalFloatingIpListener();
private final OpenstackNodeListener osNodeListener = new InternalNodeListener();
private ApplicationId appId;
@@ -158,11 +158,21 @@
private void setDownstreamRules(NetFloatingIP floatingIp, Network osNet,
InstancePort instPort, boolean install) {
- Optional<IpAddress> dataIp = osNodeService.dataIp(instPort.deviceId());
- if (!dataIp.isPresent()) {
- log.warn(ERR_FLOW + "compute node {} is not ready",
- floatingIp, instPort.deviceId());
- return;
+ OpenstackNode cNode = osNodeService.node(instPort.deviceId());
+ if (cNode == null) {
+ final String error = String.format("Cannot find openstack node for device %s",
+ instPort.deviceId());
+ throw new IllegalStateException(error);
+ }
+ if (osNet.getNetworkType() == NetworkType.VXLAN && cNode.dataIp() == null) {
+ final String error = String.format(ERR_FLOW +
+ "VXLAN mode is not ready for %s", floatingIp, cNode.hostname());
+ throw new IllegalStateException(error);
+ }
+ if (osNet.getNetworkType() == NetworkType.VLAN && cNode.vlanIntf() == null) {
+ final String error = String.format(ERR_FLOW +
+ "VLAN mode is not ready for %s", floatingIp, cNode.hostname());
+ throw new IllegalStateException(error);
}
IpAddress floating = IpAddress.valueOf(floatingIp.getFloatingIpAddress());
@@ -171,7 +181,7 @@
.matchIPDst(floating.toIpPrefix())
.build();
- osNodeService.gatewayDeviceIds().forEach(gnodeId -> {
+ osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
TrafficTreatment.Builder externalBuilder = DefaultTrafficTreatment.builder()
.setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
.setEthDst(instPort.macAddress())
@@ -182,37 +192,36 @@
externalBuilder.setTunnelId(Long.valueOf(osNet.getProviderSegID()))
.extension(buildExtension(
deviceService,
- gnodeId,
- dataIp.get().getIp4Address()),
- gnodeId)
- .setOutput(osNodeService.tunnelPort(gnodeId).get());
+ gNode.intgBridge(),
+ cNode.dataIp().getIp4Address()),
+ gNode.intgBridge())
+ .setOutput(gNode.tunnelPortNum());
break;
case VLAN:
externalBuilder.pushVlan()
.setVlanId(VlanId.vlanId(osNet.getProviderSegID()))
- .setOutput(osNodeService.vlanPort(gnodeId).get());
+ .setOutput(gNode.vlanPortNum());
break;
default:
- final String error = String.format(
- ERR_UNSUPPORTED_NET_TYPE + "%s",
- osNet.getNetworkType().toString());
+ final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
+ osNet.getNetworkType());
throw new IllegalStateException(error);
}
osFlowRuleService.setRule(
appId,
- gnodeId,
+ gNode.intgBridge(),
externalSelector,
externalBuilder.build(),
PRIORITY_FLOATING_EXTERNAL,
GW_COMMON_TABLE,
install);
- // access from one VM to the other via floating IP
+ // access from one VM to the others via floating IP
TrafficSelector internalSelector = DefaultTrafficSelector.builder()
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPDst(floating.toIpPrefix())
- .matchInPort(osNodeService.tunnelPort(gnodeId).get())
+ .matchInPort(gNode.tunnelPortNum())
.build();
TrafficTreatment.Builder internalBuilder = DefaultTrafficTreatment.builder()
@@ -225,9 +234,9 @@
internalBuilder.setTunnelId(Long.valueOf(osNet.getProviderSegID()))
.extension(buildExtension(
deviceService,
- gnodeId,
- dataIp.get().getIp4Address()),
- gnodeId)
+ gNode.intgBridge(),
+ cNode.dataIp().getIp4Address()),
+ gNode.intgBridge())
.setOutput(PortNumber.IN_PORT);
break;
case VLAN:
@@ -236,15 +245,14 @@
.setOutput(PortNumber.IN_PORT);
break;
default:
- final String error = String.format(
- ERR_UNSUPPORTED_NET_TYPE + "%s",
- osNet.getNetworkType().toString());
+ final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
+ osNet.getNetworkType());
throw new IllegalStateException(error);
}
osFlowRuleService.setRule(
appId,
- gnodeId,
+ gNode.intgBridge(),
internalSelector,
internalBuilder.build(),
PRIORITY_FLOATING_INTERNAL,
@@ -256,7 +264,6 @@
private void setUpstreamRules(NetFloatingIP floatingIp, Network osNet,
InstancePort instPort, boolean install) {
IpAddress floating = IpAddress.valueOf(floatingIp.getFloatingIpAddress());
-
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPSrc(instPort.ipAddress().toIpPrefix());
@@ -269,13 +276,12 @@
sBuilder.matchVlanId(VlanId.vlanId(osNet.getProviderSegID()));
break;
default:
- final String error = String.format(
- ERR_UNSUPPORTED_NET_TYPE + "%s",
- osNet.getNetworkType().toString());
+ final String error = String.format(ERR_UNSUPPORTED_NET_TYPE + "%s",
+ osNet.getNetworkType());
throw new IllegalStateException(error);
}
- osNodeService.gatewayDeviceIds().forEach(gnodeId -> {
+ osNodeService.completeNodes(GATEWAY).forEach(gNode -> {
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder()
.setIpSrc(floating.getIp4Address())
.setEthSrc(Constants.DEFAULT_GATEWAY_MAC)
@@ -287,16 +293,16 @@
osFlowRuleService.setRule(
appId,
- gnodeId,
+ gNode.intgBridge(),
sBuilder.build(),
- tBuilder.setOutput(osNodeService.externalPort(gnodeId).get()).build(),
+ tBuilder.setOutput(gNode.patchPortNum()).build(),
PRIORITY_FLOATING_EXTERNAL,
GW_COMMON_TABLE,
install);
});
}
- private class InternalFloatingIpLisener implements OpenstackRouterListener {
+ private class InternalFloatingIpListener implements OpenstackRouterListener {
@Override
public boolean isRelevant(OpenstackRouterEvent event) {
@@ -401,7 +407,7 @@
public void event(OpenstackNodeEvent event) {
switch (event.type()) {
- case COMPLETE:
+ case OPENSTACK_NODE_COMPLETE:
eventExecutor.execute(() -> {
for (NetFloatingIP fip : osRouterService.floatingIps()) {
if (Strings.isNullOrEmpty(fip.getPortId())) {
@@ -416,10 +422,12 @@
}
});
break;
- case INIT:
- case DEVICE_CREATED:
- case INCOMPLETE:
+ case OPENSTACK_NODE_CREATED:
+ case OPENSTACK_NODE_UPDATED:
+ case OPENSTACK_NODE_REMOVED:
+ case OPENSTACK_NODE_INCOMPLETE:
default:
+ // do nothing
break;
}
}