import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.MoreExecutors;
import java.math.BigInteger;
+import java.time.Duration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
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.Configuration;
import org.opendaylight.genius.infra.Datastore.Operational;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeRefInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
private final OvsInterfaceStateAddHelper ovsInterfaceStateAddHelper;
private final InterfaceMetaUtils interfaceMetaUtils;
private final SouthboundUtils southboundUtils;
+ private final DataTreeEventCallbackRegistrar eventCallbacks;
@Inject
public OvsInterfaceConfigAddHelper(@Reference DataBroker dataBroker,
InterfaceManagerCommonUtils interfaceManagerCommonUtils,
OvsInterfaceStateAddHelper ovsInterfaceStateAddHelper,
InterfaceMetaUtils interfaceMetaUtils,
- SouthboundUtils southboundUtils) {
+ SouthboundUtils southboundUtils,
+ DataTreeEventCallbackRegistrar eventCallbacks) {
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.alivenessMonitorUtils = alivenessMonitorUtils;
this.mdsalApiManager = mdsalApiManager;
this.ovsInterfaceStateAddHelper = ovsInterfaceStateAddHelper;
this.interfaceMetaUtils = interfaceMetaUtils;
this.southboundUtils = southboundUtils;
+ this.eventCallbacks = eventCallbacks;
}
public List<ListenableFuture<Void>> addConfiguration(ParentRefs parentRefs, Interface interfaceNew) {
if (createTunnelPort) {
southboundUtils.addPortToBridge(bridgeIid, interfaceNew, tunnelName);
}
-
- // if TEP is already configured on switch, start LLDP monitoring and
- // program tunnel ingress flow
- org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.state.Interface ifState = interfaceManagerCommonUtils
- .getInterfaceState(interfaceNew.getName());
- if (ifState != null) {
- NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
- if (ncId != null) {
- long portNo = IfmUtil.getPortNumberFromNodeConnectorId(ncId);
- interfaceManagerCommonUtils.addTunnelIngressFlow(confTx, ifTunnel, dpId, portNo,
- interfaceNew.getName(), ifState.getIfIndex());
- ListenableFuture<Void> future =
- FlowBasedServicesUtils.bindDefaultEgressDispatcherService(txRunner, interfaceNew,
- Long.toString(portNo), interfaceNew.getName(), ifState.getIfIndex());
- futures.add(future);
- Futures.addCallback(future, new FutureCallback<Void>() {
- @Override
- public void onSuccess(@Nullable Void result) {
- // start LLDP monitoring for the tunnel interface
- alivenessMonitorUtils.startLLDPMonitoring(ifTunnel, interfaceNew.getName());
- }
-
- @Override
- public void onFailure(@NonNull Throwable throwable) {
- LOG.error("Unable to add tunnel monitoring", throwable);
- }
- }, MoreExecutors.directExecutor());
- }
- }
+ setupTunnelFlowsAndMonitoring(interfaceNew, confTx, ifTunnel, dpId, futures);
+ } else if (createTunnelPort) {
+ LOG.debug("Bridge not found. Registering eventcallback for dpid {}", dpId);
+ InstanceIdentifier<BridgeRefEntry> bridgeRefEntryInstanceIdentifier =
+ InstanceIdentifier.builder(BridgeRefInfo.class)
+ .child(BridgeRefEntry.class, new BridgeRefEntryKey(dpId)).build();
+ eventCallbacks.onAdd(LogicalDatastoreType.OPERATIONAL, bridgeRefEntryInstanceIdentifier,
+ (bridgeRefEntryOnCallback) -> {
+ LOG.debug("eventcallback triggered on bridge reference entry addition {}", dpId);
+ southboundUtils.addPortToBridge(bridgeRefEntryOnCallback.getBridgeReference().getValue(),
+ interfaceNew, tunnelName);
+ return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
+ }, Duration.ofMillis(5000), (id) -> {
+ LOG.info("event call back timed-out for bridge creation, {}", dpId);
+ });
}
}
ifaceName, ifState.getIfIndex(), groupId);
}
+ private void setupTunnelFlowsAndMonitoring(Interface interfaceNew, TypedWriteTransaction<Configuration> confTx,
+ IfTunnel ifTunnel, BigInteger dpId,
+ List<ListenableFuture<Void>> futures) {
+ // if TEP is already configured on switch, start LLDP monitoring and
+ // program tunnel ingress flow
+ org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
+ .ietf.interfaces.rev140508.interfaces.state.Interface ifState = interfaceManagerCommonUtils
+ .getInterfaceState(interfaceNew.getName());
+ if (ifState != null) {
+ NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState);
+ if (ncId != null) {
+ long portNo = IfmUtil.getPortNumberFromNodeConnectorId(ncId);
+ interfaceManagerCommonUtils.addTunnelIngressFlow(confTx, ifTunnel, dpId, portNo,
+ interfaceNew.getName(), ifState.getIfIndex());
+ ListenableFuture<Void> future =
+ FlowBasedServicesUtils.bindDefaultEgressDispatcherService(txRunner, interfaceNew,
+ Long.toString(portNo), interfaceNew.getName(), ifState.getIfIndex());
+ futures.add(future);
+ Futures.addCallback(future, new FutureCallback<Void>() {
+ @Override
+ public void onSuccess(@Nullable Void result) {
+ // start LLDP monitoring for the tunnel interface
+ alivenessMonitorUtils.startLLDPMonitoring(ifTunnel, interfaceNew.getName());
+ }
+
+ @Override
+ public void onFailure(@NonNull Throwable throwable) {
+ LOG.error("Unable to add tunnel monitoring", throwable);
+ }
+ }, MoreExecutors.directExecutor());
+ }
+ }
+ }
+
}