import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
-import com.google.common.base.Optional;
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
-
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
+import java.util.Optional;
import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
import org.opendaylight.genius.infra.Datastore.Configuration;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.genius.infra.TypedReadWriteTransaction;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
import org.opendaylight.netvirt.fibmanager.api.IFibManager;
import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
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.floating.ip.info.RouterPorts;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.ports.InternalToExternalPortMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.ports.InternalToExternalPortMapKey;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.common.Uint32;
import org.slf4j.LoggerFactory;
@Singleton
-public class NatTepChangeListener extends
- AsyncDataTreeChangeListenerBase<TunnelEndPoints, NatTepChangeListener> {
+public class NatTepChangeListener extends AbstractAsyncDataTreeChangeListener<TunnelEndPoints> {
private static final Logger LOG = LoggerFactory
.getLogger(NatTepChangeListener.class);
final SnatServiceManager natServiceManager,
final JobCoordinator coordinator,
final NatOverVxlanUtil natOverVxlanUtil) {
- super(TunnelEndPoints.class, NatTepChangeListener.class);
+ super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(DpnEndpoints.class)
+ .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build(),
+ Executors.newListeningSingleThreadExecutor("NatTepChangeListener", LOG));
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.defaultRouteProgrammer = defaultRouteProgrammer;
}
}
- @Override
- @PostConstruct
public void init() {
LOG.info("{} init", getClass().getSimpleName());
- registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
}
@Override
- protected InstanceIdentifier<TunnelEndPoints> getWildCardPath() {
- return InstanceIdentifier.builder(DpnEndpoints.class)
- .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build();
+ @PreDestroy
+ public void close() {
+ super.close();
+ Executors.shutdownAndAwaitTermination(getExecutorService());
}
@Override
- protected void remove(InstanceIdentifier<TunnelEndPoints> key,
+ public void remove(InstanceIdentifier<TunnelEndPoints> key,
TunnelEndPoints tep) {
/*
* Whenever the TEP on a given DPNID is removed, this API take care
}
@Override
- protected void update(InstanceIdentifier<TunnelEndPoints> key,
+ public void update(InstanceIdentifier<TunnelEndPoints> key,
TunnelEndPoints origTep, TunnelEndPoints updatedTep) {
// Will be handled in NatTunnelInterfaceStateListener.add()
LOG.debug("NO ACTION duing update event : {}", updatedTep.key());
}
@Override
- protected void add(InstanceIdentifier<TunnelEndPoints> key,
+ public void add(InstanceIdentifier<TunnelEndPoints> key,
TunnelEndPoints tep) {
LOG.debug("NO ACTION duing add event : {}", tep.key());
}
.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
LogicalDatastoreType.OPERATIONAL, dpnRoutersListId);
if (optionalRouterDpnList.isPresent()) {
- routersList = optionalRouterDpnList.get().getRoutersList();
+ routersList = new ArrayList<RoutersList>(optionalRouterDpnList.get().getRoutersList().values());
} else {
LOG.debug(
"NAT Service : RouterDpnList is empty for DPN {}. Hence ignoring TEP DEL event",
+ "associated to the router {}", routerName);
InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerName);
- Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType
- .CONFIGURATION, routerPortsId);
+ Optional<RouterPorts> optRouterPorts;
+ try {
+ optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+ LogicalDatastoreType.CONFIGURATION, routerPortsId);
+ } catch (ExecutionException | InterruptedException e) {
+ LOG.error("hndlTepDelForDnatInEachRtr: Exception while reading RouterPorts DS for the router {}",
+ routerName, e);
+ return isFipExists;
+ }
if (!optRouterPorts.isPresent()) {
LOG.debug(
"hndlTepDelForDnatInEachRtr : DNAT -> Could not read Router Ports data object with id: {} "
l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId);
}
}
- List<Ports> interfaces = routerPorts.getPorts();
- for (Ports port : interfaces) {
+ Map<PortsKey, Ports> interfacesMap = routerPorts.getPorts();
+ for (Ports port : interfacesMap.values()) {
//Get the DPN on which this interface resides
String interfaceName = port.getPortName();
Uint64 fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
continue;
}
isFipExists = Boolean.TRUE;
- List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
- for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+ Map<InternalToExternalPortMapKey, InternalToExternalPortMap> keyInternalToExternalPortMapMap
+ = port.getInternalToExternalPortMap();
+ for (InternalToExternalPortMap intExtPortMap : keyInternalToExternalPortMapMap.values()) {
String internalIp = intExtPortMap.getInternalIp();
String externalIp = intExtPortMap.getExternalIp();
externalIp = NatUtil.validateAndAddNetworkMask(externalIp);
// Check if this is externalRouter else ignore
InstanceIdentifier<Routers> extRoutersId = NatUtil.buildRouterIdentifier(routerName);
- Optional<Routers> routerData = Optional.absent();
+ Optional<Routers> routerData = Optional.empty();
try {
routerData = confTx.read(extRoutersId).get();
} catch (InterruptedException | ExecutionException e) {
+ "associated to the router {}", routerVpnId, routerName);
}
//Re-elect the other available switch as the NAPT switch and program the NAT flows.
- NatUtil
- .removeSNATFromDPN(dataBroker, mdsalManager, idManager, naptSwitchHA, dpnId,
- routerName, routerId, routerVpnId, networkId, extNwProvType, confTx);
+ String externalVpnName = NatUtil.getAssociatedVPN(dataBroker,
+ routerData.get().getNetworkId());
+ NatUtil.removeSNATFromDPN(dataBroker, mdsalManager, idManager, naptSwitchHA, dpnId,
+ routerData.get(), routerId, routerVpnId, externalVpnName, extNwProvType, confTx);
} else {
LOG.info(
"hndlTepDelForSnatInEachRtr : SNAT is not enabled for router {} to handle addDPN event {}",
}
}
}
-
- @Override
- protected NatTepChangeListener getDataTreeChangeListener() {
- return this;
- }
}