import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
import org.opendaylight.genius.mdsalutil.BucketInfo;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIdsKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnListKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.extra.routes.Routes;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NetworkAttributes;
LOG.error("unlockCluster: Unable to unlock {}", lockName, e);
}
}
+
+ public boolean isInterfacePresentInDpn(String vpnName, BigInteger dpnId) {
+ InstanceIdentifier<VpnToDpnList> vpnToDpnListId = InstanceIdentifier.builder(VpnInstanceOpData.class)
+ .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(vpnName))
+ .child(VpnToDpnList.class, new VpnToDpnListKey(dpnId)).build();
+ try {
+ VpnToDpnList vpnToDpnList = SingleTransactionDataBroker.syncRead(dataBroker,
+ LogicalDatastoreType.OPERATIONAL, vpnToDpnListId);
+ if (!(vpnToDpnList == null) && !(vpnToDpnList.getVpnInterfaces() == null)
+ && !vpnToDpnList.getVpnInterfaces().isEmpty()) {
+ return true;
+ }
+ } catch (ReadFailedException e) {
+ LOG.warn("Failed to read interfaces with error {}", e.getMessage());
+ }
+ return false;
+ }
}
if (vrfTable.isPresent()) {
synchronized (vpnInstance.getVpnInstanceName().intern()) {
futures.add(retryingTxRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> {
+ String vpnName = fibUtil.getVpnNameFromId(vpnInstance.getVpnId());
for (final VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
/* Handle subnet routes here */
SubnetRoute subnetRoute = vrfEntry.augmentation(SubnetRoute.class);
- if (subnetRoute != null) {
+ if (subnetRoute != null && !fibUtil
+ .isInterfacePresentInDpn(vrfEntry.getParentVpnRd(), dpnId)) {
LOG.trace("SUBNETROUTE: cleanUpDpnForVpn: Cleaning subnetroute {} on dpn {}"
+ " for vpn {}", vrfEntry.getDestPrefix(), dpnId, rd);
baseVrfEntryHandler.makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, null,
// to which prefix is attached at this point
List<String> usedRds = VpnExtraRouteHelper.getUsedRds(dataBroker,
vpnInstance.getVpnId(), vrfEntry.getDestPrefix());
- String vpnName = fibUtil.getVpnNameFromId(vpnInstance.getVpnId());
Optional<Routes> extraRouteOptional;
//Is this fib route an extra route? If yes, get the nexthop which would be
//an adjacency in the vpn
bgpRouteVrfEntryHandler.deleteRemoteRoute(null, dpnId, vpnId,
vrfTable.get().key(), vrfEntry, extraRouteOptional, tx, txnObjects);
} else {
- baseVrfEntryHandler.deleteRemoteRoute(null, dpnId, vpnId, vrfTable.get().key(),
- vrfEntry, extraRouteOptional, tx);
+ if (subnetRoute == null || !fibUtil
+ .isInterfacePresentInDpn(vrfEntry.getParentVpnRd(), dpnId)) {
+ baseVrfEntryHandler.deleteRemoteRoute(null, dpnId, vpnId,
+ vrfTable.get().key(), vrfEntry, extraRouteOptional, tx);
+ }
}
}
}));
package org.opendaylight.netvirt.natservice.ha;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import javax.inject.Singleton;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
public Routers getRouter(String routerId) {
return routerMap.get(routerId);
}
+
+ public Set<Map.Entry<String,Routers>> getAllRouters() {
+ return routerMap.entrySet();
+ }
}
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.mdsalutil.ActionInfo;
import org.opendaylight.genius.mdsalutil.BucketInfo;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
+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.VpnInterfacesBuilder;
+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.VpnInterfaceBuilder;
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.AllocateIdInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
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.AdjacenciesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortDataBuilder;
+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.learnt.vpn.vip.to.port.data.LearntVpnVipToPort;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
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.ext.routers.routers.ExternalIps;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
protected final IInterfaceManager interfaceManager;
protected final IVpnFootprintService vpnFootprintService;
protected final IFibManager fibManager;
+ protected final NatDataUtil natDataUtil;
protected AbstractSnatService(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
final ItmRpcService itmManager, final OdlInterfaceRpcService odlInterfaceRpcService,
final IdManagerService idManager, final NAPTSwitchSelector naptSwitchSelector,
final IInterfaceManager interfaceManager,
final IVpnFootprintService vpnFootprintService,
- final IFibManager fibManager) {
+ final IFibManager fibManager, final NatDataUtil natDataUtil) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.itmManager = itmManager;
this.odlInterfaceRpcService = odlInterfaceRpcService;
this.vpnFootprintService = vpnFootprintService;
this.fibManager = fibManager;
+ this.natDataUtil = natDataUtil;
}
protected DataBroker getDataBroker() {
@Override
public boolean handleSnatAllSwitch(Routers routers, BigInteger primarySwitchId, int addOrRemove) {
- LOG.debug("handleSnatAllSwitch : Handle Snat in all switches");
+ LOG.info("handleSnatAllSwitch : Handle Snat in all switches for router {}", routers.getRouterName());
String routerName = routers.getRouterName();
List<BigInteger> switches = naptSwitchSelector.getDpnsForVpn(routerName);
/*
* Primary switch handled separately since the pseudo port created may
* not be present in the switch list on delete.
*/
+ boolean isLastRouterDelete = false;
+ if (addOrRemove == NwConstants.DEL_FLOW) {
+ isLastRouterDelete = NatUtil.isLastExternalRouter(routers.getNetworkId()
+ .getValue(), routers.getRouterName(), natDataUtil);
+ LOG.info("handleSnatAllSwitch : action is delete for router {} and isLastRouterDelete is {}",
+ routers.getRouterName(), isLastRouterDelete);
+ }
handleSnat(routers, primarySwitchId, primarySwitchId, addOrRemove);
for (BigInteger dpnId : switches) {
if (primarySwitchId != dpnId) {
handleSnat(routers, primarySwitchId, dpnId, addOrRemove);
}
}
-
+ if (isLastRouterDelete) {
+ removeLearntIpPorts(routers);
+ removeMipAdjacencies(routers);
+ }
return true;
}
// Handle non NAPT switches and NAPT switches separately
if (!dpnId.equals(primarySwitchId)) {
- LOG.debug("handleSnat : Handle non NAPT switch {}", dpnId);
+ LOG.info("handleSnat : Handle non NAPT switch {} for router {}", dpnId, routers.getRouterName());
installSnatCommonEntriesForNonNaptSwitch(routers, primarySwitchId, dpnId, addOrRemove);
installSnatSpecificEntriesForNonNaptSwitch(routers, dpnId, addOrRemove);
} else {
- LOG.debug("handleSnat : Handle NAPT switch {}", dpnId);
+ LOG.info("handleSnat : Handle NAPT switch {} for router {}", dpnId, routers.getRouterName());
installSnatCommonEntriesForNaptSwitch(routers, dpnId, addOrRemove);
installSnatSpecificEntriesForNaptSwitch(routers, dpnId, addOrRemove);
return null;
}
+ protected void removeMipAdjacencies(Routers routers) {
+ LOG.info("removeMipAdjacencies for router {}", routers.getRouterName());
+ String externalSubNetId = null;
+ for (ExternalIps externalIp : routers.getExternalIps()) {
+ if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
+ // In this class we handle only IPv4 use-cases.
+ continue;
+ }
+ externalSubNetId = externalIp.getSubnetId().getValue();
+ break;
+ }
+ if (externalSubNetId == null) {
+ LOG.info("removeMipAdjacencies no external Ipv4 address present on router {}",
+ routers.getRouterName());
+ return;
+ }
+ InstanceIdentifier<VpnInterfaces> vpnInterfacesId =
+ InstanceIdentifier.builder(VpnInterfaces.class).build();
+ try {
+ VpnInterfaces vpnInterfaces = SingleTransactionDataBroker.syncRead(dataBroker,
+ LogicalDatastoreType.CONFIGURATION, vpnInterfacesId);
+ List<VpnInterface> updatedVpnInterface = new ArrayList<>();
+ for (VpnInterface vpnInterface : vpnInterfaces.getVpnInterface()) {
+ List<Adjacency> updatedAdjacencies = new ArrayList<>();
+ Adjacencies adjacencies = vpnInterface.augmentation(Adjacencies.class);
+ if (null != adjacencies) {
+ for (Adjacency adjacency : adjacencies.getAdjacency()) {
+ if (!adjacency.getSubnetId().getValue().equals(externalSubNetId)) {
+ updatedAdjacencies.add(adjacency);
+ }
+ }
+ }
+ AdjacenciesBuilder adjacenciesBuilder = new AdjacenciesBuilder();
+ adjacenciesBuilder.setAdjacency(updatedAdjacencies);
+ VpnInterfaceBuilder vpnInterfaceBuilder = new VpnInterfaceBuilder(vpnInterface);
+ vpnInterfaceBuilder.addAugmentation(Adjacencies.class, adjacenciesBuilder.build());
+ updatedVpnInterface.add(vpnInterfaceBuilder.build());
+ }
+ VpnInterfacesBuilder vpnInterfacesBuilder = new VpnInterfacesBuilder();
+ vpnInterfacesBuilder.setVpnInterface(updatedVpnInterface);
+
+ SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+ vpnInterfacesId, vpnInterfacesBuilder.build());
+ } catch (ReadFailedException e) {
+ LOG.warn("Failed to read removeMipAdjacencies with error {}", e.getMessage());
+ } catch (TransactionCommitFailedException e) {
+ LOG.warn("Failed to remove removeMipAdjacencies with error {}", e.getMessage());
+ }
+ }
+
+ private void removeLearntIpPorts(Routers routers) {
+ LOG.info("removeLearntIpPorts for router {} and network {}", routers.getRouterName(), routers.getNetworkId());
+ String networkId = routers.getNetworkId().getValue();
+ LearntVpnVipToPortData learntVpnVipToPortData = NatUtil.getLearntVpnVipToPortData(dataBroker);
+ LearntVpnVipToPortDataBuilder learntVpnVipToPortDataBuilder = new LearntVpnVipToPortDataBuilder();
+ List<LearntVpnVipToPort> learntVpnVipToPortList = new ArrayList<>();
+ for (LearntVpnVipToPort learntVpnVipToPort : learntVpnVipToPortData.getLearntVpnVipToPort()) {
+ if (!learntVpnVipToPort.getVpnName().equals(networkId)) {
+ LOG.info("The learned port belongs to Vpn {} hence not removing", learntVpnVipToPort.getVpnName());
+ learntVpnVipToPortList.add(learntVpnVipToPort);
+ } else {
+ String externalSubNetId = null;
+ for (ExternalIps externalIp : routers.getExternalIps()) {
+ if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
+ // In this class we handle only IPv4 use-cases.
+ continue;
+ }
+ externalSubNetId = externalIp.getSubnetId().getValue();
+ break;
+ }
+ if (externalSubNetId == null) {
+ LOG.info("removeLearntIpPorts no external Ipv4 address present on router {}",
+ routers.getRouterName());
+ return;
+ }
+ String prefix = learntVpnVipToPort.getPortFixedip() + "/32";
+ NatUtil.deletePrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker,
+ externalSubNetId), prefix);
+ }
+ }
+
+ try {
+ learntVpnVipToPortDataBuilder.setLearntVpnVipToPort(learntVpnVipToPortList);
+ InstanceIdentifier<LearntVpnVipToPortData> learntVpnVipToPortDataId = NatUtil
+ .getLearntVpnVipToPortDataId();
+ SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
+ learntVpnVipToPortDataId, learntVpnVipToPortDataBuilder.build());
+
+ } catch (TransactionCommitFailedException e) {
+ LOG.warn("Failed to remove removeLearntIpPorts with error {}", e.getMessage());
+ }
+ }
+
static int mostSignificantBit(int value) {
return 31 - Integer.numberOfLeadingZeros(value);
}
import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
IdManagerService idManager, NAPTSwitchSelector naptSwitchSelector,
OdlInterfaceRpcService odlInterfaceRpcService,
IInterfaceManager interfaceManager, IVpnFootprintService vpnFootprintService,
- IFibManager fibManager) {
+ IFibManager fibManager, NatDataUtil natDataUtil) {
super(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService, idManager, naptSwitchSelector,
- interfaceManager, vpnFootprintService, fibManager);
+ interfaceManager, vpnFootprintService, fibManager, natDataUtil);
}
@Override
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
IdManagerService idManager, NAPTSwitchSelector naptSwitchSelector,
IInterfaceManager interfaceManager,
IVpnFootprintService vpnFootprintService,
- IFibManager fibManager) {
+ IFibManager fibManager, NatDataUtil natDataUtil) {
super(dataBroker, mdsalManager, itmManager, idManager, naptSwitchSelector,
- odlInterfaceRpcService, interfaceManager, vpnFootprintService, fibManager);
+ odlInterfaceRpcService, interfaceManager, vpnFootprintService, fibManager ,
+ natDataUtil);
}
@Override
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.netvirt.elanmanager.api.IElanService;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.group.input.buckets.bucket.action.action.NxActionResubmitRpcAddGroupCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoad;
+import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.slf4j.Logger;
}
+ public static DpnInterfaces getElanInterfaceInfoByElanDpn(String elanInstanceName, BigInteger dpId,
+ DataBroker broker) {
+ InstanceIdentifier<DpnInterfaces> elanDpnInterfacesId =
+ getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId);
+ DpnInterfaces dpnInterfaces = null;
+ try {
+ dpnInterfaces = SingleTransactionDataBroker.syncRead(broker, LogicalDatastoreType.OPERATIONAL,
+ elanDpnInterfacesId);
+ }
+ catch (ReadFailedException e) {
+ LOG.warn("Failed to read ElanDpnInterfacesList with error {}", e.getMessage());
+ }
+ return dpnInterfaces;
+ }
+
+ public static <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
+ InstanceIdentifier<T> path) {
+ try (ReadOnlyTransaction tx = broker.newReadOnlyTransaction()) {
+ return tx.read(datastoreType, path).get();
+ } catch (InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static boolean isLastExternalRouter(String networkid, String routerName, NatDataUtil natDataUtil) {
+ Set<Map.Entry<String,Routers>> extRouter = natDataUtil.getAllRouters();
+ for (Map.Entry<String,Routers> router : extRouter) {
+ if (!router.getKey().equals(routerName) && router.getValue().getNetworkId().getValue()
+ .equals(networkid)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static InstanceIdentifier<ExtRouters> buildExtRouters() {
+ InstanceIdentifier<ExtRouters> extRouterInstanceIndentifier = InstanceIdentifier.builder(ExtRouters.class)
+ .build();
+ return extRouterInstanceIndentifier;
+ }
+
+ public static LearntVpnVipToPortData getLearntVpnVipToPortData(DataBroker dataBroker) {
+ InstanceIdentifier<LearntVpnVipToPortData> learntVpnVipToPortDataId = getLearntVpnVipToPortDataId();
+ LearntVpnVipToPortData learntVpnVipToPortData = null;
+ try {
+ learntVpnVipToPortData = SingleTransactionDataBroker.syncRead(dataBroker,
+ LogicalDatastoreType.OPERATIONAL, learntVpnVipToPortDataId);
+ }
+ catch (ReadFailedException e) {
+ LOG.warn("Failed to read LearntVpnVipToPortData with error {}", e.getMessage());
+ }
+ return learntVpnVipToPortData;
+ }
+
+ public static InstanceIdentifier<LearntVpnVipToPortData> getLearntVpnVipToPortDataId() {
+ InstanceIdentifier<LearntVpnVipToPortData> learntVpnVipToPortDataId = InstanceIdentifier
+ .builder(LearntVpnVipToPortData.class).build();
+ return learntVpnVipToPortDataId;
+ }
+
public static InstanceIdentifier<DpnInterfaces> getElanDpnInterfaceOperationalDataPath(String elanInstanceName,
BigInteger dpId) {
return InstanceIdentifier.builder(ElanDpnInterfaces.class)
import org.opendaylight.infrautils.inject.AbstractLifecycle;
import org.opendaylight.netvirt.elanmanager.api.IElanService;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
private final IElanService elanManager;
private final IInterfaceManager interfaceManager;
private final IVpnFootprintService vpnFootprintService;
- protected final IFibManager fibManager;
+ private final IFibManager fibManager;
+ private final NatDataUtil natDataUtil;
@Inject
public SnatServiceImplFactory(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
final IElanService elanManager,
final IInterfaceManager interfaceManager,
final IVpnFootprintService vpnFootprintService,
- final IFibManager fibManager) {
+ final IFibManager fibManager,
+ final NatDataUtil natDataUtil) {
this.dataBroker = dataBroker;
this.mdsalManager = mdsalManager;
this.itmManager = itmManager;
this.interfaceManager = interfaceManager;
this.vpnFootprintService = vpnFootprintService;
this.fibManager = fibManager;
+ this.natDataUtil = natDataUtil;
}
@Override
if (natMode == NatMode.Conntrack) {
return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
- idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager);
+ idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager, natDataUtil);
}
return null;
}
NatConstants.ODL_VNI_POOL_NAME);
return new VxlanGreConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager,
- vpnFootprintService, fibManager);
+ vpnFootprintService, fibManager, natDataUtil);
}
return null;
}
import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
import org.opendaylight.netvirt.elanmanager.api.IElanService;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.natservice.ha.NatDataUtil;
import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
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;
ExternalRoutersListener externalRouterListener, IElanService elanManager,
IInterfaceManager interfaceManager,
IVpnFootprintService vpnFootprintService,
- IFibManager fibManager) {
+ IFibManager fibManager, NatDataUtil natDataUtil) {
super(dataBroker, mdsalManager, itmManager, idManager, naptSwitchSelector, odlInterfaceRpcService,
- interfaceManager, vpnFootprintService, fibManager);
+ interfaceManager, vpnFootprintService, fibManager, natDataUtil);
this.externalRouterListener = externalRouterListener;
this.elanManager = elanManager;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
operTx, confTx);
Optional<VpnInterfaceOpDataEntry> optVpnInterface = operTx.read(
LogicalDatastoreType.OPERATIONAL, vpnInterfaceOpIdentifier).get();
- VpnInterfaceOpDataEntry vpnInterfaceOpDataEntry = optVpnInterface.get();
- long vpnId = VpnUtil.getVpnId(dataBroker, newVpnName);
- VpnUtil.removePrefixToInterfaceAdj(dataBroker, adj, vpnId,
- vpnInterfaceOpDataEntry, operTx);
+ if (optVpnInterface.isPresent()) {
+ VpnInterfaceOpDataEntry vpnInterfaceOpDataEntry = optVpnInterface.get();
+ long vpnId = VpnUtil.getVpnId(dataBroker, newVpnName);
+ VpnUtil.removePrefixToInterfaceAdj(dataBroker, adj, vpnId,
+ vpnInterfaceOpDataEntry, operTx);
+ } else {
+ LOG.info("Vpninterface {} not present in Operational",
+ vpnInterfaceName);
+ }
//remove FIB entry
String vpnRd = VpnUtil.getVpnRd(dataBroker, newVpnName);
LOG.debug("update: remove prefix {} from the FIB and BGP entry "