Bug 7075: AlivenessMonitor skip non-neutron ports 18/48318/1
authorAlon Kochba <alonko@hpe.com>
Mon, 7 Nov 2016 18:27:45 +0000 (20:27 +0200)
committerSam Hague <shague@redhat.com>
Mon, 14 Nov 2016 13:59:32 +0000 (13:59 +0000)
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>
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java
vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/AlivenessMonitorUtils.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ArpMonitorStartTask.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ArpMonitoringHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml

index ac81af68cbb1d6e553573e42f56db136cb1807bb..de3a828afc8d6224c1ca20d0e45c50a84143f907 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netvirt.elan.internal;
 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;
@@ -22,6 +23,7 @@ import java.util.Set;
 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;
@@ -136,6 +138,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         this.elanForwardingEntriesHandler.setElanUtils(elanUtils);
     }
 
+    @Override
     public void init() {
         registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
@@ -846,7 +849,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
         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,
@@ -1093,7 +1096,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                 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++;
@@ -1128,7 +1131,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                     continue;
                 }
 
-                if (!elanUtils.isExternal(ifName)) {
+                if (!interfaceManager.isExternalInterface(ifName)) {
                     // only add root interfaces
                     bucketId = addInterfaceIfRootInterface(bucketId, ifName, listBucket, ifInfo);
                 }
index 4d7f3d1d3fa6a79c13ba39758dacb84cd2938b41..0954979bf2027b9a7a9b1c0d49ad3d6e5d0ded24 100644 (file)
@@ -588,7 +588,7 @@ public class ElanServiceProvider implements IElanService {
 
         Set<String> externalElanInterfaces = new HashSet<>();
         for (String elanInterface : elanInterfaces) {
-            if (elanUtils.isExternal(elanInterface)) {
+            if (interfaceManager.isExternalInterface(elanInterface)) {
                 externalElanInterfaces.add(elanInterface);
             }
         }
@@ -596,13 +596,14 @@ public class ElanServiceProvider implements IElanService {
         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
@@ -661,7 +662,7 @@ public class ElanServiceProvider implements IElanService {
                 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);
index 7432df5517530df2169cb2c75dce7a8bdaa6e78c..8154e6364d15cb75fc5521e5cce751dc0a444af2 100755 (executable)
@@ -12,6 +12,7 @@ import com.google.common.util.concurrent.CheckedFuture;
 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;
@@ -20,6 +21,7 @@ import java.util.Map;
 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;
@@ -46,13 +48,11 @@ import org.opendaylight.genius.mdsalutil.NwConstants;
 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;
@@ -72,7 +72,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 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;
@@ -172,7 +171,7 @@ public class ElanUtils {
     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
@@ -189,13 +188,13 @@ public class ElanUtils {
     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);
@@ -2055,29 +2054,6 @@ public class ElanUtils {
         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.
      *
@@ -2099,27 +2075,6 @@ public class ElanUtils {
         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();
@@ -2148,21 +2103,6 @@ public class ElanUtils {
                 && 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) {
@@ -2271,7 +2211,7 @@ public class ElanUtils {
         }
 
         for (String dpnInterface : dpnInterfaces.getInterfaces()) {
-            if (isExternal(dpnInterface)) {
+            if (interfaceManager.isExternalInterface(dpnInterface)) {
                 return dpnInterface;
             }
         }
index 0d5879d4657bffc5f67d9083889b33f0c932e74d..23307da483da9f9c1598d6154698325eb8bab7ea 100644 (file)
@@ -82,7 +82,7 @@
     <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">
index b52b24138c2611d982417358d9f11555bbc8e8c5..ce9850bd68e1e26adcb35da90e58a1206fb9506f 100644 (file)
@@ -7,7 +7,13 @@
  */
 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;
@@ -40,21 +46,23 @@ import org.slf4j.LoggerFactory;
 
 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()) {
@@ -197,4 +205,4 @@ public class AlivenessMonitorUtils {
         return monitorId;
     }
 
-}
\ No newline at end of file
+}
index c2c080240fbae03e2b8d065c2c3fcb82832f3dc3..cfd87f00abed311cf6fb46fb4a2cae79e1072308 100644 (file)
@@ -7,10 +7,10 @@
  */
 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;
@@ -23,10 +23,11 @@ public class ArpMonitorStartTask implements Callable<List<ListenableFuture<Void>
     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;
@@ -34,12 +35,14 @@ public class ArpMonitorStartTask implements Callable<List<ListenableFuture<Void>
         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;
     }
 
index 0ef1a5f615c3c1020c38fc2b67fad2dec347f650..e20ab7827789abb6ae6ee826fc0a37b1eadb9853 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 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;
@@ -38,16 +39,19 @@ public class ArpMonitoringHandler extends AsyncDataTreeChangeListenerBase<VpnPor
     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() {
@@ -114,7 +118,7 @@ public class ArpMonitoringHandler extends AsyncDataTreeChangeListenerBase<VpnPor
                 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();
index 0b06c930539599181439c28abd1435e95cce5b7b..f76b87b479c9a103c83d6e10ccbbb5cd6eed9982 100644 (file)
@@ -8,6 +8,8 @@
              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"
@@ -95,6 +97,7 @@
     <argument ref="mdsalUtils" />
     <argument ref="alivenessManager" />
     <argument ref="neutronVpnService" />
+    <argument ref="interfaceManager" />
   </bean>
 
   <bean id="subnetRoutePacketInHandler"