void updateInterfaceParentRef(String interfaceName, String parentInterface, boolean readInterfaceBeforeWrite);
long getLogicalTunnelSelectGroupId(int lportTag);
+
+ boolean isItmDirectTunnelsEnabled();
}
default 15;
description "IFM statistics polling interval (in minutes)";
}
+ leaf itm-direct-tunnels {
+ description "Enable the ITM to handle tunnels directly by-passing interface manager.";
+ type boolean;
+ default false;
+ }
}
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.config.rev160406.IfmConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
private final JobCoordinator coordinator;
private final InterfaceManagerCommonUtils interfaceManagerCommonUtils;
private final InterfaceMetaUtils interfaceMetaUtils;
+ private final IfmConfig ifmConfig;
private Map<String, OvsdbTerminationPointAugmentation> ifaceToTpMap;
private Map<String, InstanceIdentifier<Node>> ifaceToNodeIidMap;
private Map<InstanceIdentifier<Node>, OvsdbBridgeAugmentation> nodeIidToBridgeMap;
public InterfacemgrProvider(final DataBroker dataBroker, final EntityOwnershipService entityOwnershipService,
final IdManagerService idManager, final InterfaceManagerRpcService interfaceManagerRpcService,
final JobCoordinator coordinator, final InterfaceManagerCommonUtils interfaceManagerCommonUtils,
- final InterfaceMetaUtils interfaceMetaUtils) {
+ final InterfaceMetaUtils interfaceMetaUtils, final IfmConfig ifmConfig) {
this.dataBroker = dataBroker;
this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
this.entityOwnershipService = entityOwnershipService;
this.coordinator = coordinator;
this.interfaceManagerCommonUtils = interfaceManagerCommonUtils;
this.interfaceMetaUtils = interfaceMetaUtils;
+ this.ifmConfig = ifmConfig;
}
@PostConstruct
public long getLogicalTunnelSelectGroupId(int lportTag) {
return IfmUtil.getLogicalTunnelSelectGroupId(lportTag);
}
+
+ @Override
+ public boolean isItmDirectTunnelsEnabled() {
+ return ifmConfig.isItmDirectTunnels();
+ }
}
private static String getDpnPrefixedPortName(String dpnId, String portName) {
return dpnId + IfmConstants.OF_URI_SEPARATOR + portName;
}
+
+ public boolean isTunnelInternal(String interfaceName) {
+ IfTunnel ifTunnel = getInterfaceFromConfigDS(interfaceName).getAugmentation(IfTunnel.class);
+ if (ifTunnel != null) {
+ return ifTunnel.isInternal();
+ }
+ return false;
+ }
}
import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
import org.opendaylight.genius.interfacemanager.IfmConstants;
import org.opendaylight.genius.interfacemanager.IfmUtil;
+import org.opendaylight.genius.interfacemanager.InterfacemgrProvider;
import org.opendaylight.genius.interfacemanager.commons.AlivenessMonitorUtils;
import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
import org.opendaylight.genius.interfacemanager.commons.InterfaceMetaUtils;
private final OvsInterfaceStateAddHelper ovsInterfaceStateAddHelper;
private final InterfaceMetaUtils interfaceMetaUtils;
private final PortNameCache portNameCache;
+ private final InterfacemgrProvider interfacemgrProvider;
@Inject
public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManagerService,
final AlivenessMonitorUtils alivenessMonitorUtils,
final InterfaceMetaUtils interfaceMetaUtils,
final PortNameCache portNameCache,
- final InterfaceServiceRecoveryHandler interfaceServiceRecoveryHandler) {
+ final InterfaceServiceRecoveryHandler interfaceServiceRecoveryHandler,
+ final InterfacemgrProvider interfacemgrProvider) {
super(FlowCapableNodeConnector.class, InterfaceInventoryStateListener.class);
this.dataBroker = dataBroker;
this.idManager = idManagerService;
this.ovsInterfaceStateAddHelper = ovsInterfaceStateAddHelper;
this.interfaceMetaUtils = interfaceMetaUtils;
this.portNameCache = portNameCache;
+ this.interfacemgrProvider = interfacemgrProvider;
registerListener();
interfaceServiceRecoveryHandler.addRecoverableListener(this);
}
@Override
protected void remove(InstanceIdentifier<FlowCapableNodeConnector> key,
FlowCapableNodeConnector flowCapableNodeConnectorOld) {
+ if (interfacemgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(flowCapableNodeConnectorOld.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, ignoring node connector removed for internal tunnel {}",
+ flowCapableNodeConnectorOld.getName());
+ return;
+ }
+
if (!entityOwnershipUtils.isEntityOwner(IfmConstants.INTERFACE_CONFIG_ENTITY,
IfmConstants.INTERFACE_CONFIG_ENTITY)) {
return;
@Override
protected void update(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorOld,
FlowCapableNodeConnector fcNodeConnectorNew) {
+ if (interfacemgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(fcNodeConnectorNew.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, ignoring node connector Update for internal tunnel {}",
+ fcNodeConnectorNew.getName());
+ return;
+ }
+
if (!entityOwnershipUtils.isEntityOwner(IfmConstants.INTERFACE_CONFIG_ENTITY,
IfmConstants.INTERFACE_CONFIG_ENTITY)) {
return;
@Override
protected void add(InstanceIdentifier<FlowCapableNodeConnector> key, FlowCapableNodeConnector fcNodeConnectorNew) {
+ if (interfacemgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(fcNodeConnectorNew.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, ignoring node connector add for internal tunnel {}",
+ fcNodeConnectorNew.getName());
+ return;
+ }
+
if (!entityOwnershipUtils.isEntityOwner(IfmConstants.INTERFACE_CONFIG_ENTITY,
IfmConstants.INTERFACE_CONFIG_ENTITY)) {
return;
return futures;
}
futures.add(writeTransaction.submit());
- southboundUtils.addAllPortsToBridge(bridgeEntry, interfaceManagerCommonUtils, instanceIdentifier,
- bridgeNew);
+ southboundUtils
+ .addAllPortsToBridge(bridgeEntry, interfaceManagerCommonUtils, instanceIdentifier, bridgeNew);
return futures;
}
}
@Override
protected void remove(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
OvsdbTerminationPointAugmentation tpOld) {
+ if (interfaceMgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(tpOld.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, hence ignoring termination point add for internal tunnel {}",
+ tpOld.getName());
+ return;
+ }
LOG.debug("Received remove DataChange Notification for ovsdb termination point {}", tpOld.getName());
String oldInterfaceName = SouthboundUtils.getExternalInterfaceIdValue(tpOld);
protected void update(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
OvsdbTerminationPointAugmentation tpOld,
OvsdbTerminationPointAugmentation tpNew) {
+ if (interfaceMgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(tpNew.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, hence ignoring termination point update - "
+ + "old {}, new {} internal tunnel", tpOld.getName(), tpNew.getName());
+ return;
+ }
+
LOG.debug("Received Update DataChange Notification for ovsdb termination point {}", tpNew.getName());
- if (tpNew.getInterfaceBfdStatus() != null
- && (tpOld == null || !tpNew.getInterfaceBfdStatus().equals(tpOld.getInterfaceBfdStatus()))) {
- LOG.info("Bfd Status changed for ovsdb termination point identifier: {}, old: {}, new: {}.", identifier,
- tpOld, tpNew);
- RendererStateUpdateWorker rendererStateAddWorker = new RendererStateUpdateWorker(tpNew);
- coordinator.enqueueJob(tpNew.getName(), rendererStateAddWorker, IfmConstants.JOB_MAX_RETRIES);
+ if (tpOld != null) {
+ if ((org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils
+ .bfdMonitoringEnabled(tpNew.getInterfaceBfd())
+ != org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils
+ .bfdMonitoringEnabled(tpOld.getInterfaceBfd()))
+ || (tpNew.getInterfaceBfdStatus() != null
+ && !tpNew.getInterfaceBfdStatus().equals(tpOld.getInterfaceBfdStatus()))) {
+ LOG.info("Bfd Status changed for ovsdb termination point identifier: {}, old: {}, new: {}.",
+ identifier, tpOld, tpNew);
+ RendererStateUpdateWorker rendererStateAddWorker = new RendererStateUpdateWorker(tpNew);
+ coordinator.enqueueJob(tpNew.getName(), rendererStateAddWorker, IfmConstants.JOB_MAX_RETRIES);
+ }
}
InstanceIdentifier<Node> nodeIid = identifier.firstIdentifierOf(Node.class);
String newInterfaceName = SouthboundUtils.getExternalInterfaceIdValue(tpNew);
@Override
protected void add(InstanceIdentifier<OvsdbTerminationPointAugmentation> identifier,
OvsdbTerminationPointAugmentation tpNew) {
+ if (interfaceMgrProvider.isItmDirectTunnelsEnabled()
+ && interfaceManagerCommonUtils.isTunnelInternal(tpNew.getName())) {
+ LOG.debug("ITM Direct Tunnels is enabled, hence ignoring termination point add for internal tunnel {}",
+ tpNew.getName());
+ return;
+ }
update(identifier, null, tpNew);
}
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.genius.interfacemanager.IfmConstants;
import org.opendaylight.genius.interfacemanager.IfmUtil;
+import org.opendaylight.genius.interfacemanager.InterfacemgrProvider;
import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
import org.opendaylight.genius.interfacemanager.commons.InterfaceMetaUtils;
import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.SouthboundUtils;
private final InterfaceManagerCommonUtils interfaceManagerCommonUtils;
private final InterfaceMetaUtils interfaceMetaUtils;
private final SouthboundUtils southboundUtils;
+ private final InterfacemgrProvider interfacemgrProvider;
@Inject
public OvsInterfaceTopologyStateUpdateHelper(DataBroker dataBroker, EntityOwnershipUtils entityOwnershipUtils,
JobCoordinator coordinator, InterfaceManagerCommonUtils interfaceManagerCommonUtils,
- InterfaceMetaUtils interfaceMetaUtils, SouthboundUtils southboundUtils) {
+ InterfaceMetaUtils interfaceMetaUtils, SouthboundUtils southboundUtils,
+ InterfacemgrProvider interfacemgrProvider) {
this.dataBroker = dataBroker;
this.entityOwnershipUtils = entityOwnershipUtils;
this.coordinator = coordinator;
this.interfaceManagerCommonUtils = interfaceManagerCommonUtils;
this.interfaceMetaUtils = interfaceMetaUtils;
this.southboundUtils = southboundUtils;
+ this.interfacemgrProvider = interfacemgrProvider;
}
/*
* This code is used to handle only a dpnId change scenario for a particular
* change, which is not expected to happen in usual cases.
*/
- public List<ListenableFuture<Void>> updateBridgeRefEntry(
- InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid, OvsdbBridgeAugmentation bridgeNew,
- OvsdbBridgeAugmentation bridgeOld) {
+ public List<ListenableFuture<Void>> updateBridgeRefEntry(InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
+ OvsdbBridgeAugmentation bridgeNew,
+ OvsdbBridgeAugmentation bridgeOld) {
List<ListenableFuture<Void>> futures = new ArrayList<>();
WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
}
public List<ListenableFuture<Void>> updateTunnelState(OvsdbTerminationPointAugmentation terminationPointNew) {
- final Interface.OperStatus interfaceBfdStatus = getTunnelOpState(terminationPointNew.getInterfaceBfdStatus());
+ final Interface.OperStatus interfaceBfdStatus = getTunnelOpState(terminationPointNew);
final String interfaceName = terminationPointNew.getName();
interfaceManagerCommonUtils.addBfdStateToCache(interfaceName, interfaceBfdStatus);
if (!entityOwnershipUtils.isEntityOwner(IfmConstants.INTERFACE_CONFIG_ENTITY,
return Collections.emptyList();
}
- private static Interface.OperStatus getTunnelOpState(List<InterfaceBfdStatus> tunnelBfdStatus) {
+ private static Interface.OperStatus getTunnelOpState(OvsdbTerminationPointAugmentation terminationPoint) {
+ if (!SouthboundUtils.bfdMonitoringEnabled(terminationPoint.getInterfaceBfd())) {
+ return Interface.OperStatus.Up;
+ }
Interface.OperStatus livenessState = Interface.OperStatus.Down;
+ List<InterfaceBfdStatus> tunnelBfdStatus = terminationPoint.getInterfaceBfdStatus();
if (tunnelBfdStatus != null && !tunnelBfdStatus.isEmpty()) {
for (InterfaceBfdStatus bfdState : tunnelBfdStatus) {
if (bfdState.getBfdStatusKey().equalsIgnoreCase(SouthboundUtils.BFD_OP_STATE)) {
import org.apache.commons.lang3.BooleanUtils;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.interfacemanager.InterfacemgrProvider;
import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
private static final String BFD_PARAM_FORWARDING_IF_RX = "forwarding_if_rx";
// BFD parameters
+ public static final String BFD_ENABLE_KEY = "enable";
+ public static final String BFD_ENABLE_VALUE = "true";
public static final String BFD_OP_STATE = "state";
public static final String BFD_STATE_UP = "up";
private static final String BFD_MIN_TX_VAL = "100";
};
private final BatchingUtils batchingUtils;
+ private final InterfacemgrProvider interfacemgrProvider;
@Inject
- public SouthboundUtils(BatchingUtils batchingUtils) {
+ public SouthboundUtils(BatchingUtils batchingUtils, InterfacemgrProvider interfacemgrProvider) {
this.batchingUtils = batchingUtils;
+ this.interfacemgrProvider = interfacemgrProvider;
}
public void addPortToBridge(InstanceIdentifier<?> bridgeIid, Interface iface, String portName) {
* Add all tunnels ports corresponding to the bridge to the topology config DS.
*/
public void addAllPortsToBridge(BridgeEntry bridgeEntry, InterfaceManagerCommonUtils interfaceManagerCommonUtils,
- InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
- OvsdbBridgeAugmentation bridgeNew) {
+ InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid,
+ OvsdbBridgeAugmentation bridgeNew) {
String bridgeName = bridgeNew.getBridgeName().getValue();
LOG.debug("adding all ports to bridge: {}", bridgeName);
List<BridgeInterfaceEntry> bridgeInterfaceEntries = bridgeEntry.getBridgeInterfaceEntry();
if (iface != null) {
IfTunnel ifTunnel = iface.getAugmentation(IfTunnel.class);
if (ifTunnel != null) {
- addTunnelPortToBridge(ifTunnel, bridgeIid, iface, portName);
-
+ if (!(interfacemgrProvider.isItmDirectTunnelsEnabled() && ifTunnel.isInternal())) {
+ addTunnelPortToBridge(ifTunnel, bridgeIid, iface, portName);
+ }
if (isOfTunnel(ifTunnel)) {
LOG.debug("Using OFTunnel. Only one tunnel port will be added");
return;
&& TunnelMonitoringTypeBfd.class.isAssignableFrom(ifTunnel.getMonitorProtocol());
}
+ public static boolean bfdMonitoringEnabled(List<InterfaceBfd> interfaceBfds) {
+ if (interfaceBfds == null) {
+ return false;
+ }
+ for (InterfaceBfd interfaceBfd : interfaceBfds) {
+ if (interfaceBfd.getBfdKey().equalsIgnoreCase(SouthboundUtils.BFD_ENABLE_KEY)) {
+ return SouthboundUtils.BFD_ENABLE_VALUE.equalsIgnoreCase(interfaceBfd.getBfdValue());//checkBfdEnabled
+ }
+ }
+ return false;
+ }
+
public static boolean isMonitorProtocolBfd(IfTunnel ifTunnel) {
return TunnelMonitoringTypeBfd.class.isAssignableFrom(ifTunnel.getMonitorProtocol());
}
<interfacemanager-config xmlns="urn:opendaylight:genius:interfacemanager:config">
<ifm-stats-poll-enabled>false</ifm-stats-poll-enabled>
<ifm-stats-def-poll-interval>15</ifm-stats-def-poll-interval>
+ <itm-direct-tunnels>false</itm-direct-tunnels>
</interfacemanager-config>
import org.opendaylight.infrautils.inject.guice.testutils.AbstractGuiceJsr250Module;
import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.config.rev160406.IfmConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.config.rev160406.IfmConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfigBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
.setGpeExtensionEnabled(false)
.build();
bind(ItmConfig.class).toInstance(itmConfigObj);
+ IfmConfig interfaceConfig = new IfmConfigBuilder().setItmDirectTunnels(false).build();
+ bind(IfmConfig.class).toInstance(interfaceConfig);
bind(TunnelMonitorIntervalListener.class);
bind(TransportZoneListener.class);
bind(OvsdbNodeListener.class);