Fix to install flow rule for floating IP-assigned VM in VLAN case.
Change-Id: Idf8da413292663bc5587d5bfe7f283f58ae11958
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
index dc7c877..7ed3438 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingFloatingIpHandler.java
@@ -315,47 +315,51 @@
Network osNet,
Set<OpenstackNode> gateways,
boolean install) {
- TrafficTreatment treatment;
TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
.matchEthType(Ethernet.TYPE_IPV4)
.matchIPSrc(instPort.ipAddress().toIpPrefix())
.matchEthDst(Constants.DEFAULT_GATEWAY_MAC);
- switch (osNet.getNetworkType()) {
- case VXLAN:
- sBuilder.matchTunnelId(Long.parseLong(osNet.getProviderSegID()));
- break;
- case VLAN:
- sBuilder.matchVlanId(VlanId.vlanId(osNet.getProviderSegID()));
- break;
- default:
- final String error = String.format(
- ERR_UNSUPPORTED_NET_TYPE,
- osNet.getNetworkType().toString());
- throw new IllegalStateException(error);
- }
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
OpenstackNode selectedGatewayNode = getGwByComputeDevId(gateways, instPort.deviceId());
if (selectedGatewayNode == null) {
- final String errorFormat = ERR_FLOW + "no gateway node selected";
- throw new IllegalStateException(errorFormat);
+ log.warn(ERR_FLOW + "no gateway node selected");
}
- treatment = DefaultTrafficTreatment.builder()
- .extension(buildExtension(
+
+ switch (osNet.getNetworkType()) {
+ case VXLAN:
+ if (osNodeService.node(instPort.deviceId()).tunnelPortNum() == null) {
+ log.warn(ERR_FLOW + "no tunnel port");
+ return;
+ }
+ sBuilder.matchTunnelId(Long.parseLong(osNet.getProviderSegID()));
+ tBuilder.extension(buildExtension(
deviceService,
instPort.deviceId(),
selectedGatewayNode.dataIp().getIp4Address()),
instPort.deviceId())
- .setOutput(osNodeService.node(instPort.deviceId()).tunnelPortNum())
- .build();
+ .setOutput(osNodeService.node(instPort.deviceId()).tunnelPortNum());
+ break;
+ case VLAN:
+ if (osNodeService.node(instPort.deviceId()).vlanPortNum() == null) {
+ log.warn(ERR_FLOW + "no vlan port");
+ return;
+ }
+ sBuilder.matchVlanId(VlanId.vlanId(osNet.getProviderSegID()));
+ tBuilder.setOutput(osNodeService.node(instPort.deviceId()).vlanPortNum());
+ break;
+ default:
+ log.warn(ERR_FLOW + "no supported network type");
+ }
osFlowRuleService.setRule(
appId,
instPort.deviceId(),
sBuilder.build(),
- treatment,
+ tBuilder.build(),
PRIORITY_EXTERNAL_FLOATING_ROUTING_RULE,
ROUTING_TABLE,
install);