X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnservice%2Fnatservice%2Fnatservice-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fnatservice%2Finternal%2FExternalRoutersListener.java;h=11e93f7d590715b1c38930d62e19e361d6ff9d55;hb=40225932b081167984c687222f44e1d696360758;hp=bb663b06021520d7bc5e5fe5aa7c325b28e1e624;hpb=c508fb6cf9be5b01f33e3b92461ab31e916fc7c2;p=netvirt.git diff --git a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java index bb663b0602..11e93f7d59 100644 --- a/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java +++ b/vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java @@ -184,9 +184,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase extIps = routers.getExternalIps(); + installNaptPfibExternalOutputFlow(dpnId, extVpnId, extIps); + } - String ip = getExternalIpFromRouter(routers); - Uuid subnetId = getSubnetIdOfIp(ip); + protected void installNaptPfibExternalOutputFlow(String routerName, Long routerId, BigInteger dpnId) { + Long extVpnId = NatUtil.getVpnId(dataBroker, routerId); + if (extVpnId == null || extVpnId == NatConstants.INVALID_ID) { + LOG.debug("installNaptPfibExternalOutputFlow - not found extVpnId for router {}", routerId); + extVpnId = routerId; + } + List externalIps = NatUtil.getExternalIpsFromRouter(dataBroker, routerName); + installNaptPfibExternalOutputFlow(dpnId, extVpnId, externalIps); + } - if (subnetId != null) { - FlowEntity postNaptFlowEntity = buildNaptFibExternalOutputFlowEntity(dpnId, extVpnId, subnetId, ip); - mdsalManager.installFlow(postNaptFlowEntity); + private void installNaptPfibExternalOutputFlow(BigInteger dpnId, Long extVpnId, List externalIps) { + if (externalIps == null || externalIps.isEmpty()) { + LOG.debug("installNaptPfibExternalOutputFlow - empty external Ips list for dpnId {} extVpnId {}", + dpnId, extVpnId); + return; + } + for (String ip : externalIps) { + Uuid subnetId = getSubnetIdForFixedIp(ip); + if (subnetId != null) { + LOG.debug("installNaptPfibExternalOutputFlow - dpnId {} extVpnId {} subnetId {} ip {}", + dpnId, extVpnId, subnetId, ip); + FlowEntity postNaptFlowEntity = buildNaptFibExternalOutputFlowEntity(dpnId, extVpnId, subnetId, ip); + mdsalManager.installFlow(postNaptFlowEntity); + } } } - private Uuid getSubnetIdOfIp(String ip) { + private Uuid getSubnetIdForFixedIp(String ip) { if (ip != null) { IpAddress externalIpv4Address = new IpAddress(new Ipv4Address(ip)); Port port = NatUtil.getNeutronPortForRouterGetewayIp(dataBroker, externalIpv4Address); @@ -391,15 +410,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase extIps = routers.getExternalIps(); - if (extIps != null && !extIps.isEmpty()) { - return extIps.get(0); - } - return null; - } - - private void subnetRegisterMapping(Routers routerEntry,Long segmentId) { + protected void subnetRegisterMapping(Routers routerEntry,Long segmentId) { List subnetList = null; List externalIps = null; LOG.debug("NAT Service : Fetching values from extRouters model"); @@ -664,7 +675,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase> future = fibService.createFibEntry(input); return JdkFutureAdapters.listenInPoolThread(future); } else { @@ -1075,7 +1087,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase identifier, Routers original, Routers update) { String routerName = original.getRouterName(); Long routerId = NatUtil.getVpnId(dataBroker, routerName); - BigInteger dpnId = NatUtil.getPrimaryNaptfromRouterId(dataBroker, routerId); + BigInteger dpnId = NatUtil.getPrimaryNaptfromRouterName(dataBroker, routerName); Uuid networkId = original.getNetworkId(); // Check if its update on SNAT flag @@ -1094,8 +1106,14 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase externalIps = NatUtil.getExternalIpsForRouter(dataBroker,routerId); handleDisableSnat(original, networkUuid, externalIps, false, null, dpnId); } else { + // Allocate Primary Napt Switch for existing router + BigInteger primarySwitchId = getPrimaryNaptSwitch(routerName, routerId); + if(primarySwitchId == null || primarySwitchId.equals(BigInteger.ZERO)){ + LOG.error("NAT Service: Failed to get or allocated NAPT switch in ExternalRouterListener.Update()"); + return; + } LOG.info("NAT Service : SNAT enabled for Router {}", original.getRouterName()); - handleEnableSnat(original, routerId, dpnId); + handleEnableSnat(original, routerId, primarySwitchId); } } @@ -1453,7 +1471,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase externalIps = NatUtil.getExternalIpsForRouter(dataBroker, routerId); handleDisableSnat(router, networkUuid, externalIps, true, null, primarySwitchId); @@ -1475,9 +1493,21 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase externalIps) { + protected void removeNaptFibExternalOutputFlows(long routerId, BigInteger dpnId, Uuid networkId, + List externalIps) { + Long extVpnId = null; + if (networkId != null) { + Uuid vpnUuid = NatUtil.getVpnIdfromNetworkId(dataBroker, networkId); + if (vpnUuid != null) { + extVpnId = NatUtil.getVpnId(dataBroker, vpnUuid.getValue()); + } else { + LOG.debug("NAT Service: removeNaptFibExternalOutputFlows - vpnUuid is null"); + } + } else { + LOG.debug("NAT Service: removeNaptFibExternalOutputFlows - networkId is null"); + extVpnId = NatUtil.getVpnId(dataBroker, routerId); + } + if (extVpnId == null || extVpnId == NatConstants.INVALID_ID) { + LOG.debug("removeNaptFibExternalOutputFlows - extVpnId not found for routerId {}", routerId); + extVpnId = routerId; + } for (String ip : externalIps) { String extIp = removeMaskFromIp(ip); - String postNaptFlowRef = getFlowRefNaptFib(dpnId, NwConstants.NAPT_PFIB_TABLE, routerId, extIp); - LOG.info("NAT Service : Remove the flow in the " + NwConstants.NAPT_PFIB_TABLE + " for the active switch with the DPN ID {} and router ID {} and IP {}", dpnId, routerId, extIp); - mdsalManager.removeFlow(NatUtil.buildFlowEntity(dpnId,NwConstants.NAPT_PFIB_TABLE, postNaptFlowRef)); + String naptFlowRef = getFlowRefNaptFib(dpnId, NwConstants.NAPT_PFIB_TABLE, extVpnId, extIp); + LOG.info("NAT Service: Remove the flow in the " + NwConstants.NAPT_PFIB_TABLE + " for the active switch" + + " with the DPN ID {} and router ID {} and IP {} flowRef {}", dpnId, routerId, extIp, naptFlowRef); + mdsalManager.removeFlow(NatUtil.buildFlowEntity(dpnId,NwConstants.NAPT_PFIB_TABLE, naptFlowRef)); } } @@ -2295,7 +2331,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase matches = new ArrayList<>();