import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.TepsInNotHostedTransportZoneKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
return tunType ;
}
+ public static List<BigInteger> getDpIdFromTransportzone(DataBroker dataBroker, String tzone) {
+ List<BigInteger> listOfDpId = new ArrayList<>();
+ InstanceIdentifier<TransportZone> path = InstanceIdentifier.builder(TransportZones.class)
+ .child(TransportZone.class, new TransportZoneKey(tzone)).build();
+ Optional<TransportZone> transportZoneOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
+ path, dataBroker);
+ if (transportZoneOptional.isPresent()) {
+ TransportZone transportZone = transportZoneOptional.get();
+ if (transportZone.getVteps() != null && !transportZone.getVteps().isEmpty()) {
+ List<Vteps> vtepsList = transportZone.getVteps();
+ if (vtepsList != null && !vtepsList.isEmpty()) {
+ for (Vteps vtep : vtepsList) {
+ listOfDpId.add(vtep.getDpnId());
+ }
+ }
+ }
+ }
+ return listOfDpId;
+ }
}
import java.time.Duration;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.tunnel.end.points.TzMembership;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.DpnsTeps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.dpns.teps.RemoteDpns;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnel.list.InternalTunnel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelListKey;
private final IMdsalApiManager imdsalApiManager;
private final DataTreeEventCallbackRegistrar eventCallbacks;
private final ManagedNewTransactionRunner txRunner;
+ private final IInterfaceManager interfaceManager;
+ private final DpnTepStateCache dpnTepStateCache;
@Inject
public ItmTepInstanceRecoveryHandler(DataBroker dataBroker,
tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils, ofEndPointCache, itmConfig);
serviceRecoveryRegistry.registerServiceRecoveryRegistry(getServiceRegistryKey(), this);
+ this.interfaceManager = interfaceManager;
+ this.dpnTepStateCache = dpnTepStateCache;
}
private String getServiceRegistryKey() {
jobCoordinator.enqueueJob(tzName, tepRemoveWorker);
AtomicInteger eventCallbackCount = new AtomicInteger(0);
AtomicInteger eventRegistrationCount = new AtomicInteger(0);
- tunnelList.stream().filter(internalTunnel -> Objects.equals(internalTunnel
- .getDestinationDPN(), dpnTepsToRecover.getDPNID()) || Objects.equals(
- internalTunnel.getSourceDPN(), dpnTepsToRecover.getDPNID())).forEach(internalTunnel -> {
- eventRegistrationCount.incrementAndGet();
- interfaceListToRecover.add(String.valueOf(internalTunnel.getTunnelInterfaceNames())); });
+ if (interfaceManager.isItmDirectTunnelsEnabled()) {
+ Collection<DpnsTeps> dpnsTeps = dpnTepStateCache.getAllPresent();
+ for (DpnsTeps dpnTep : dpnsTeps) {
+ List<RemoteDpns> rmtdpns = dpnTep.getRemoteDpns();
+ for (RemoteDpns remoteDpn : rmtdpns) {
+ if (remoteDpn.getDestinationDpnId().equals(dpnTepsToRecover.getDPNID())
+ || dpnTep.getSourceDpnId().equals(dpnTepsToRecover.getDPNID())) {
+ eventRegistrationCount.incrementAndGet();
+ interfaceListToRecover.add(remoteDpn.getTunnelName());
+ }
+ }
+ }
+ LOG.trace("List of tunnels to be recovered : {}", interfaceListToRecover);
+ } else {
+ tunnelList.stream().filter(internalTunnel -> Objects.equals(internalTunnel
+ .getDestinationDPN(), dpnTepsToRecover.getDPNID()) || Objects.equals(
+ internalTunnel.getSourceDPN(), dpnTepsToRecover.getDPNID())).forEach(internalTunnel -> {
+ eventRegistrationCount.incrementAndGet();
+ interfaceListToRecover.add(String.valueOf(internalTunnel.getTunnelInterfaceNames()));
+ });
+ }
if (!interfaceListToRecover.isEmpty()) {
interfaceListToRecover.forEach(interfaceName -> {
}
}
-
private void recreateTEP(String tzName, List tepts, AtomicInteger eventCallbackCount, int registeredEventSize) {
eventCallbackCount.incrementAndGet();
if (eventCallbackCount.intValue() == registeredEventSize || registeredEventSize == 0) {
ItmTepAddWorker tepAddWorker = new ItmTepAddWorker(tepts, null, dataBroker, imdsalApiManager,
itmInternalTunnelAddWorker, itmExternalTunnelAddWorker);
jobCoordinator.enqueueJob(tzName, tepAddWorker);
- } else {
- LOG.trace("{} call back events registered for {} tunnel interfaces",
- registeredEventSize, eventCallbackCount);
}
}
*/
package org.opendaylight.genius.itm.recovery.impl;
+import java.math.BigInteger;
import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
+import org.opendaylight.genius.itm.cache.DpnTepStateCache;
import org.opendaylight.genius.itm.globals.ITMConstants;
import org.opendaylight.genius.itm.impl.ItmUtils;
import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractSyncDataTreeChangeListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.DpnsTeps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.dpns.teps.RemoteDpns;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelListKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
private final EntityOwnershipUtils entityOwnershipUtils;
private final DataTreeEventCallbackRegistrar eventCallbacks;
private final EntityOwnershipService entityOwnershipService;
+ private final IInterfaceManager interfaceManager;
+ private final DpnTepStateCache dpnTepStateCache;
@Inject
public ItmTzInstanceRecoveryHandler(DataBroker dataBroker,
ServiceRecoveryRegistry serviceRecoveryRegistry,
EntityOwnershipUtils entityOwnershipUtils,
EntityOwnershipService entityOwnershipService,
- DataTreeEventCallbackRegistrar eventCallbacks) {
+ DataTreeEventCallbackRegistrar eventCallbacks,
+ IInterfaceManager interfaceManager,
+ DpnTepStateCache dpnTepStateCache) {
super(dataBroker, LogicalDatastoreType.OPERATIONAL,
InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class));
this.dataBroker = dataBroker;
this.entityOwnershipService = entityOwnershipService;
serviceRecoveryRegistry.registerServiceRecoveryRegistry(getServiceRegistryKey(), this);
this.eventCallbacks = eventCallbacks;
+ this.interfaceManager = interfaceManager;
+ this.dpnTepStateCache = dpnTepStateCache;
+
}
private String getServiceRegistryKey() {
private void recoverTransportZone(String entityId) throws InterruptedException {
//List of Internel tunnels
- List<String> tunnelList = ItmUtils.getInternalTunnelInterfaces(dataBroker);
+ List<String> tunnelList = new ArrayList<>();
+ if (interfaceManager.isItmDirectTunnelsEnabled()) {
+ Collection<DpnsTeps> dpnsTeps = dpnTepStateCache.getAllPresent();
+ List<BigInteger> listOfDpnIds = ItmUtils.getDpIdFromTransportzone(dataBroker, entityId);
+ for (DpnsTeps dpnTep : dpnsTeps) {
+ List<RemoteDpns> rmtdpns = dpnTep.getRemoteDpns();
+ for (RemoteDpns remoteDpn : rmtdpns) {
+ if (listOfDpnIds.contains(remoteDpn.getDestinationDpnId())) {
+ tunnelList.add(remoteDpn.getTunnelName());
+ }
+ }
+ }
+ LOG.trace("List of tunnels to be recovered : {}", tunnelList);
+ } else {
+ //List of Internal tunnels
+ tunnelList.addAll(ItmUtils.getInternalTunnelInterfaces(dataBroker));
+ }
LOG.debug("List of tunnel interfaces: {}" , tunnelList);
InstanceIdentifier<TransportZone> tzII = ItmUtils.getTZInstanceIdentifier(entityId);
TransportZone tz = ItmUtils.getTransportZoneFromConfigDS(entityId , dataBroker);
LOG.trace("TunnelStateKey: {} for interface: {}", tlKey, tunnelInterface);
InstanceIdentifier<StateTunnelList> stListId = ItmUtils.buildStateTunnelListId(tlKey);
eventCallbacks.onRemove(LogicalDatastoreType.OPERATIONAL, stListId, (unused) -> {
- LOG.trace("callback event for a delete {} interface instance", stListId);
+ LOG.trace("on removal of {}, event callback triggered", stListId);
// recreating the transportZone
recreateTZ(entityId, tz, tzII, tunnelList.size(), eventCallbackCount);
return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
recreateTZ(entityId, tz, tzII, tunnelList.size(), eventCallbackCount); });
});
} else {
+ LOG.trace("List of tunnels to be recovered is empty, still recreate transportzone {}",entityId);
recreateTZ(entityId, tz, tzII, tunnelList.size(), eventCallbackCount);
}
}
txRunner.callWithNewWriteOnlyTransactionAndSubmit(
tx -> tx.merge(LogicalDatastoreType.CONFIGURATION, tzII, tz))),
ITMConstants.JOB_MAX_RETRIES);
- } else {
- LOG.trace("{} call back events registered for {} tunnel interfaces",
- registeredEvents, sizeOfTunnelList);
}
}
}
\ No newline at end of file