import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.time.Duration;
+import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.genius.mdsalutil.ActionInfo;
import org.opendaylight.genius.mdsalutil.MatchInfo;
import org.opendaylight.genius.mdsalutil.MetaDataUtil;
import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.UpgradeState;
import org.opendaylight.genius.mdsalutil.actions.ActionMoveSourceDestinationEth;
import org.opendaylight.genius.mdsalutil.actions.ActionMoveSourceDestinationIp;
import org.opendaylight.genius.mdsalutil.actions.ActionNxLoadInPort;
import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
private final NexthopManager nextHopManager;
private final IMdsalApiManager mdsalManager;
private final FibUtil fibUtil;
+ private final UpgradeState upgradeState;
+ private final DataTreeEventCallbackRegistrar eventCallbacks;
@Inject
public BaseVrfEntryHandler(final DataBroker dataBroker,
final NexthopManager nexthopManager,
final IMdsalApiManager mdsalManager,
- final FibUtil fibUtil) {
+ final FibUtil fibUtil,
+ final UpgradeState upgradeState,
+ final DataTreeEventCallbackRegistrar eventCallbacks) {
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.nextHopManager = nexthopManager;
this.mdsalManager = mdsalManager;
this.fibUtil = fibUtil;
+ this.upgradeState = upgradeState;
+ this.eventCallbacks = eventCallbacks;
}
@Override
addRewriteDstMacAction(vpnId, vrfEntry, prefixInfo, actionInfos);
}
+ private InstanceIdentifier<Interface> getFirstAbsentInterfaceStateIid(List<AdjacencyResult> adjacencyResults) {
+ InstanceIdentifier<Interface> res = null;
+ for (AdjacencyResult adjacencyResult : adjacencyResults) {
+ String interfaceName = adjacencyResult.getInterfaceName();
+ if (null == fibUtil.getInterfaceStateFromOperDS(interfaceName)) {
+ res = fibUtil.buildStateInterfaceId(interfaceName);
+ break;
+ }
+ }
+
+ return res;
+ }
+
public void programRemoteFib(final BigInteger remoteDpnId, final long vpnId,
final VrfEntry vrfEntry, WriteTransaction tx, String rd,
List<AdjacencyResult> adjacencyResults,
List<SubTransaction> subTxns) {
+ if (upgradeState.isUpgradeInProgress()) {
+ InstanceIdentifier<Interface> absentInterfaceStateIid = getFirstAbsentInterfaceStateIid(adjacencyResults);
+ if (absentInterfaceStateIid != null) {
+ LOG.info("programRemoteFib: interface state for {} not yet present, waiting...",
+ absentInterfaceStateIid);
+ eventCallbacks.onAddOrUpdate(LogicalDatastoreType.OPERATIONAL,
+ absentInterfaceStateIid,
+ (before, after) -> {
+ LOG.info("programRemoteFib: waited for and got interface state {}", absentInterfaceStateIid);
+ txRunner.callWithNewWriteOnlyTransactionAndSubmit((wtx) -> {
+ programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null);
+ });
+ return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
+ },
+ Duration.of(15, ChronoUnit.MINUTES),
+ (iid) -> {
+ LOG.error("programRemoteFib: timed out waiting for {}", absentInterfaceStateIid);
+ txRunner.callWithNewWriteOnlyTransactionAndSubmit((wtx) -> {
+ programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null);
+ });
+ });
+ return;
+ }
+ }
+
List<InstructionInfo> instructions = new ArrayList<>();
for (AdjacencyResult adjacencyResult : adjacencyResults) {
List<ActionInfo> actionInfos = new ArrayList<>();
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.genius.mdsalutil.ActionInfo;
import org.opendaylight.genius.mdsalutil.InstructionInfo;
import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.UpgradeState;
import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
import org.opendaylight.genius.mdsalutil.actions.ActionNxLoadInPort;
import org.opendaylight.genius.mdsalutil.actions.ActionPushMpls;
@Inject
public BgpRouteVrfEntryHandler(final DataBroker dataBroker,
final NexthopManager nexthopManager,
- final FibUtil fibUtil) {
- super(dataBroker, nexthopManager, null, fibUtil);
+ final FibUtil fibUtil,
+ final UpgradeState upgradeState,
+ final DataTreeEventCallbackRegistrar eventCallbacks) {
+ super(dataBroker, nexthopManager, null, fibUtil, upgradeState, eventCallbacks);
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.nexthopManager = nexthopManager;
import java.util.List;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.genius.mdsalutil.ActionInfo;
import org.opendaylight.genius.mdsalutil.InstructionInfo;
import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.UpgradeState;
import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldEthernetDestination;
import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldTunnelId;
EvpnVrfEntryHandler(DataBroker broker, VrfEntryListener vrfEntryListener,
BgpRouteVrfEntryHandler bgpRouteVrfEntryHandler, NexthopManager nexthopManager,
- JobCoordinator jobCoordinator, IElanService elanManager, FibUtil fibUtil) {
- super(broker, nexthopManager, null, fibUtil);
+ JobCoordinator jobCoordinator, IElanService elanManager, FibUtil fibUtil,
+ final UpgradeState upgradeState, final DataTreeEventCallbackRegistrar eventCallbacks) {
+ super(broker, nexthopManager, null, fibUtil, upgradeState, eventCallbacks);
this.txRunner = new ManagedNewTransactionRunnerImpl(broker);
this.vrfEntryListener = vrfEntryListener;
this.bgpRouteVrfEntryHandler = bgpRouteVrfEntryHandler;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.mdsalutil.FlowEntity;
import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.UpgradeState;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.netvirt.fibmanager.api.FibHelper;
import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
@Inject
public RouterInterfaceVrfEntryHandler(final DataBroker dataBroker, final NexthopManager nexthopManager,
- final IMdsalApiManager mdsalManager, final IPv6Handler ipv6Handler, final FibUtil fibUtil) {
- super(dataBroker, nexthopManager, mdsalManager, fibUtil);
+ final IMdsalApiManager mdsalManager, final IPv6Handler ipv6Handler, final FibUtil fibUtil,
+ final UpgradeState upgradeState, final DataTreeEventCallbackRegistrar eventCallbacks) {
+ super(dataBroker, nexthopManager, mdsalManager, fibUtil, upgradeState, eventCallbacks);
this.mdsalManager = mdsalManager;
this.ipv6Handler = ipv6Handler;
}
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.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
import org.opendaylight.genius.infra.RetryingManagedNewTransactionRunner;
import org.opendaylight.genius.mdsalutil.MetaDataUtil;
import org.opendaylight.genius.mdsalutil.NWUtil;
import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.UpgradeState;
import org.opendaylight.genius.mdsalutil.actions.ActionDrop;
import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
import org.opendaylight.genius.mdsalutil.actions.ActionPopMpls;
private final FibUtil fibUtil;
private final InterVpnLinkCache interVpnLinkCache;
private final List<AutoCloseable> closeables = new CopyOnWriteArrayList<>();
+ private final UpgradeState upgradeState;
+ private final DataTreeEventCallbackRegistrar eventCallbacks;
@Inject
public VrfEntryListener(final DataBroker dataBroker, final IMdsalApiManager mdsalApiManager,
final RouterInterfaceVrfEntryHandler routerInterfaceVrfEntryHandler,
final JobCoordinator jobCoordinator,
final FibUtil fibUtil,
- final InterVpnLinkCache interVpnLinkCache) {
+ final InterVpnLinkCache interVpnLinkCache,
+ final UpgradeState upgradeState,
+ final DataTreeEventCallbackRegistrar eventCallbacks) {
super(VrfEntry.class, VrfEntryListener.class);
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.jobCoordinator = jobCoordinator;
this.fibUtil = fibUtil;
this.interVpnLinkCache = interVpnLinkCache;
+ this.upgradeState = upgradeState;
+ this.eventCallbacks = eventCallbacks;
}
@Override
if (VrfEntry.EncapType.Vxlan.equals(vrfEntry.getEncapType())) {
LOG.info("EVPN flows need to be programmed.");
EvpnVrfEntryHandler evpnVrfEntryHandler = new EvpnVrfEntryHandler(dataBroker, this, bgpRouteVrfEntryHandler,
- nextHopManager, jobCoordinator, elanManager, fibUtil);
+ nextHopManager, jobCoordinator, elanManager, fibUtil, upgradeState, eventCallbacks);
evpnVrfEntryHandler.createFlows(identifier, vrfEntry, rd);
closeables.add(evpnVrfEntryHandler);
return;
if (VrfEntry.EncapType.Vxlan.equals(vrfEntry.getEncapType())) {
LOG.info("EVPN flows to be deleted");
EvpnVrfEntryHandler evpnVrfEntryHandler = new EvpnVrfEntryHandler(dataBroker, this, bgpRouteVrfEntryHandler,
- nextHopManager, jobCoordinator, elanManager, fibUtil);
+ nextHopManager, jobCoordinator, elanManager, fibUtil, upgradeState, eventCallbacks);
evpnVrfEntryHandler.removeFlows(identifier, vrfEntry, rd);
closeables.add(evpnVrfEntryHandler);
return;
availability="optional"/>
<reference id="iInterfaceManager"
interface="org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager" />
+ <reference id="dataTreeEventCallbackRegistrar"
+ interface="org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar"/>
+ <reference id="upgradeState"
+ interface="org.opendaylight.genius.mdsalutil.UpgradeState"/>
<odl:rpc-service id="idManagerService"
interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService"/>