Fix to get external ip address from external gateway information
Change-Id: I5a3a694c407d1790d1dc5a94b416853ea5d347c8
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterInterfaceListCommand.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterInterfaceListCommand.java
new file mode 100644
index 0000000..1b68e56
--- /dev/null
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/cli/OpenstackRouterInterfaceListCommand.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacknetworking.cli;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.google.common.collect.Lists;
+import org.apache.karaf.shell.commands.Command;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
+import org.onosproject.openstacknetworking.api.OpenstackRouterService;
+import org.openstack4j.model.network.RouterInterface;
+import org.openstack4j.openstack.networking.domain.NeutronRouter;
+
+import java.util.List;
+
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
+
+/**
+ * Lists Openstack router interfaces.
+ */
+@Command(scope = "onos", name = "openstack-router-interfaces",
+ description = "Lists all OpenStack routers interfaces")
+public class OpenstackRouterInterfaceListCommand extends AbstractShellCommand {
+ private static final String FORMAT = "%-40s%-40s%-40s%-40s%-40s";
+
+ private final OpenstackRouterService routerService =
+ AbstractShellCommand.get(OpenstackRouterService.class);
+ private final OpenstackNetworkService netService =
+ AbstractShellCommand.get(OpenstackNetworkService.class);
+
+ @Override
+ protected void execute() {
+ List<RouterInterface> routerInterfaces =
+ Lists.newArrayList(routerService.routerInterfaces());
+
+ if (outputJson()) {
+ print("%s", json(routerInterfaces));
+ } else {
+ print(FORMAT, "ID", "RouterName", "SubnetID", "PortID", "TenantID");
+ for (RouterInterface routerInterface: routerInterfaces) {
+ print(FORMAT, routerInterface.getId(),
+ routerService.router(routerInterface.getId()),
+ routerInterface.getSubnetId(),
+ routerInterface.getPortId(),
+ routerInterface.getTenantId());
+ }
+ }
+ }
+
+ private String json(List<RouterInterface> routerInterfaces) {
+ ObjectMapper mapper = new ObjectMapper();
+ ArrayNode result = mapper.createArrayNode();
+ for (RouterInterface routerInterface: routerInterfaces) {
+ result.add(modelEntityToJson(routerInterface, NeutronRouter.class));
+ }
+ return prettyJson(mapper, result.toString());
+ }
+}
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
index 298263c..ce63d4f 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingArpHandler.java
@@ -65,17 +65,14 @@
import org.onosproject.openstacknetworking.api.OpenstackRouterEvent;
import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
import org.onosproject.openstacknetworking.api.PreCommitPortService;
-import org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil;
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.IP;
import org.openstack4j.model.network.NetFloatingIP;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.Port;
import org.openstack4j.model.network.Router;
-import org.openstack4j.model.network.RouterInterface;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
@@ -99,6 +96,7 @@
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalPeerRouterForNetwork;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.floatingIpByInstancePort;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getExternalIp;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getPropertyValue;
@@ -526,65 +524,43 @@
}
private void setFakeGatewayArpRuleByRouter(Router router, boolean install) {
- setFakeGatewayArpRuleByGateway(router.getId(), install);
- }
-
- private Set<IP> getExternalGatewaySnatIps(String routerId) {
- if (routerId == null) {
- return ImmutableSet.of();
- }
-
- Set<String> portIds = osRouterAdminService.routerInterfaces(routerId)
- .stream()
- .map(RouterInterface::getPortId)
- .collect(Collectors.toSet());
-
- return portIds.stream()
- .map(pid -> osNetworkAdminService.port(pid))
- .filter(p -> Objects.equals(p.getDeviceOwner(), DEVICE_OWNER_ROUTER_GW))
- .flatMap(p -> p.getFixedIps().stream())
- .collect(Collectors.toSet());
- }
-
- private void setFakeGatewayArpRuleByGateway(String routerId, boolean install) {
if (ARP_BROADCAST_MODE.equals(getArpMode())) {
- setFakeGatewayArpRuleByIps(getExternalGatewaySnatIps(routerId), install);
+ setFakeGatewayArpRuleByExternalIp(getExternalIp(router, osNetworkService), install);
}
}
- private void setFakeGatewayArpRuleByIps(Set<IP> ips, boolean install) {
- ips.forEach(ip -> {
- TrafficSelector selector = DefaultTrafficSelector.builder()
- .matchEthType(EthType.EtherType.ARP.ethType().toShort())
- .matchArpOp(ARP.OP_REQUEST)
- .matchArpTpa(Ip4Address.valueOf(ip.getIpAddress()))
- .build();
+ private void setFakeGatewayArpRuleByExternalIp(IpAddress ipAddress, boolean install) {
- TrafficTreatment treatment = DefaultTrafficTreatment.builder()
- .setArpOp(ARP.OP_REPLY)
- .setArpSha(MacAddress.valueOf(gatewayMac))
- .setArpSpa(Ip4Address.valueOf(ip.getIpAddress()))
- .setOutput(PortNumber.IN_PORT)
- .build();
+ TrafficSelector selector = DefaultTrafficSelector.builder()
+ .matchEthType(EthType.EtherType.ARP.ethType().toShort())
+ .matchArpOp(ARP.OP_REQUEST)
+ .matchArpTpa(ipAddress.getIp4Address())
+ .build();
- osNodeService.completeNodes(GATEWAY).forEach(n ->
- osFlowRuleService.setRule(
- appId,
- n.intgBridge(),
- selector,
- treatment,
- PRIORITY_ARP_GATEWAY_RULE,
- GW_COMMON_TABLE,
- install
- )
- );
+ TrafficTreatment treatment = DefaultTrafficTreatment.builder()
+ .setArpOp(ARP.OP_REPLY)
+ .setArpSha(MacAddress.valueOf(gatewayMac))
+ .setArpSpa(ipAddress.getIp4Address())
+ .setOutput(PortNumber.IN_PORT)
+ .build();
- if (install) {
- log.info("Install ARP Rule for Gateway Snat {}", ip.getIpAddress());
- } else {
- log.info("Uninstall ARP Rule for Gateway Snat {}", ip.getIpAddress());
- }
- });
+ osNodeService.completeNodes(GATEWAY).forEach(n ->
+ osFlowRuleService.setRule(
+ appId,
+ n.intgBridge(),
+ selector,
+ treatment,
+ PRIORITY_ARP_GATEWAY_RULE,
+ GW_COMMON_TABLE,
+ install
+ )
+ );
+
+ if (install) {
+ log.info("Install ARP Rule for Gateway Snat {}", ipAddress);
+ } else {
+ log.info("Uninstall ARP Rule for Gateway Snat {}", ipAddress);
+ }
}
/**
@@ -613,14 +589,16 @@
case OPENSTACK_PORT_CREATED:
case OPENSTACK_PORT_UPDATED:
eventExecutor.execute(() ->
- setFakeGatewayArpRuleByIps(
- (Set<IP>) event.port().getFixedIps(), true)
+ setFakeGatewayArpRuleByExternalIp(
+ IpAddress.valueOf(event.port().getFixedIps().stream().findAny().get().getIpAddress()),
+ true)
);
break;
case OPENSTACK_PORT_REMOVED:
eventExecutor.execute(() ->
- setFakeGatewayArpRuleByIps(
- (Set<IP>) event.port().getFixedIps(), false)
+ setFakeGatewayArpRuleByExternalIp(
+ IpAddress.valueOf(event.port().getFixedIps().stream().findAny().get().getIpAddress()),
+ false)
);
break;
default:
@@ -650,27 +628,20 @@
switch (event.type()) {
case OPENSTACK_ROUTER_CREATED:
+ // add a router with external gateway
+ case OPENSTACK_ROUTER_GATEWAY_ADDED:
+ // add a gateway manually after adding a router
eventExecutor.execute(() ->
// add a router with external gateway
setFakeGatewayArpRuleByRouter(event.subject(), true)
);
break;
case OPENSTACK_ROUTER_REMOVED:
- eventExecutor.execute(() ->
- // remove a router with external gateway
- setFakeGatewayArpRuleByRouter(event.subject(), false)
- );
- break;
- case OPENSTACK_ROUTER_GATEWAY_ADDED:
- eventExecutor.execute(() ->
- // add a gateway manually after adding a router
- setFakeGatewayArpRuleByGateway(event.subject().getId(), true)
- );
- break;
+ // remove a router with external gateway
case OPENSTACK_ROUTER_GATEWAY_REMOVED:
+ // remove a gateway from an existing router
eventExecutor.execute(() ->
- // remove a gateway from an existing router
- setFakeGatewayArpRuleByGateway(event.subject().getId(), false)
+ setFakeGatewayArpRuleByRouter(event.subject(), false)
);
break;
case OPENSTACK_FLOATING_IP_ASSOCIATED:
@@ -880,8 +851,7 @@
private boolean isGwSelectedByComputeNode(Set<OpenstackNode> gws,
OpenstackNode computeNode,
OpenstackNode gwNode) {
- return OpenstackNetworkingUtil
- .getGwByComputeDevId(gws, computeNode.intgBridge())
+ return getGwByComputeDevId(gws, computeNode.intgBridge())
.intgBridge().equals(gwNode.intgBridge());
}
@@ -908,6 +878,7 @@
if (getArpMode() == null) {
return;
}
+ log.info("ARP mode is {}", getArpMode());
switch (getArpMode()) {
case ARP_PROXY_MODE:
@@ -968,6 +939,7 @@
install
);
+ log.info("calling setFakeGatewayArpRuleByRouter.. ");
osRouterAdminService.routers().stream()
.filter(router -> router.getExternalGatewayInfo() != null)
.forEach(router -> setFakeGatewayArpRuleByRouter(router, install));
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
index 807cc7a..87496a5 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingIcmpHandler.java
@@ -60,17 +60,14 @@
import org.onosproject.store.service.ConsistentMap;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
-import org.openstack4j.model.network.ExternalGateway;
import org.openstack4j.model.network.Port;
import org.openstack4j.model.network.Router;
import org.openstack4j.model.network.RouterInterface;
import org.openstack4j.model.network.Subnet;
-import org.openstack4j.openstack.networking.domain.NeutronIP;
import org.slf4j.Logger;
import java.nio.ByteBuffer;
import java.util.Objects;
-import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
@@ -85,6 +82,8 @@
import static org.onosproject.openstacknetworking.api.Constants.GW_COMMON_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_INTERNAL_ROUTING_RULE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalPeerRouterFromSubnet;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getExternalIpFromSubnet;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
import static org.slf4j.LoggerFactory.getLogger;
@@ -320,30 +319,20 @@
// this is a request to an external network
log.trace("Icmp request to external {} from {}", dstIp, srcIp);
- RouterInterface routerInterface = routerInterface(srcSubnet);
- if (routerInterface == null) {
- log.warn(ERR_REQ + "failed to get router interface");
- return false;
- }
- ExternalGateway externalGateway = externalGateway(routerInterface);
- if (externalGateway == null) {
- log.warn(ERR_REQ + "failed to get external gateway");
- return false;
- }
-
- ExternalPeerRouter externalPeerRouter = osNetworkService.externalPeerRouter(externalGateway);
- if (externalPeerRouter == null) {
- log.warn(ERR_REQ + "failed to get external peer router");
- return false;
- }
-
- IpAddress externalIp = getExternalIp(externalGateway, routerInterface);
+ IpAddress externalIp = getExternalIpFromSubnet(srcSubnet, osRouterService, osNetworkService);
if (externalIp == null) {
log.warn(ERR_REQ + "failed to get external ip");
return false;
}
+ ExternalPeerRouter externalPeerRouter =
+ externalPeerRouterFromSubnet(srcSubnet, osRouterService, osNetworkService);
+ if (externalPeerRouter == null) {
+ log.warn(ERR_REQ + "failed to get external peer router");
+ return false;
+ }
+
String icmpInfoKey = icmpInfoKey(icmp,
externalIp.toString(),
IPv4.fromIPv4Address(ipPacket.getDestinationAddress()));
@@ -369,24 +358,6 @@
.concat(srcIp)
.concat(dstIp);
}
- private RouterInterface routerInterface(Subnet subnet) {
- checkNotNull(subnet);
- return osRouterService.routerInterfaces().stream()
- .filter(i -> Objects.equals(i.getSubnetId(), subnet.getId()))
- .findAny().orElse(null);
- }
-
- private ExternalGateway externalGateway(RouterInterface osRouterIface) {
- checkNotNull(osRouterIface);
- Router osRouter = osRouterService.router(osRouterIface.getId());
- if (osRouter == null) {
- return null;
- }
- if (osRouter.getExternalGatewayInfo() == null) {
- return null;
- }
- return osRouter.getExternalGatewayInfo();
- }
private boolean handleEchoReply(IPv4 ipPacket, ICMP icmp) {
String icmpInfoKey = icmpInfoKey(icmp,
@@ -432,38 +403,6 @@
return routableGateways.contains(dstIp);
}
- private IpAddress getExternalIp(ExternalGateway externalGateway, RouterInterface osRouterIface) {
- checkNotNull(externalGateway);
- checkNotNull(osRouterIface);
-
- Router osRouter = osRouterService.router(osRouterIface.getId());
- if (osRouter == null) {
- return null;
- }
-
- Port exGatewayPort = osNetworkService.ports(externalGateway.getNetworkId())
- .stream()
- .filter(port -> Objects.equals(port.getDeviceId(), osRouter.getId()))
- .findAny().orElse(null);
- if (exGatewayPort == null) {
- final String error = String.format(ERR_REQ +
- "no external gateway port for router (ID:%s, name:%s)",
- osRouter.getId(), osRouter.getName());
- throw new IllegalStateException(error);
- }
- Optional<NeutronIP> externalIpAddress =
- (Optional<NeutronIP>) exGatewayPort.getFixedIps().stream().findFirst();
- if (!externalIpAddress.isPresent() || externalIpAddress.get().getIpAddress() == null) {
- final String error = String.format(ERR_REQ +
- "no external gateway IP address for router (ID:%s, name:%s)",
- osRouter.getId(), osRouter.getName());
- log.warn(error);
- return null;
- }
-
- return IpAddress.valueOf(externalIpAddress.get().getIpAddress());
- }
-
private void processRequestForGateway(IPv4 ipPacket, InstancePort instPort) {
ICMP icmpReq = (ICMP) ipPacket.getPayload();
icmpReq.setChecksum((short) 0);
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
index 17f4c55..86187ea 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/impl/OpenstackRoutingSnatHandler.java
@@ -56,18 +56,14 @@
import org.onosproject.store.service.DistributedSet;
import org.onosproject.store.service.Serializer;
import org.onosproject.store.service.StorageService;
-import org.openstack4j.model.network.ExternalGateway;
import org.openstack4j.model.network.IP;
import org.openstack4j.model.network.Network;
import org.openstack4j.model.network.NetworkType;
import org.openstack4j.model.network.Port;
-import org.openstack4j.model.network.Router;
-import org.openstack4j.model.network.RouterInterface;
import org.openstack4j.model.network.Subnet;
import org.slf4j.Logger;
import java.nio.ByteBuffer;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.stream.Collectors;
@@ -78,6 +74,8 @@
import static org.onosproject.openstacknetworking.api.Constants.GW_COMMON_TABLE;
import static org.onosproject.openstacknetworking.api.Constants.OPENSTACK_NETWORKING_APP_ID;
import static org.onosproject.openstacknetworking.api.Constants.PRIORITY_SNAT_RULE;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.externalPeerRouterFromSubnet;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getExternalIpFromSubnet;
import static org.onosproject.openstacknode.api.OpenstackNode.NodeType.GATEWAY;
import static org.slf4j.LoggerFactory.getLogger;
@@ -187,13 +185,14 @@
IpAddress srcIp = IpAddress.valueOf(iPacket.getSourceAddress());
Subnet srcSubnet = getSourceSubnet(srcInstPort, srcIp);
- IpAddress externalGatewayIp = getExternalIp(srcSubnet);
+ IpAddress externalGatewayIp = getExternalIpFromSubnet(srcSubnet, osRouterService, osNetworkService);
if (externalGatewayIp == null) {
return;
}
- ExternalPeerRouter externalPeerRouter = externalPeerRouter(srcSubnet);
+ ExternalPeerRouter externalPeerRouter =
+ externalPeerRouterFromSubnet(srcSubnet, osRouterService, osNetworkService);
if (externalPeerRouter == null) {
return;
}
@@ -210,26 +209,6 @@
externalGatewayIp, externalPeerRouter);
}
- private ExternalPeerRouter externalPeerRouter(Subnet subnet) {
- RouterInterface osRouterIface = osRouterService.routerInterfaces().stream()
- .filter(i -> Objects.equals(i.getSubnetId(), subnet.getId()))
- .findAny().orElse(null);
- if (osRouterIface == null) {
- return null;
- }
-
- Router osRouter = osRouterService.router(osRouterIface.getId());
- if (osRouter == null) {
- return null;
- }
- if (osRouter.getExternalGatewayInfo() == null) {
- return null;
- }
-
- ExternalGateway exGatewayInfo = osRouter.getExternalGatewayInfo();
- return osNetworkService.externalPeerRouter(exGatewayInfo);
- }
-
private Subnet getSourceSubnet(InstancePort instance, IpAddress srcIp) {
Port osPort = osNetworkService.port(instance.portId());
IP fixedIp = osPort.getFixedIps().stream()
@@ -241,47 +220,6 @@
return osNetworkService.subnet(fixedIp.getSubnetId());
}
- private IpAddress getExternalIp(Subnet srcSubnet) {
- RouterInterface osRouterIface = osRouterService.routerInterfaces().stream()
- .filter(i -> Objects.equals(i.getSubnetId(), srcSubnet.getId()))
- .findAny().orElse(null);
- if (osRouterIface == null) {
- // this subnet is not connected to the router
- log.trace(ERR_PACKETIN + "source subnet(ID:{}, CIDR:{}) has no router",
- srcSubnet.getId(), srcSubnet.getCidr());
- return null;
- }
-
- Router osRouter = osRouterService.router(osRouterIface.getId());
- if (osRouter.getExternalGatewayInfo() == null) {
- // this router does not have external connectivity
- log.trace(ERR_PACKETIN + "router({}) has no external gateway",
- osRouter.getName());
- return null;
- }
-
- ExternalGateway exGatewayInfo = osRouter.getExternalGatewayInfo();
- if (!exGatewayInfo.isEnableSnat()) {
- // SNAT is disabled in this router
- log.trace(ERR_PACKETIN + "router({}) SNAT is disabled", osRouter.getName());
- return null;
- }
-
- // TODO fix openstack4j for ExternalGateway provides external fixed IP list
- Port exGatewayPort = osNetworkService.ports(exGatewayInfo.getNetworkId())
- .stream()
- .filter(port -> Objects.equals(port.getDeviceId(), osRouter.getId()))
- .findAny().orElse(null);
- if (exGatewayPort == null) {
- log.trace(ERR_PACKETIN + "no external gateway port for router({})",
- osRouter.getName());
- return null;
- }
-
- return IpAddress.valueOf(exGatewayPort.getFixedIps().stream()
- .findFirst().get().getIpAddress());
- }
-
private void populateSnatFlowRules(InboundPacket packetIn, InstancePort srcInstPort,
TpPort patPort, IpAddress externalIp, ExternalPeerRouter externalPeerRouter) {
Network osNet = osNetworkService.network(srcInstPort.networkId());
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 25a7e41..cb58fcf 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -60,6 +60,7 @@
import org.onosproject.openstacknetworking.api.InstancePort;
import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
+import org.onosproject.openstacknetworking.api.OpenstackRouterService;
import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
import org.onosproject.openstacknode.api.OpenstackAuth;
import org.onosproject.openstacknode.api.OpenstackAuth.Perspective;
@@ -939,6 +940,98 @@
}
+
+ /**
+ * Returns the external peer router with specified subnet information.
+ *
+ * @param subnet openstack subnet
+ * @param osRouterService openstack router service
+ * @param osNetworkService openstack network service
+ * @return external peer router
+ */
+ public static ExternalPeerRouter externalPeerRouterFromSubnet(Subnet subnet, OpenstackRouterService osRouterService,
+ OpenstackNetworkService osNetworkService) {
+ Router osRouter = getRouterFromSubnet(subnet, osRouterService);
+ if (osRouter == null) {
+ return null;
+ }
+ if (osRouter.getExternalGatewayInfo() == null) {
+ // this router does not have external connectivity
+ log.trace("router({}) has no external gateway",
+ osRouter.getName());
+ return null;
+ }
+
+ return osNetworkService.externalPeerRouter(osRouter.getExternalGatewayInfo());
+ }
+
+ /**
+ * Returns the external ip address with specified router information.
+ *
+ * @param srcSubnet source subnet
+ * @param osRouterService openstack router service
+ * @param osNetworkService openstack network service
+ * @return external ip address
+ */
+ public static IpAddress getExternalIpFromSubnet(Subnet srcSubnet, OpenstackRouterService osRouterService,
+ OpenstackNetworkService osNetworkService) {
+
+ Router osRouter = getRouterFromSubnet(srcSubnet, osRouterService);
+
+ if (osRouter.getExternalGatewayInfo() == null) {
+ // this router does not have external connectivity
+ log.trace("router({}) has no external gateway",
+ osRouter.getName());
+ return null;
+ }
+
+ return getExternalIp(osRouter, osNetworkService);
+ }
+
+ /**
+ * Returns the external ip address with specified router information.
+ *
+ * @param router openstack router
+ * @param osNetworkService openstack network service
+ * @return external ip address
+ */
+ public static IpAddress getExternalIp(Router router, OpenstackNetworkService osNetworkService) {
+ if (router == null) {
+ return null;
+ }
+
+ ExternalGateway externalGateway = router.getExternalGatewayInfo();
+ if (externalGateway == null || !externalGateway.isEnableSnat()) {
+ log.trace("Failed to get externalIp for router {} because externalGateway is null or SNAT is disabled",
+ router.getId());
+ return null;
+ }
+
+ // TODO fix openstack4j for ExternalGateway provides external fixed IP list
+ Port exGatewayPort = osNetworkService.ports(externalGateway.getNetworkId())
+ .stream()
+ .filter(port -> Objects.equals(port.getDeviceId(), router.getId()))
+ .findAny().orElse(null);
+
+ if (exGatewayPort == null) {
+ return null;
+ }
+
+ return IpAddress.valueOf(exGatewayPort.getFixedIps().stream()
+ .findAny().get().getIpAddress());
+ }
+
+ private static Router getRouterFromSubnet(Subnet subnet, OpenstackRouterService osRouterService) {
+ RouterInterface osRouterIface = osRouterService.routerInterfaces().stream()
+ .filter(i -> Objects.equals(i.getSubnetId(), subnet.getId()))
+ .findAny().orElse(null);
+ if (osRouterIface == null) {
+ return null;
+ }
+
+ return osRouterService.router(osRouterIface.getId());
+ }
+
private static boolean isDirectPort(String portName) {
return portNamePrefixMap().values().stream().anyMatch(p -> portName.startsWith(p));
}
diff --git a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index f21a250..f855a2b 100644
--- a/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/openstacknetworking/app/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -110,6 +110,9 @@
<ref component-id="instanceIpAddressCompleter"/>
</completers>
</command>
+ <command>
+ <action class="org.onosproject.openstacknetworking.cli.OpenstackRouterInterfaceListCommand" />
+ </command>
</command-bundle>
<bean id="ipAddressCompleter" class="org.onosproject.openstacknetworking.cli.IpAddressCompleter"/>