Remove interface utilities from ElanUtils and use Genius.
Skip processing of non-neutron ports in aliveness monitor,
current code just assumes these are neutron ports and hits
an exception.
Depends-On: https://git.opendaylight.org/gerrit/#/c/48157
Change-Id: I1515b40876ad1859f7b9ae4eac384efe169a3eab
Signed-off-by: Alon Kochba <alonko@hpe.com>
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
+
import org.apache.commons.lang3.StringUtils;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
this.elanForwardingEntriesHandler.setElanUtils(elanUtils);
}
+ @Override
public void init() {
registerListener(LogicalDatastoreType.CONFIGURATION, broker);
}
List<Bucket> listBucketInfo = new ArrayList<>();
for (String interfaceName : currDpnInterfaces.getInterfaces()) {
- if (elanUtils.isExternal(interfaceName)) {
+ if (interfaceManager.isExternalInterface(interfaceName)) {
List<Action> listActionInfo = elanUtils.getExternalPortItmEgressAction(interfaceName);
if (!listActionInfo.isEmpty()) {
listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId,
continue;
}
- if (!elanUtils.isExternal(ifName)) {
+ if (!interfaceManager.isExternalInterface(ifName)) {
listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId,
MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP));
bucketId++;
continue;
}
- if (!elanUtils.isExternal(ifName)) {
+ if (!interfaceManager.isExternalInterface(ifName)) {
// only add root interfaces
bucketId = addInterfaceIfRootInterface(bucketId, ifName, listBucket, ifInfo);
}
Set<String> externalElanInterfaces = new HashSet<>();
for (String elanInterface : elanInterfaces) {
- if (elanUtils.isExternal(elanInterface)) {
+ if (interfaceManager.isExternalInterface(elanInterface)) {
externalElanInterfaces.add(elanInterface);
}
}
return externalElanInterfaces;
}
+ @Override
public String getExternalElanInterface(String elanInstanceName, BigInteger dpnId) {
return elanUtils.getExternalElanInterface(elanInstanceName, dpnId);
}
@Override
public boolean isExternalInterface(String interfaceName) {
- return elanUtils.isExternal(interfaceName);
+ return interfaceManager.isExternalInterface(interfaceName);
}
@Override
interfaceName = parentRef + IfmConstants.OF_URI_SEPARATOR + segmentationId;
String trunkName = parentRef + IfmConstants.OF_URI_SEPARATOR + "trunk";
// trunk interface may have been created by other vlan network
- Interface trunkInterface = ElanUtils.getInterfaceFromConfigDS(trunkName, broker);
+ Interface trunkInterface = interfaceManager.getInterfaceInfoFromConfigDataStore(trunkName);
if (trunkInterface == null) {
interfaceManager.createVLANInterface(trunkName, parentRef, null, null, null,
IfL2vlan.L2vlanMode.Trunk, true);
import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
+
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
+
import org.apache.commons.lang3.StringUtils;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.genius.utils.ServiceIndex;
import org.opendaylight.netvirt.elan.ElanException;
-import org.opendaylight.netvirt.elan.internal.ElanBridgeManager;
import org.opendaylight.netvirt.elan.internal.ElanInstanceManager;
import org.opendaylight.netvirt.elan.internal.ElanInterfaceManager;
import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
import org.opendaylight.netvirt.elan.l2gw.utils.L2GatewayConnectionUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
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.interfaces.rev140508.interfaces.state.Interface.AdminStatus;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.IfIndexesInterfaceMap;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterface;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetDpidFromInterfaceInputBuilder;
private final ElanL2GatewayUtils elanL2GatewayUtils;
private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils;
private final L2GatewayConnectionUtils l2GatewayConnectionUtils;
- private final ElanBridgeManager bridgeManager;
+ private final IInterfaceManager interfaceManager;
public static final FutureCallback<Void> DEFAULT_CALLBACK = new FutureCallback<Void>() {
@Override
public ElanUtils(DataBroker dataBroker, IMdsalApiManager mdsalManager, ElanInstanceManager elanInstanceManager,
OdlInterfaceRpcService interfaceManagerRpcService, ItmRpcService itmRpcService,
ElanInterfaceManager elanInterfaceManager,
- EntityOwnershipService entityOwnershipService, ElanBridgeManager bridgeManager) {
+ EntityOwnershipService entityOwnershipService, IInterfaceManager interfaceManager) {
this.broker = dataBroker;
this.mdsalManager = mdsalManager;
this.elanInstanceManager = elanInstanceManager;
this.interfaceManagerRpcService = interfaceManagerRpcService;
this.itmRpcService = itmRpcService;
- this.bridgeManager = bridgeManager;
+ this.interfaceManager = interfaceManager;
elanL2GatewayMulticastUtils =
new ElanL2GatewayMulticastUtils(broker, elanInstanceManager, elanInterfaceManager, this);
return null;
}
- /**
- * Gets the interface from config ds.
- *
- * @param interfaceName
- * the interface name
- * @param dataBroker
- * the data broker
- * @return the interface from config ds
- */
- public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface getInterfaceFromConfigDS(
- String interfaceName, DataBroker dataBroker) {
- InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface> ifaceId = createInterfaceInstanceIdentifier(interfaceName);
- Optional<org.opendaylight.yang.gen.v1.urn
- .ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface> iface = MDSALUtil
- .read(dataBroker, LogicalDatastoreType.CONFIGURATION, ifaceId);
- if (iface.isPresent()) {
- return iface.get();
- }
- return null;
- }
-
/**
* Creates the interface state instance identifier.
*
return idBuilder.build();
}
- /**
- * Creates the interface instance identifier.
- *
- * @param interfaceName
- * the interface name
- * @return the instance identifier
- */
- public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface> createInterfaceInstanceIdentifier(
- String interfaceName) {
- InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface> idBuilder = InstanceIdentifier
- .builder(Interfaces.class)
- .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface.class,
- new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.InterfaceKey(
- interfaceName));
- return idBuilder.build();
- }
-
public static CheckedFuture<Void, TransactionCommitFailedException> waitForTransactionToComplete(
WriteTransaction tx) {
CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
&& elanInstance.getSegmentType().isAssignableFrom(SegmentTypeFlat.class);
}
- public boolean isExternal(String interfaceName) {
- return isExternal(getInterfaceFromConfigDS(interfaceName, broker));
- }
-
- public static boolean isExternal(
- org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
- .ietf.interfaces.rev140508.interfaces.Interface iface) {
- if (iface == null) {
- return false;
- }
-
- IfExternal ifExternal = iface.getAugmentation(IfExternal.class);
- return ifExternal != null && Boolean.TRUE.equals(ifExternal.isExternal());
- }
-
public static boolean isEtreeRootInterfaceByInterfaceName(DataBroker broker, String interfaceName) {
EtreeInterface etreeInterface = getEtreeInterfaceByElanInterfaceName(broker, interfaceName);
if (etreeInterface != null && etreeInterface.getEtreeInterfaceType() == EtreeInterfaceType.Root) {
}
for (String dpnInterface : dpnInterfaces.getInterfaces()) {
- if (isExternal(dpnInterface)) {
+ if (interfaceManager.isExternalInterface(dpnInterface)) {
return dpnInterface;
}
}
<argument ref="itmRpcService" />
<argument ref="elanInterfaceManager" />
<argument ref="entityOwnershipService" />
- <argument ref="elanBridgeManager" />
+ <argument ref="interfaceManager" />
</bean>
<bean id="elanStatisticsImpl" class="org.opendaylight.netvirt.elan.statisitcs.ElanStatisticsImpl">
*/
package org.opendaylight.netvirt.vpnmanager;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
import com.google.common.base.Optional;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
public class AlivenessMonitorUtils {
private static final Logger LOG = LoggerFactory.getLogger(AlivenessMonitorUtils.class);
private static Map<Long, MacEntry> alivenessCache = new ConcurrentHashMap<>();
public static void startArpMonitoring(MacEntry macEntry, Long arpMonitorProfileId,
- AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker,
- OdlInterfaceRpcService interfaceRpc, INeutronVpnManager neutronVpnService) {
- Optional<IpAddress> gatewayIpOptional = VpnUtil.getGatewayIpAddressFromInterface(macEntry.getInterfaceName(),
- neutronVpnService, dataBroker);
+ AlivenessMonitorService alivenessMonitorService, DataBroker dataBroker,
+ OdlInterfaceRpcService interfaceRpc, INeutronVpnManager neutronVpnService,
+ IInterfaceManager interfaceManager) {
+ if (interfaceManager.isExternalInterface(macEntry.getInterfaceName())) {
+ LOG.debug("ARP monitoring is currently not supported through external interfaces,"
+ + "skipping ARP monitoring from interface {} for IP {} (last known MAC {})",
+ macEntry.getInterfaceName(), macEntry.getIpAddress().getHostAddress(), macEntry.getMacAddress());
+ return;
+ }
+ Optional<IpAddress> gatewayIpOptional =
+ VpnUtil.getGatewayIpAddressFromInterface(macEntry.getInterfaceName(), neutronVpnService, dataBroker);
IpAddress gatewayIp;
PhysAddress gatewayMac;
if(!gatewayIpOptional.isPresent()) {
return monitorId;
}
-}
\ No newline at end of file
+}
*/
package org.opendaylight.netvirt.vpnmanager;
-import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev160411.AlivenessMonitorService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
private AlivenessMonitorService alivenessManager;
private OdlInterfaceRpcService interfaceRpc;
private INeutronVpnManager neutronVpnService;
+ private IInterfaceManager interfaceManager;
public ArpMonitorStartTask(MacEntry macEntry, Long profileId, DataBroker databroker,
AlivenessMonitorService alivenessManager, OdlInterfaceRpcService interfaceRpc,
- INeutronVpnManager neutronVpnService) {
+ INeutronVpnManager neutronVpnService, IInterfaceManager interfaceManager) {
super();
this.macEntry = macEntry;
this.arpMonitorProfileId = profileId;
this.alivenessManager = alivenessManager;
this.interfaceRpc = interfaceRpc;
this.neutronVpnService = neutronVpnService;
+ this.interfaceManager = interfaceManager;
}
@Override
public List<ListenableFuture<Void>> call() throws Exception {
AlivenessMonitorUtils.startArpMonitoring(macEntry, arpMonitorProfileId,
- alivenessManager, databroker, interfaceRpc, neutronVpnService);
+ alivenessManager, databroker, interfaceRpc, neutronVpnService,
+ interfaceManager);
return null;
}
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
import org.opendaylight.genius.mdsalutil.NwConstants;
import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
private final IMdsalApiManager mdsalManager;
private final AlivenessMonitorService alivenessManager;
private final INeutronVpnManager neutronVpnService;
+ private final IInterfaceManager interfaceManager;
private Long arpMonitorProfileId = 0L;
public ArpMonitoringHandler(final DataBroker dataBroker, final OdlInterfaceRpcService interfaceRpc,
- IMdsalApiManager mdsalManager, AlivenessMonitorService alivenessManager, INeutronVpnManager neutronVpnService) {
+ IMdsalApiManager mdsalManager, AlivenessMonitorService alivenessManager, INeutronVpnManager neutronVpnService,
+ IInterfaceManager interfaceManager) {
super(VpnPortipToPort.class, ArpMonitoringHandler.class);
this.dataBroker = dataBroker;
this.interfaceRpc = interfaceRpc;
this.mdsalManager = mdsalManager;
this.alivenessManager = alivenessManager;
this.neutronVpnService = neutronVpnService;
+ this.interfaceManager = interfaceManager;
}
public void start() {
DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
coordinator.enqueueJob(buildJobKey(srcInetAddr.toString(), vpnName),
new ArpMonitorStartTask(macEntry, arpMonitorProfileId, dataBroker, alivenessManager,
- interfaceRpc, neutronVpnService));
+ interfaceRpc, neutronVpnService, interfaceManager));
}
if (value.isSubnetIp()) {
WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
odl:type="default" />
<reference id="mdsalUtils"
interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
+ <reference id="interfaceManager"
+ interface="org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager" />
<reference id="notificationPublishService"
interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService" />
<reference id="bgpmanager"
<argument ref="mdsalUtils" />
<argument ref="alivenessManager" />
<argument ref="neutronVpnService" />
+ <argument ref="interfaceManager" />
</bean>
<bean id="subnetRoutePacketInHandler"