.child(OvsBridgeRefEntry.class, new OvsBridgeRefEntryKey(dpId)).build();
eventCallbacks.onAdd(LogicalDatastoreType.OPERATIONAL, bridgeRefEntryFromDS, (refEntryIid) -> {
- addPortToBridgeOnCallback(iface, iface.getName(), refEntryIid);
+ addPortToBridgeOnCallback(iface, tunnelName, refEntryIid);
return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
}, Duration.ofMillis(5000), (id) -> {
try {
import org.opendaylight.genius.infra.TypedWriteTransaction;
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.itm.cache.DpnTepStateCache;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
import org.opendaylight.genius.itm.cache.TunnelStateCache;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeLogicalGroup;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.bridge.tunnel.info.OvsBridgeEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.bridge.tunnel.info.OvsBridgeEntryKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.bridge.tunnel.info.ovs.bridge.entry.OvsBridgeTunnelEntry;
private final OvsBridgeRefEntryCache ovsBridgeRefEntryCache;
private final TunnelStateCache tunnelStateCache;
private final DirectTunnelUtils directTunnelUtils;
+ private final OfEndPointCache ofEndPointCache;
+ private final ItmConfig itmConfig;
public ItmInternalTunnelDeleteWorker(DataBroker dataBroker, JobCoordinator jobCoordinator,
TunnelMonitoringConfig tunnelMonitoringConfig,
OvsBridgeEntryCache ovsBridgeEntryCache,
OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
TunnelStateCache tunnelStateCache,
- DirectTunnelUtils directTunnelUtils) {
+ DirectTunnelUtils directTunnelUtils,
+ OfEndPointCache ofEndPointCache,
+ ItmConfig itmConfig) {
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.jobCoordinator = jobCoordinator;
this.ovsBridgeRefEntryCache = ovsBridgeRefEntryCache;
this.tunnelStateCache = tunnelStateCache;
this.directTunnelUtils = directTunnelUtils;
+ this.ofEndPointCache = ofEndPointCache;
+ this.itmConfig = itmConfig;
}
@SuppressWarnings("checkstyle:IllegalCatch")
}
}
}
+
for (DPNTEPsInfo dstDpn : meshedDpnList) {
// Second, take care of Tep TZ membership and identify if tep can be removed
if (Objects.equals(srcDpn.getDPNID(), dstDpn.getDPNID())) {
return;
}
- Optional<OvsBridgeRefEntry> ovsBridgeRefEntryOptional = ovsBridgeRefEntryCache.get(dpId);
- Optional<OvsBridgeEntry> ovsBridgeEntryOptional;
- OvsdbBridgeRef ovsdbBridgeRef = null;
- if (ovsBridgeRefEntryOptional.isPresent()) {
- ovsdbBridgeRef = ovsBridgeRefEntryOptional.get().getOvsBridgeReference();
- } else {
- ovsBridgeEntryOptional = ovsBridgeEntryCache.get(dpId);
- if (ovsBridgeEntryOptional.isPresent()) {
- ovsdbBridgeRef = ovsBridgeEntryOptional.get().getOvsBridgeReference();
- }
- }
-
- if (ovsdbBridgeRef != null) {
- removeTerminationEndPoint(ovsdbBridgeRef.getValue(), interfaceName);
- }
-
- // delete tunnel ingress flow
- removeTunnelIngressFlow(tx, interfaceName, dpId);
+ OvsdbBridgeRef ovsdbBridgeRef = getOvsdbBridgeRef(dpId);
+ Optional<OvsBridgeEntry> ovsBridgeEntryOptional = ovsBridgeEntryCache.get(dpId);
// delete bridge to tunnel interface mappings
OvsBridgeEntryKey bridgeEntryKey = new OvsBridgeEntryKey(dpId);
InstanceIdentifier<OvsBridgeEntry> bridgeEntryIid =
DirectTunnelUtils.getOvsBridgeEntryIdentifier(bridgeEntryKey);
- ovsBridgeEntryOptional = ovsBridgeEntryCache.get(dpId);
+
if (ovsBridgeEntryOptional.isPresent()) {
List<OvsBridgeTunnelEntry> bridgeTunnelEntries = ovsBridgeEntryOptional.get().nonnullOvsBridgeTunnelEntry();
+
+ if (ovsdbBridgeRef != null) {
+ if (!itmConfig.isUseOfTunnels()) {
+ removeTerminationEndPoint(ovsdbBridgeRef.getValue(), interfaceName);
+ } else if (bridgeTunnelEntries.size() <= 1) {
+ removeTerminationEndPoint(ovsdbBridgeRef.getValue(), ofEndPointCache.get(dpId));
+ ofEndPointCache.remove(dpId);
+ }
+ }
+
deleteBridgeInterfaceEntry(bridgeEntryKey, bridgeTunnelEntries, bridgeEntryIid, interfaceName);
// IfIndex needs to be removed only during State Clean up not Config
- // TunnelMetaUtils.removeLportTagInterfaceMap(idManager, defaultOperationalShardTransaction, interfaceName);
- cleanUpInterfaceWithUnknownState(interfaceName, parentRefs, ifTunnel);
- directTunnelUtils.removeLportTagInterfaceMap(interfaceName);
}
+
+ directTunnelUtils.deleteTunnelStateEntry(interfaceName);
+ // delete tunnel ingress flow
+ removeTunnelIngressFlow(tx, interfaceName, dpId);
+ directTunnelUtils.removeTunnelEgressFlow(tx, dpId, interfaceName);
+ cleanUpInterfaceWithUnknownState(interfaceName, parentRefs, ifTunnel);
+ directTunnelUtils.removeLportTagInterfaceMap(interfaceName);
+ }
+
+ private OvsdbBridgeRef getOvsdbBridgeRef(BigInteger dpId) throws ReadFailedException {
+ Optional<OvsBridgeRefEntry> ovsBridgeRefEntryOptional = ovsBridgeRefEntryCache.get(dpId);
+ Optional<OvsBridgeEntry> ovsBridgeEntryOptional;
+ OvsdbBridgeRef ovsdbBridgeRef = null;
+ if (ovsBridgeRefEntryOptional.isPresent()) {
+ ovsdbBridgeRef = ovsBridgeRefEntryOptional.get().getOvsBridgeReference();
+ } else {
+ ovsBridgeEntryOptional = ovsBridgeEntryCache.get(dpId);
+ if (ovsBridgeEntryOptional.isPresent()) {
+ ovsdbBridgeRef = ovsBridgeEntryOptional.get().getOvsBridgeReference();
+ }
+ }
+ return ovsdbBridgeRef;
}
private void removeTerminationEndPoint(InstanceIdentifier<?> bridgeIid, String interfaceName) {
*/
package org.opendaylight.genius.itm.itmdirecttunnels.listeners;
-import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
import com.google.common.util.concurrent.ListenableFuture;
String portName = flowCapableNodeConnector.getName();
LOG.debug("InterfaceInventoryState Remove for {}", portName);
// ITM Direct Tunnels Return if its not tunnel port and if its not Internal
- if (!DirectTunnelUtils.TUNNEL_PORT_PREDICATE.test(portName)) {
+ if (!DirectTunnelUtils.TUNNEL_PORT_PREDICATE.test(portName) && !portName.startsWith("of")) {
LOG.debug("Node Connector Remove - {} Interface is not a tunnel I/f, so no-op", portName);
return;
} else {
try {
- if (!tunnelStateCache.isInternalBasedOnState(portName)) {
+ if (DirectTunnelUtils.TUNNEL_PORT_PREDICATE.test(portName)
+ && !tunnelStateCache.isInternalBasedOnState(portName)) {
LOG.debug("Node Connector Remove {} Interface is not a internal tunnel I/f, so no-op", portName);
return;
}
DpnTepInterfaceInfo dpnTepInfo,
boolean opStateModified, String interfaceName, String portName,
Interface.OperStatus opState) {
- if (dpnTepInfo == null && !interfaceName.equals(portName)) {
+ if (dpnTepInfo == null && !portName.startsWith("of") && !interfaceName.equals(portName)) {
return;
}
LOG.debug("updating interface state entry for {}", interfaceName);
String interfaceName,
FlowCapableNodeConnector
flowCapableNodeConnector) {
- List<ListenableFuture<Void>> futures = new ArrayList<>();
+
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
BigInteger dpId = DirectTunnelUtils.getDpnFromNodeConnectorId(nodeConnectorId);
// In a genuine port delete scenario, the reason will be there in the incoming event, for all remaining
// cases treat the event as DPN disconnect, if old and new ports are same. Else, this is a VM migration
if (flowCapableNodeConnector.getReason() != PortReason.Delete) {
//Remove event is because of connection lost between controller and switch, or switch shutdown.
// Hence, dont remove the interface but set the status as "unknown"
- futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
- tx -> updateInterfaceStateOnNodeRemove(tx, interfaceName, flowCapableNodeConnector)));
- } else {
- LOG.debug("removing interface state for interface: {}", interfaceName);
- directTunnelUtils.deleteTunnelStateEntry(interfaceName);
- DpnTepInterfaceInfo dpnTepInfo = dpnTepStateCache.getTunnelFromCache(interfaceName);
- if (dpnTepInfo != null) {
- futures.add(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
- // Do if-index and ingress flow clean-up only for tunnel-interfaces
- directTunnelUtils.removeLportTagInterfaceMap(interfaceName);
- directTunnelUtils.removeTunnelIngressFlow(tx, dpId, interfaceName);
- directTunnelUtils.removeTunnelEgressFlow(tx, dpId, interfaceName);
- }));
+ if (interfaceName.startsWith("of")) {
+ LOG.debug("Received remove state for dpid {}", dpId.intValue());
+ for (Map.Entry<String, NodeConnectorInfo> entry : meshedMap.entrySet()) {
+ if (!dpId.toString().equals(entry.getKey())) {
+ String fwdTunnel = dpnTepStateCache.getDpnTepInterface(dpId, new BigInteger(entry.getKey()))
+ .getTunnelName();
+ LOG.debug("Fwd Tunnel name for {} : {} is {}", dpId.intValue(), entry.getKey(), fwdTunnel);
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
+ tx -> updateInterfaceStateOnNodeRemove(tx, fwdTunnel, flowCapableNodeConnector)));
+ String bwdTunnel = dpnTepStateCache.getDpnTepInterface(new BigInteger(entry.getKey()), dpId)
+ .getTunnelName();
+ LOG.debug("Bwd Tunnel name for {} : {} is {}", entry.getKey(), dpId.intValue(), bwdTunnel);
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
+ tx -> updateInterfaceStateOnNodeRemove(tx, bwdTunnel,
+ entry.getValue().getNodeConnector())));
+ }
+ }
} else {
- LOG.error("DPNTEPInfo is null for Tunnel Interface {}", interfaceName);
+ futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
+ tx -> updateInterfaceStateOnNodeRemove(tx, interfaceName, flowCapableNodeConnector)));
}
+
+ } else {
+ LOG.debug("removing interface state for interface: {}", interfaceName);
+ // removing interfaces are already done in delete worker
+ meshedMap.remove(dpId.toString());
}
return futures;
}
initializeTZNode();
this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
- ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
+ ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils, ofEndPointCache, itmConfig);
this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
ovsBridgeRefEntryCache, ofEndPointCache, eventCallbacks);
dpntePsInfoCache);
this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
- ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
+ ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils, ofEndPointCache, itmConfig);
serviceRecoveryRegistry.registerServiceRecoveryRegistry(getServiceRegistryKey(), this);
}
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
import org.opendaylight.genius.itm.cache.DpnTepStateCache;
+import org.opendaylight.genius.itm.cache.OfEndPointCache;
import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
import org.opendaylight.genius.itm.cache.TunnelStateCache;
ItmInternalTunnelDeleteWorker itmInternalTunnelDeleteWorker;
UnprocessedNodeConnectorCache unprocessedNodeConnectorCache;
UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
+ OfEndPointCache ofEndPointCache;
Optional<TunnelMonitorParams> tunnelMonitorParamsOptional;
new OvsBridgeEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
new OvsBridgeRefEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
new TunnelStateCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
- directTunnelUtils);
+ directTunnelUtils, ofEndPointCache, itmConfig);
}
@After
doReturn(mockReadWriteTx).when(dataBroker).newReadWriteTransaction();
lenient().doReturn(Futures.immediateCheckedFuture(null)).when(mockReadWriteTx).submit();
doReturn(true).when(mockReadWriteTx).cancel();
+ lenient().doReturn(false).when(itmConfig).isUseOfTunnels();
}
// Since all the unit test cases will be written to the new way, this should be taken care then.