X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fvpnmanager%2FVpnInterfaceManager.java;h=50466d2697fbbcc43b227fe463a873aeff4ca84f;hb=8ce872b0b929e39d41f94ce2313f789403533b6a;hp=b9e38a564c6fb922c63f9866249f5159724275aa;hpb=08ba938c488a04dcb24d15a2048848f5f5be2430;p=netvirt.git diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java index b9e38a564c..50466d2697 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java @@ -72,10 +72,6 @@ import org.opendaylight.netvirt.vpnmanager.arp.responder.ArpResponderHandler; import org.opendaylight.netvirt.vpnmanager.populator.input.L3vpnInput; import org.opendaylight.netvirt.vpnmanager.populator.intfc.VpnPopulator; import org.opendaylight.netvirt.vpnmanager.populator.registry.L3vpnRegistry; -import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; -import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface; -import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey; -import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.vpn._interface.VpnInstanceNames; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; @@ -94,13 +90,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev15033 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AdjacenciesOp; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.NeutronRouterDpns; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency.AdjacencyType; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnList; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnListKey; @@ -115,6 +107,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTarget; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.Subnets; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.Adjacencies; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.VpnInterfaces; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.Adjacency; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.Adjacency.AdjacencyType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.AdjacencyBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterface; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNames; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NetworkAttributes.NetworkType; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPort; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -758,12 +758,13 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase gatewayIpOptional = vpnUtil.getVpnSubnetGatewayIp(subnetId); if (gatewayIpOptional.isPresent()) { @@ -906,7 +907,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase writeOperTxn) { VpnInterfaceOpDataEntry opInterface = - VpnUtil.getVpnInterfaceOpDataEntry(interfaceName, vpnName, aug, dpnId, lportTag, gwMac); + VpnUtil.getVpnInterfaceOpDataEntry(interfaceName, vpnName, aug, dpnId, lportTag, gwMac, gwIp); InstanceIdentifier interfaceId = VpnUtil .getVpnInterfaceOpDataEntryIdentifier(interfaceName, vpnName); writeOperTxn.put(interfaceId, opInterface, CREATE_MISSING_PARENTS); @@ -953,7 +954,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase value = new ArrayList<>(); - boolean isNextHopAddReqd = false; + boolean isFibNextHopAddReqd = false; String vpnName = vpnInterface.getVpnInstanceName(); Uint32 vpnId = vpnUtil.getVpnId(vpnName); String primaryRd = vpnUtil.getPrimaryRd(vpnName); @@ -969,12 +970,13 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase nextHopList = adj.getNextHopIpList(); // If TEP is added , update the nexthop of primary adjacency. // Secondary adj nexthop is already pointing to primary adj IP address. - if (nextHopList == null || nextHopList.isEmpty()) { - isNextHopAddReqd = true; - } - if (adj.getAdjacencyType() == AdjacencyType.PrimaryAdjacency) { value.add(new AdjacencyBuilder(adj).setNextHopIpList(nhList).build()); + if (nextHopList != null && !nextHopList.isEmpty()) { + /* everything right already */ + } else { + isFibNextHopAddReqd = true; + } } else { Optional vrfEntryOptional = FibHelper.getVrfEntry(dataBroker, primaryRd, prefix); if (!vrfEntryOptional.isPresent()) { @@ -983,12 +985,12 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase getVpnsExportingMyRoute(final String vpnName) { List vpnsToExportRoute = new ArrayList<>(); - + final VpnInstanceOpDataEntry vpnInstanceOpDataEntry; String vpnRd = vpnUtil.getVpnRd(vpnName); - final VpnInstanceOpDataEntry vpnInstanceOpDataEntry = vpnUtil.getVpnInstanceOpData(vpnRd); - if (vpnInstanceOpDataEntry == null) { - LOG.debug("getVpnsExportingMyRoute: Could not retrieve vpn instance op data for {}" - + " to check for vpns exporting the routes", vpnName); + try { + VpnInstanceOpDataEntry opDataEntry = vpnUtil.getVpnInstanceOpData(vpnRd); + if (opDataEntry == null) { + LOG.error("getVpnsExportingMyRoute: Null vpn instance op data for vpn {} rd {}" + + " when check for vpns exporting the routes", vpnName, vpnRd); + return vpnsToExportRoute; + } + vpnInstanceOpDataEntry = opDataEntry; + } catch (Exception re) { + LOG.error("getVpnsExportingMyRoute: DSexception when retrieving vpn instance op data for vpn {} rd {}" + + " to check for vpns exporting the routes", vpnName, vpnRd, re); return vpnsToExportRoute; } - Predicate excludeVpn = input -> { if (input.getVpnInstanceName() == null) { LOG.error("getVpnsExportingMyRoute.excludeVpn: Received vpn instance with rd {} without a name", @@ -1385,16 +1394,22 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase identifier = VpnUtil .getVpnInterfaceOpDataEntryIdentifier(interfaceName, vpnName); - InstanceIdentifier path = identifier.augmentation(AdjacenciesOp.class); - Optional adjacencies = SingleTransactionDataBroker.syncReadOptional(dataBroker, - LogicalDatastoreType.OPERATIONAL, path); - boolean isLearntIP = false; + Optional vpnInterfaceOpDataEnteryOptional = + SingleTransactionDataBroker.syncReadOptional(dataBroker, + LogicalDatastoreType.OPERATIONAL, identifier); + boolean isNonPrimaryAdjIp = false; String primaryRd = vpnUtil.getVpnRd(vpnName); LOG.info("removeAdjacenciesFromVpn: For interface {} on dpn {} RD recovered for vpn {} as rd {}", interfaceName, dpnId, vpnName, primaryRd); - if (adjacencies.isPresent() && adjacencies.get().getAdjacency() != null - && !adjacencies.get().getAdjacency().isEmpty()) { - List nextHops = adjacencies.get().getAdjacency(); + if (!vpnInterfaceOpDataEnteryOptional.isPresent()) { + LOG.error("removeAdjacenciesFromVpn: VpnInterfaceOpDataEntry-Oper DS is absent for Interface {} " + + "on vpn {} dpn {}", interfaceName, vpnName, dpnId); + return; + } + AdjacenciesOp adjacencies = vpnInterfaceOpDataEnteryOptional.get().augmentation(AdjacenciesOp.class); + + if (adjacencies != null && !adjacencies.getAdjacency().isEmpty()) { + List nextHops = adjacencies.getAdjacency(); LOG.info("removeAdjacenciesFromVpn: NextHops for interface {} on dpn {} for vpn {} are {}", interfaceName, dpnId, vpnName, nextHops); for (Adjacency nextHop : nextHops) { @@ -1402,19 +1417,21 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase nhList; if (nextHop.getAdjacencyType() != AdjacencyType.PrimaryAdjacency) { nhList = getNextHopForNonPrimaryAdjacency(nextHop, vpnName, dpnId, interfaceName); - isLearntIP = nextHop.getAdjacencyType() == AdjacencyType.LearntIp ? true : false; + isNonPrimaryAdjIp = Boolean.TRUE; } else { // This is a primary adjacency nhList = nextHop.getNextHopIpList() != null ? nextHop.getNextHopIpList() : emptyList(); removeGwMacAndArpResponderFlows(nextHop, vpnId, dpnId, lportTag, gwMac, + vpnInterfaceOpDataEnteryOptional.get().getGatewayIpAddress(), interfaceName, writeInvTxn); + isNonPrimaryAdjIp = Boolean.FALSE; } if (!nhList.isEmpty()) { if (Objects.equals(primaryRd, vpnName)) { @@ -1424,14 +1441,14 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase nhList, String vpnName, String primaryRd, - Uint64 dpnId, String rd, String interfaceName, + Uint64 dpnId, String rd, String interfaceName, boolean isNonPrimaryAdjIp, TypedWriteTransaction writeConfigTxn, TypedWriteTransaction writeOperTx) { List vpnsToImportRoute = vpnUtil.getVpnsImportingMyRoute(vpnName); nhList.forEach((nh) -> { //IRT: remove routes from other vpns importing it - vpnManager.removePrefixFromBGP(vpnName, primaryRd, rd, interfaceName, nextHop.getIpAddress(), - nextHop.getNextHopIpList().get(0), nh, dpnId, writeConfigTxn, writeOperTx); + if (isNonPrimaryAdjIp) { + removeLearntPrefixFromBGP(rd, nextHop.getIpAddress(), nh, writeConfigTxn); + } else { + vpnManager.removePrefixFromBGP(vpnName, primaryRd, rd, interfaceName, nextHop.getIpAddress(), + nextHop.getNextHopIpList().get(0), nh, dpnId, writeConfigTxn, writeOperTx); + } for (VpnInstanceOpDataEntry vpn : vpnsToImportRoute) { String vpnRd = vpn.getVrfId(); if (vpnRd != null) { @@ -1530,8 +1551,28 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase writeConfigTxn) { + try { + if (!fibManager.checkFibEntryExist(dataBroker, rd, prefix, nextHop)) { + LOG.info("removeLearntPrefixFromBGP: IP {} with nexthop {} rd {} is already removed.Ignoring this" + + " operation", prefix, nextHop, rd); + return; + } + LOG.info("removeLearntPrefixFromBGP: VPN WITHDRAW: Removing Fib Entry rd {} prefix {} nexthop {}", + rd, prefix, nextHop); + fibManager.removeOrUpdateFibEntry(rd, prefix, nextHop, writeConfigTxn); + bgpManager.withdrawPrefix(rd, prefix); // TODO: Might be needed to include nextHop here + LOG.info("removeLearntPrefixFromBGP: VPN WITHDRAW: Removed Fib Entry rd {} prefix {} nexthop {}", + rd, prefix, nextHop); + } catch (Exception e) { + LOG.error("removeLearntPrefixFromBGP: Delete prefix {} rd {} nextHop {} failed", prefix, rd, nextHop, e); + } + } + private void removeGwMacAndArpResponderFlows(Adjacency nextHop, Uint32 vpnId, Uint64 dpnId, - int lportTag, String gwMac, String interfaceName, + int lportTag, String gwMac, String gwIp, String interfaceName, TypedReadWriteTransaction writeInvTxn) throws ExecutionException, InterruptedException { final Uuid subnetId = nextHop.getSubnetId(); @@ -1541,7 +1582,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase> updateVpnInstanceAdjChange(VpnInterface original, VpnInterface update, String vpnInterfaceName, List> futures) { @@ -1807,8 +1854,13 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase