import com.google.common.base.Optional;
import com.google.common.util.concurrent.ListenableFuture;
import java.math.BigInteger;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
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.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.Datastore.Configuration;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.tunnel.optional.params.TunnelOptions;
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.OvsBridgeRefInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.ovs.bridge.ref.info.OvsBridgeRefEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.ovs.bridge.ref.info.OvsBridgeRefEntryKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpointsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnTepsState;
private final IInterfaceManager interfaceManager;
private final OvsBridgeRefEntryCache ovsBridgeRefEntryCache;
private final OfEndPointCache ofEndPointCache;
+ private final DataTreeEventCallbackRegistrar eventCallbacks;
public ItmInternalTunnelAddWorker(DataBroker dataBroker, JobCoordinator jobCoordinator,
TunnelMonitoringConfig tunnelMonitoringConfig, ItmConfig itmCfg,
DirectTunnelUtils directTunnelUtil,
IInterfaceManager interfaceManager,
OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
- OfEndPointCache ofEndPointCache) {
+ OfEndPointCache ofEndPointCache,
+ DataTreeEventCallbackRegistrar eventCallbacks) {
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.jobCoordinator = jobCoordinator;
this.interfaceManager = interfaceManager;
this.ovsBridgeRefEntryCache = ovsBridgeRefEntryCache;
this.ofEndPointCache = ofEndPointCache;
+ this.eventCallbacks = eventCallbacks;
isTunnelMonitoringEnabled = tunnelMonitoringConfig.isTunnelMonitoringEnabled();
monitorProtocol = tunnelMonitoringConfig.getMonitorProtocol();
.getOvsBridgeReference().getValue();
LOG.debug("adding port to the bridge:{} tunnelName: {}", bridgeIid, tunnelName);
addPortToBridge(bridgeIid, iface, tunnelName);
+ } else {
+ LOG.debug("Bridge not found. Registering Eventcallback for dpid {}", dpId);
+
+ InstanceIdentifier<OvsBridgeRefEntry> bridgeRefEntryFromDS =
+ InstanceIdentifier.builder(OvsBridgeRefInfo.class)
+ .child(OvsBridgeRefEntry.class, new OvsBridgeRefEntryKey(dpId)).build();
+
+ eventCallbacks.onAdd(LogicalDatastoreType.OPERATIONAL, bridgeRefEntryFromDS, (refEntryIid) -> {
+ addPortToBridgeOnCallback(iface, iface.getName(), refEntryIid);
+ return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
+ }, Duration.ofMillis(5000), (id) -> {
+ try {
+ Optional<OvsBridgeRefEntry> ovsBridgeRefEntryOnCallback = ovsBridgeRefEntryCache.get(dpId);
+ InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIidOnCallback =
+ (InstanceIdentifier<OvsdbBridgeAugmentation>) ovsBridgeRefEntryOnCallback.get()
+ .getOvsBridgeReference().getValue();
+ addPortToBridge(bridgeIidOnCallback, iface, iface.getName());
+ } catch (ReadFailedException e) {
+ LOG.error("Bridge not found in DS/cache for dpId {}", dpId);
+ }
+ });
}
}
}
}
return (ofEndPointCache.get(dpId) == null);
}
+
+ private void addPortToBridgeOnCallback(Interface iface, String portName, OvsBridgeRefEntry bridgeRefEntry) {
+ InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
+ (InstanceIdentifier<OvsdbBridgeAugmentation>) bridgeRefEntry.getOvsBridgeReference().getValue();
+ addPortToBridge(bridgeIid, iface, portName);
+ }
}
import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.Datastore;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
private final ItmExternalTunnelAddWorker externalTunnelAddWorker;
private final DPNTEPsInfoCache dpnTEPsInfoCache;
private final ManagedNewTransactionRunner txRunner;
+ private final DataTreeEventCallbackRegistrar eventCallbacks;
@Inject
public TransportZoneListener(final DataBroker dataBroker,
final OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
final IInterfaceManager interfaceManager,
final OfEndPointCache ofEndPointCache,
- final ServiceRecoveryRegistry serviceRecoveryRegistry) {
+ final ServiceRecoveryRegistry serviceRecoveryRegistry,
+ final DataTreeEventCallbackRegistrar eventCallbacks) {
super(dataBroker, LogicalDatastoreType.CONFIGURATION,
InstanceIdentifier.create(TransportZones.class).child(TransportZone.class));
this.dataBroker = dataBroker;
this.itmConfig = itmConfig;
this.dpnTEPsInfoCache = dpnTEPsInfoCache;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
+ this.eventCallbacks = eventCallbacks;
initializeTZNode();
this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
- ovsBridgeRefEntryCache, ofEndPointCache);
+ ovsBridgeRefEntryCache, ofEndPointCache, eventCallbacks);
this.externalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig, dpnTEPsInfoCache);
serviceRecoveryRegistry.addRecoverableListener(ItmServiceRecoveryHandler.getServiceRegistryKey(), this);
}
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.itm.cache.OfEndPointCache;
import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
@Mock EntityOwnershipUtils entityOwnershipUtils;
ItmInternalTunnelAddWorker itmInternalTunnelAddWorker;
DirectTunnelUtils directTunnelUtils;
+ DataTreeEventCallbackRegistrar eventCallbacks;
Optional<TunnelMonitorParams> tunnelMonitorParamsOptional;
Optional<TunnelMonitorInterval> tunnelMonitorIntervalOptional;
new TunnelMonitoringConfig(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
itmConfig, directTunnelUtils, interfaceManager,
new OvsBridgeRefEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
- new OfEndPointCache());
+ new OfEndPointCache(), eventCallbacks);
}
@After