From edfffe8c2f38785b30d4cc4277c5da6fa51ca44b Mon Sep 17 00:00:00 2001 From: Tom Pantelis Date: Fri, 24 Nov 2017 01:32:05 -0500 Subject: [PATCH] Eliminate circular dependencies and convert to BP annotations in elanmanager ElanInstanceManager -> ElanInterfaceManager -> ElanUtils -> ElanInstanceManager Elimnated ElanUtils -> ElanInstanceManager by moving ElanInterfaceManager.getElanDPNByName to ElanUtils. Eliminated ElanInterfaceManager.setElanUtils and ElanUtils.getElanL2GatewayMulticastUtils that were put in to avoid circular dependencies between ElanUtils, ElanInterfaceManager, ElanInterfaceManager and ElanL2GatewayMulticastUtils. The circular dependencies were eliminated by eliminating the dependencies between ElanL2GatewayMulticastUtils -> ElanInterfaceManager and ElanL2GatewayMulticastUtils -> ElanInstanceManager. The former entailed moving ElanInterfaceManager.updateRemoteBroadcastGroupForAllElanDpns et al to ElanL2GatewayMulticastUtils. The latter entailed the caller looking up and passing the ElanInstance to updateRemoteBroadcastGroupForAllElanDpns via handleMcastForElanL2GwDeviceDelete, handleMcastForElanL2GwDeviceAdd. The call sites for these are DisAssociateHwvtepFromElanJob and LogicalSwitchAddedJob via L2GatewayConnectionUtils, AssociateHwvtepToElanJob and HwvtepLogicalSwitchListener. Change-Id: Ida1d3c64e6a122af6f96fad59b5295319a2098ef Signed-off-by: Tom Pantelis --- .../elanmanager/elanmanager-impl/pom.xml | 4 + .../elan/evpn/utils/EvpnMacVrfUtils.java | 21 +- .../netvirt/elan/evpn/utils/EvpnUtils.java | 6 - .../elan/internal/ElanBridgeManager.java | 11 +- .../ElanDpnInterfaceClusteredListener.java | 13 +- .../internal/ElanDpnInterfacesListener.java | 4 + .../ElanDpnToTransportZoneListener.java | 9 +- .../elan/internal/ElanExtnTepListener.java | 20 +- .../elan/internal/ElanInstanceManager.java | 14 - .../internal/ElanInterfaceConfigListener.java | 6 - .../elan/internal/ElanInterfaceManager.java | 234 +--------- .../ElanInterfaceStateChangeListener.java | 11 +- .../ElanInterfaceStateClusteredListener.java | 6 + .../ElanLearntVpnVipToPortListener.java | 12 +- .../elan/internal/ElanNodeListener.java | 8 +- .../elan/internal/ElanOvsdbNodeListener.java | 6 + .../elan/internal/ElanPacketInHandler.java | 5 +- .../elan/internal/ElanServiceProvider.java | 23 +- .../internal/ElanSmacFlowEventListener.java | 5 +- .../ElanTunnelInterfaceStateListener.java | 6 + .../VpnDpnToTransportZoneListener.java | 13 +- .../elan/l2gw/ha/handlers/HAEventHandler.java | 7 +- .../ha/listeners/HAConfigNodeListener.java | 4 + .../elan/l2gw/ha/listeners/HAListeners.java | 9 +- .../ha/listeners/HAOpClusteredListener.java | 4 + .../l2gw/ha/listeners/HAOpNodeListener.java | 4 + .../ha/listeners/HwvtepNodeBaseListener.java | 4 +- .../l2gw/jobs/AssociateHwvtepToElanJob.java | 13 +- .../jobs/DisAssociateHwvtepFromElanJob.java | 15 +- .../elan/l2gw/jobs/LogicalSwitchAddedJob.java | 15 +- .../elan/l2gw/listeners/ChildListener.java | 2 + .../l2gw/listeners/ElanGroupListener.java | 25 +- .../l2gw/listeners/ElanInstanceListener.java | 12 +- .../HwvtepLogicalSwitchListener.java | 17 +- .../HwvtepPhysicalSwitchListener.java | 6 + .../HwvtepTerminationPointListener.java | 4 + .../L2GatewayConnectionListener.java | 6 + .../l2gw/listeners/LocalUcastMacListener.java | 15 +- .../utils/ElanL2GatewayMulticastUtils.java | 243 +++++++++- .../elan/l2gw/utils/ElanL2GatewayUtils.java | 7 +- .../l2gw/utils/L2GatewayConnectionUtils.java | 25 +- .../elan/l2gw/utils/L2GatewayUtils.java | 20 - .../elan/l2gw/utils/L2gwServiceProvider.java | 4 + .../elan/statisitcs/ElanStatisticsImpl.java | 4 + .../statusanddiag/ElanStatusMonitorJMX.java | 8 +- .../elan/utils/CacheElanInstanceListener.java | 8 + .../utils/CacheElanInterfaceListener.java | 8 + .../utils/ElanForwardingEntriesHandler.java | 7 +- .../netvirt/elan/utils/ElanUtils.java | 29 +- .../utils/TransportZoneNotificationUtil.java | 4 + .../opendaylight/blueprint/elanmanager.xml | 417 +----------------- .../tests/ElanServiceTestModule.java | 6 + 52 files changed, 542 insertions(+), 847 deletions(-) diff --git a/vpnservice/elanmanager/elanmanager-impl/pom.xml b/vpnservice/elanmanager/elanmanager-impl/pom.xml index 182220b5da..6adcde6b51 100644 --- a/vpnservice/elanmanager/elanmanager-impl/pom.xml +++ b/vpnservice/elanmanager/elanmanager-impl/pom.xml @@ -245,6 +245,10 @@ true + + org.apache.aries.blueprint + blueprint-maven-plugin + diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java index 81e233d15b..85e09132e7 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnMacVrfUtils.java @@ -20,7 +20,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; -import org.opendaylight.netvirt.elan.internal.ElanInstanceManager; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; @@ -45,25 +44,24 @@ public class EvpnMacVrfUtils { private static final Logger LOG = LoggerFactory.getLogger(EvpnMacVrfUtils.class); private final DataBroker dataBroker; - private final ElanInstanceManager elanInstanceManager; private final IdManagerService idManager; private final ElanEvpnFlowUtils elanEvpnFlowUtils; private final IMdsalApiManager mdsalManager; private final EvpnUtils evpnUtils; private final JobCoordinator jobCoordinator; + private final ElanUtils elanUtils; @Inject - public EvpnMacVrfUtils(final DataBroker dataBroker, final ElanInstanceManager elanInstanceManager, - final IdManagerService idManager, final ElanEvpnFlowUtils elanEvpnFlowUtils, - final IMdsalApiManager mdsalManager, final EvpnUtils evpnUtils, - final JobCoordinator jobCoordinator) { + public EvpnMacVrfUtils(final DataBroker dataBroker, final IdManagerService idManager, + final ElanEvpnFlowUtils elanEvpnFlowUtils, final IMdsalApiManager mdsalManager, final EvpnUtils evpnUtils, + final JobCoordinator jobCoordinator, final ElanUtils elanUtils) { this.dataBroker = dataBroker; - this.elanInstanceManager = elanInstanceManager; this.idManager = idManager; this.elanEvpnFlowUtils = elanEvpnFlowUtils; this.mdsalManager = mdsalManager; this.evpnUtils = evpnUtils; this.jobCoordinator = jobCoordinator; + this.elanUtils = elanUtils; } public Long getElanTagByMacvrfiid(InstanceIdentifier macVrfEntryIid) { @@ -149,7 +147,7 @@ public class EvpnMacVrfUtils { return; } - List dpnInterfaceLists = elanInstanceManager.getElanDPNByName(elanName); + List dpnInterfaceLists = elanUtils.getElanDPNByName(elanName); if (checkEvpnAttachedToNet(elanName)) { //TODO(Riyaz) : Check if accessing first nexthop address is right solution String nexthopIP = macVrfEntry.getRoutePaths().get(0).getNexthopAddress(); @@ -182,7 +180,7 @@ public class EvpnMacVrfUtils { LOG.error("Error : elanName is null for iid {}", instanceIdentifier); return; } - List dpnInterfaceLists = elanInstanceManager.getElanDPNByName(elanName); + List dpnInterfaceLists = elanUtils.getElanDPNByName(elanName); //if (checkEvpnAttachedToNet(elanName)) { //TODO(Riyaz) : Check if accessing first nexthop address is right @@ -214,7 +212,7 @@ public class EvpnMacVrfUtils { } String elanName = elanInstance.getElanInstanceName(); - List dpnInterfaceLists = elanInstanceManager.getElanDPNByName(elanName); + List dpnInterfaceLists = elanUtils.getElanDPNByName(elanName); if (checkEvpnAttachedToNet(elanName)) { String nexthopIP = getRoutePathNexthopIp(macVrfEntry); @@ -259,8 +257,7 @@ public class EvpnMacVrfUtils { LOG.error("Error : elanInstance is null for iid {}", instanceIdentifier); return; } - List dpnInterfaceLists = - elanInstanceManager.getElanDPNByName(elanInstance.getElanInstanceName()); + List dpnInterfaceLists = elanUtils.getElanDPNByName(elanInstance.getElanInstanceName()); //if (checkEvpnAttachedToNet(elanName)) { String nexthopIP = getRoutePathNexthopIp(macVrfEntry); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java index 4b8b52092c..cb9f99afa6 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java @@ -100,12 +100,6 @@ public class EvpnUtils { this.jobCoordinator = jobCoordinator; } - public void init() { - } - - public void close() { - } - public boolean isWithdrawEvpnRT2Routes(ElanInstance original, ElanInstance update) { return isNetDetach.test(getEvpnNameFromElan(original), getEvpnNameFromElan(update)); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java index c0d1db2b92..de38abede5 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java @@ -19,6 +19,7 @@ import java.util.Map; import java.util.Optional; import java.util.Random; import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.interfacemanager.globals.IfmConstants; @@ -54,6 +55,7 @@ import org.slf4j.LoggerFactory; /** * This class provides functions for creating bridges via OVSDB, specifically the br-int bridge. */ +@Singleton public class ElanBridgeManager implements IElanBridgeManager { private static final Logger LOG = LoggerFactory.getLogger(ElanBridgeManager.class); @@ -70,7 +72,7 @@ public class ElanBridgeManager implements IElanBridgeManager { private final MdsalUtils mdsalUtils; private final IInterfaceManager interfaceManager; - final SouthboundUtils southboundUtils; + private final SouthboundUtils southboundUtils; private final Random random; private final Long maxBackoff; private final Long inactivityProbe; @@ -83,11 +85,12 @@ public class ElanBridgeManager implements IElanBridgeManager { * @param interfaceManager InterfaceManager */ @Inject - public ElanBridgeManager(DataBroker dataBroker, ElanConfig elanConfig, IInterfaceManager interfaceManager) { + public ElanBridgeManager(DataBroker dataBroker, ElanConfig elanConfig, IInterfaceManager interfaceManager, + SouthboundUtils southboundUtils, MdsalUtils mdsalUtils) { //TODO: ClusterAware!!!?? - this.mdsalUtils = new MdsalUtils(dataBroker); + this.mdsalUtils = mdsalUtils; this.interfaceManager = interfaceManager; - this.southboundUtils = new SouthboundUtils(mdsalUtils); + this.southboundUtils = southboundUtils; this.random = new Random(System.currentTimeMillis()); this.maxBackoff = elanConfig.getControllerMaxBackoff(); this.inactivityProbe = elanConfig.getControllerInactivityProbe(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java index b97993b893..247e3d71e1 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfaceClusteredListener.java @@ -8,6 +8,9 @@ package org.opendaylight.netvirt.elan.internal; import java.util.Collections; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase; @@ -27,6 +30,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanDpnInterfaceClusteredListener extends AsyncClusteredDataTreeChangeListenerBase { @@ -39,17 +43,20 @@ public class ElanDpnInterfaceClusteredListener private final ElanClusterUtils elanClusterUtils; private final JobCoordinator jobCoordinator; + @Inject public ElanDpnInterfaceClusteredListener(DataBroker broker, EntityOwnershipUtils entityOwnershipUtils, - ElanUtils elanUtils, ElanL2GatewayUtils elanL2GatewayUtils, - ElanClusterUtils elanClusterUtils, JobCoordinator jobCoordinator) { + ElanL2GatewayUtils elanL2GatewayUtils, + ElanClusterUtils elanClusterUtils, JobCoordinator jobCoordinator, + ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils) { this.broker = broker; this.entityOwnershipUtils = entityOwnershipUtils; this.elanL2GatewayUtils = elanL2GatewayUtils; - this.elanL2GatewayMulticastUtils = elanUtils.getElanL2GatewayMulticastUtils(); + this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.elanClusterUtils = elanClusterUtils; this.jobCoordinator = jobCoordinator; } + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, this.broker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java index 2c31e1a121..f65405fe9c 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnInterfacesListener.java @@ -11,7 +11,9 @@ package org.opendaylight.netvirt.elan.internal; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import javax.annotation.PostConstruct; import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; @@ -26,6 +28,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanDpnInterfacesListener extends AsyncDataTreeChangeListenerBase { @@ -44,6 +47,7 @@ public class ElanDpnInterfacesListener this.jobCoordinator = jobCoordinator; } + @PostConstruct public void start() { registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java index cfcb9c522a..fef1284f50 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanDpnToTransportZoneListener.java @@ -8,7 +8,9 @@ package org.opendaylight.netvirt.elan.internal; import java.math.BigInteger; - +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; @@ -23,6 +25,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanDpnToTransportZoneListener extends AsyncDataTreeChangeListenerBase { @@ -31,6 +34,7 @@ public class ElanDpnToTransportZoneListener private final DataBroker dbx; private final Boolean useTransportZone; + @Inject public ElanDpnToTransportZoneListener(final DataBroker dbx, final IInterfaceManager interfaceManager, final ElanConfig elanConfig, final TransportZoneNotificationUtil tznu) { useTransportZone = elanConfig.isAutoConfigTransportZones(); @@ -38,6 +42,7 @@ public class ElanDpnToTransportZoneListener this.dbx = dbx; } + @PostConstruct public void start() { LOG.info("{} start", getClass().getSimpleName()); @@ -90,4 +95,4 @@ public class ElanDpnToTransportZoneListener protected ElanDpnToTransportZoneListener getDataTreeChangeListener() { return ElanDpnToTransportZoneListener.this; } -} \ No newline at end of file +} diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java index 2bc479b7e7..9c33a3a768 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanExtnTepListener.java @@ -9,10 +9,14 @@ package org.opendaylight.netvirt.elan.internal; import com.google.common.collect.Lists; import com.google.common.util.concurrent.SettableFuture; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; +import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances; @@ -22,32 +26,30 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanExtnTepListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanExtnTepListener.class); private final DataBroker broker; - private final ElanInterfaceManager elanInterfaceManager; + private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; private final JobCoordinator jobCoordinator; - public ElanExtnTepListener(DataBroker dataBroker, ElanInterfaceManager elanInterfaceManager, + @Inject + public ElanExtnTepListener(DataBroker dataBroker, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, JobCoordinator jobCoordinator) { super(ExternalTeps.class, ElanExtnTepListener.class); this.broker = dataBroker; - this.elanInterfaceManager = elanInterfaceManager; + this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.jobCoordinator = jobCoordinator; } @Override + @PostConstruct public void init() { registerListener(LogicalDatastoreType.CONFIGURATION, broker); } - @Override - public void close() { - super.close(); - } - @Override protected InstanceIdentifier getWildCardPath() { return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class).child(ExternalTeps.class); @@ -78,7 +80,7 @@ public class ElanExtnTepListener extends AsyncDataTreeChangeListenerBase ft = SettableFuture.create(); try { //TODO make the following method return ft - elanInterfaceManager.updateRemoteBroadcastGroupForAllElanDpns(elanInfo); + elanL2GatewayMulticastUtils.updateRemoteBroadcastGroupForAllElanDpns(elanInfo); ft.set(null); } catch (Exception e) { //since the above method does a sync write , if it fails there was no retry diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java index b196d2b573..5a55dd6219 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java @@ -14,7 +14,6 @@ import com.google.common.base.Optional; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.annotation.Nonnull; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; @@ -35,7 +34,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.Elan import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesListKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface; @@ -177,18 +175,6 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase getElanDPNByName(String elanInstanceName) { - return getElanDPNByName(broker, elanInstanceName); - } - - @Nonnull - public static List getElanDPNByName(DataBroker dataBroker, String elanInstanceName) { - InstanceIdentifier elanIdentifier = getElanDpnOperationDataPath(elanInstanceName); - return MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).toJavaUtil().map( - ElanDpnInterfacesList::getDpnInterfaces).orElse(Collections.emptyList()); - } - private static InstanceIdentifier getElanDpnOperationDataPath(String elanInstanceName) { return InstanceIdentifier.builder(ElanDpnInterfaces.class) .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java index f804b03371..c5ab4442ab 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java @@ -52,12 +52,6 @@ public class ElanInterfaceConfigListener registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); } - @Override - public void close() { - LOG.info("ElanInterfaceConfigListener Closed"); - super.close(); - } - @Override protected InstanceIdentifier getWildCardPath() { return InstanceIdentifier.create(Interfaces.class).child(Interface.class); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index 762b3d9886..62cf34092b 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -25,9 +25,7 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; -import javax.annotation.Nonnull; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; @@ -105,7 +103,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.forwarding.tables.MacTableKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.elan.instance.ExternalTeps; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntries; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.state.Elan; @@ -129,8 +126,11 @@ import org.slf4j.LoggerFactory; * @see org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface */ @Singleton -@SuppressWarnings("deprecation") public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase { + private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceManager.class); + private static final long WAIT_TIME_FOR_SYNC_INSTALL = Long.getLong("wait.time.sync.install", 300L); + private static final boolean SH_FLAG_SET = true; + private static final boolean SH_FLAG_UNSET = false; private final DataBroker broker; private final IMdsalApiManager mdsalManager; @@ -141,26 +141,21 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase> unProcessedElanInterfaces = new ConcurrentHashMap<>(); - private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceManager.class); - @Inject public ElanInterfaceManager(final DataBroker dataBroker, final IdManagerService managerService, final IMdsalApiManager mdsalApiManager, IInterfaceManager interfaceManager, final ElanForwardingEntriesHandler elanForwardingEntriesHandler, final INeutronVpnManager neutronVpnManager, final ElanItmUtils elanItmUtils, final ElanEtreeUtils elanEtreeUtils, final ElanL2GatewayUtils elanL2GatewayUtils, - final JobCoordinator jobCoordinator) { + final ElanUtils elanUtils, final JobCoordinator jobCoordinator, + final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils) { super(ElanInterface.class, ElanInterfaceManager.class); this.broker = dataBroker; this.idManager = managerService; @@ -171,20 +166,9 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase getRemoteBCGroupBucketInfos(ElanInstance elanInfo, int bucketKeyStart, InterfaceInfo interfaceInfo, long elanTag) { - return getRemoteBCGroupBuckets(elanInfo, null, interfaceInfo.getDpId(), bucketKeyStart, elanTag); - } - - @Nonnull - public List getRemoteBCGroupBuckets(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, - int bucketId, long elanTag) { - List listBucketInfo = new ArrayList<>(); - ElanDpnInterfacesList elanDpns = elanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); - - if (isVxlan(elanInfo)) { - listBucketInfo.addAll(getRemoteBCGroupTunnelBuckets(elanDpns, dpnId, bucketId, - elanUtils.isOpenstackVniSemanticsEnforced() ? elanInfo.getSegmentationId() : elanTag)); - } - listBucketInfo.addAll(getRemoteBCGroupExternalPortBuckets(elanDpns, dpnInterfaces, dpnId, - getNextAvailableBucketId(listBucketInfo.size()))); - listBucketInfo.addAll(getRemoteBCGroupBucketsOfElanL2GwDevices(elanInfo, dpnId, - getNextAvailableBucketId(listBucketInfo.size()))); - listBucketInfo.addAll(getRemoteBCGroupBucketsOfElanExternalTeps(elanInfo, dpnId, - getNextAvailableBucketId(listBucketInfo.size()))); - return listBucketInfo; - } - - private int getNextAvailableBucketId(int bucketSize) { - return bucketSize + 1; - } - - @SuppressWarnings("checkstyle:IllegalCatch") - private List getRemoteBCGroupTunnelBuckets(ElanDpnInterfacesList elanDpns, BigInteger dpnId, int bucketId, - long elanTagOrVni) { - List listBucketInfo = new ArrayList<>(); - if (elanDpns != null) { - for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { - if (elanUtils.isDpnPresent(dpnInterface.getDpId()) && !Objects.equals(dpnInterface.getDpId(), dpnId) - && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { - try { - List listActionInfo = elanItmUtils.getInternalTunnelItmEgressAction(dpnId, - dpnInterface.getDpId(), elanTagOrVni); - if (listActionInfo.isEmpty()) { - continue; - } - listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, - MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); - bucketId++; - } catch (Exception ex) { - LOG.error("Logical Group Interface not found between source Dpn - {}, destination Dpn - {} ", - dpnId, dpnInterface.getDpId(), ex); - } - } - } - } - return listBucketInfo; - } - - private List getRemoteBCGroupExternalPortBuckets(ElanDpnInterfacesList elanDpns, - DpnInterfaces dpnInterfaces, BigInteger dpnId, int bucketId) { - DpnInterfaces currDpnInterfaces = dpnInterfaces != null ? dpnInterfaces : getDpnInterfaces(elanDpns, dpnId); - if (currDpnInterfaces == null || !elanUtils.isDpnPresent(currDpnInterfaces.getDpId()) - || currDpnInterfaces.getInterfaces() == null || currDpnInterfaces.getInterfaces().isEmpty()) { - return Collections.emptyList(); - } - List listBucketInfo = new ArrayList<>(); - for (String interfaceName : currDpnInterfaces.getInterfaces()) { - if (interfaceManager.isExternalInterface(interfaceName)) { - List listActionInfo = elanItmUtils.getExternalPortItmEgressAction(interfaceName); - if (!listActionInfo.isEmpty()) { - listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, - MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); - bucketId++; - } - } - } - return listBucketInfo; - } - - private DpnInterfaces getDpnInterfaces(ElanDpnInterfacesList elanDpns, BigInteger dpnId) { - if (elanDpns != null) { - for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { - if (dpnInterface.getDpId().equals(dpnId)) { - return dpnInterface; - } - } - } - return null; + return elanL2GatewayMulticastUtils.getRemoteBCGroupBuckets(elanInfo, null, interfaceInfo.getDpId(), + bucketKeyStart, elanTag); } private void setElanAndEtreeBCGrouponOtherDpns(ElanInstance elanInfo, BigInteger dpId) { @@ -1052,8 +955,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase elanL2GwDevicesBuckets = getRemoteBCGroupBucketsOfElanL2GwDevices(elanInfo, dpId, - bucketId); + List elanL2GwDevicesBuckets = elanL2GatewayMulticastUtils + .getRemoteBCGroupBucketsOfElanL2GwDevices(elanInfo, dpId, bucketId); remoteListBucketInfo.addAll(elanL2GwDevicesBuckets); if (remoteListBucketInfo.isEmpty()) { @@ -1146,57 +1049,6 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase listBucket = new ArrayList<>(); - int bucketId = 0; - int actionKey = 0; - Long elanTag = elanInfo.getElanTag(); - List listAction = new ArrayList<>(); - listAction.add(new ActionGroup(ElanUtils.getElanLocalBCGId(elanTag)).buildAction(++actionKey)); - listBucket.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, - MDSALUtil.WATCH_GROUP)); - bucketId++; - List listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, dpnInterfaces, dpnId, bucketId, elanTag); - listBucket.addAll(listBucketInfoRemote); - long groupId = ElanUtils.getElanRemoteBCGId(elanTag); - Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, - MDSALUtil.buildBucketLists(listBucket)); - LOG.trace("Installing the remote BroadCast Group:{}", group); - mdsalManager.syncInstallGroup(dpnId, group); - } - - public void setupLeavesEtreeBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId) { - EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class); - if (etreeInstance != null) { - long etreeLeafTag = etreeInstance.getEtreeLeafTagVal().getValue(); - List listBucket = new ArrayList<>(); - int bucketId = 0; - int actionKey = 0; - List listAction = new ArrayList<>(); - listAction.add(new ActionGroup(ElanUtils.getEtreeLeafLocalBCGId(etreeLeafTag)).buildAction(++actionKey)); - listBucket.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, - MDSALUtil.WATCH_GROUP)); - bucketId++; - List listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, dpnInterfaces, dpnId, bucketId, - etreeLeafTag); - listBucket.addAll(listBucketInfoRemote); - long groupId = ElanUtils.getEtreeLeafRemoteBCGId(etreeLeafTag); - Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, - MDSALUtil.buildBucketLists(listBucket)); - LOG.trace("Installing the remote BroadCast Group:{}", group); - mdsalManager.syncInstallGroup(dpnId, group); - } - } - private void createDropBucket(List listBucket) { List actionsInfos = new ArrayList<>(); actionsInfos.add(new ActionDrop().buildAction()); @@ -1693,7 +1545,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase dpns = elanUtils.getInvolvedDpnsInElan(elanInfo.getElanInstanceName()); - for (DpnInterfaces dpn : dpns) { - setupElanBroadcastGroups(elanInfo, dpn.getDpId()); - } - } - - public List getRemoteBCGroupBucketsOfElanL2GwDevices(ElanInstance elanInfo, BigInteger dpnId, - int bucketId) { - List listBucketInfo = new ArrayList<>(); - ConcurrentMap map = ElanL2GwCacheUtils - .getInvolvedL2GwDevices(elanInfo.getElanInstanceName()); - for (L2GatewayDevice device : map.values()) { - String interfaceName = elanItmUtils.getExternalTunnelInterfaceName(String.valueOf(dpnId), - device.getHwvtepNodeId()); - if (interfaceName == null) { - continue; - } - List listActionInfo = elanItmUtils.buildTunnelItmEgressActions(interfaceName, - ElanUtils.getVxlanSegmentationId(elanInfo)); - listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, - MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); - bucketId++; - } - return listBucketInfo; - } - - public List getRemoteBCGroupBucketsOfElanExternalTeps(ElanInstance elanInfo, BigInteger dpnId, - int bucketId) { - List listBucketInfo = new ArrayList<>(); - List teps = elanInfo.getExternalTeps(); - if (teps == null || teps.isEmpty()) { - return listBucketInfo; - } - for (ExternalTeps tep : teps) { - String interfaceName = elanItmUtils.getExternalTunnelInterfaceName(String.valueOf(dpnId), - tep.getTepIp().toString()); - if (interfaceName == null) { - LOG.error("Could not get interface name to ext tunnel {} {}", dpnId, tep.getTepIp()); - continue; - } - List listActionInfo = elanItmUtils.buildTunnelItmEgressActions(interfaceName, - elanInfo.getSegmentationId()); - listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, - MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); - bucketId++; - } - return listBucketInfo; - } - @Override protected ElanInterfaceManager getDataTreeChangeListener() { return this; @@ -1918,7 +1720,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase { @@ -35,6 +39,7 @@ public class ElanInterfaceStateChangeListener private final ElanInterfaceManager elanInterfaceManager; private final JobCoordinator jobCoordinator; + @Inject public ElanInterfaceStateChangeListener(final DataBroker db, final ElanInterfaceManager ifManager, final JobCoordinator jobCoordinator) { super(Interface.class, ElanInterfaceStateChangeListener.class); @@ -44,6 +49,7 @@ public class ElanInterfaceStateChangeListener } @Override + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, broker); } @@ -97,11 +103,6 @@ public class ElanInterfaceStateChangeListener elanInterfaceManager.add(elanInterfaceId, elanInterface); } - @Override - public void close() { - - } - @Override protected InstanceIdentifier getWildCardPath() { return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java index 632440e23d..a0bd0b49fb 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateClusteredListener.java @@ -7,6 +7,9 @@ */ package org.opendaylight.netvirt.elan.internal; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase; @@ -21,6 +24,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanInterfaceStateClusteredListener extends AsyncClusteredDataTreeChangeListenerBase { @@ -35,6 +39,7 @@ public class ElanInterfaceStateClusteredListener extends * Why do we have ElanInterfaceStateChangeListener and ElanInterfaceStateClusteredListener * both within same module? Refactor this code into single listener. */ + @Inject public ElanInterfaceStateClusteredListener(DataBroker broker, ElanInterfaceManager elanInterfaceManager, ElanUtils elanUtils, ElanClusterUtils elanClusterUtils) { this.broker = broker; @@ -43,6 +48,7 @@ public class ElanInterfaceStateClusteredListener extends this.elanClusterUtils = elanClusterUtils; } + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, broker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java index 5dbdd63109..2b269c442f 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanLearntVpnVipToPortListener.java @@ -12,6 +12,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.Callable; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; 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; @@ -27,6 +30,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanLearntVpnVipToPortListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanLearntVpnVipToPortListener.class); @@ -35,6 +39,7 @@ public class ElanLearntVpnVipToPortListener extends private final ElanUtils elanUtils; private final JobCoordinator jobCoordinator; + @Inject public ElanLearntVpnVipToPortListener(DataBroker broker, IInterfaceManager interfaceManager, ElanUtils elanUtils, JobCoordinator jobCoordinator) { super(LearntVpnVipToPort.class, ElanLearntVpnVipToPortListener.class); @@ -45,16 +50,11 @@ public class ElanLearntVpnVipToPortListener extends } @Override + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, broker); } - @Override - public void close() { - super.close(); - LOG.debug("ElanLearntVpnPortIpToPort Listener Closed"); - } - @Override protected InstanceIdentifier getWildCardPath() { return InstanceIdentifier.create(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java index 3cb3269f12..db3444779c 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanNodeListener.java @@ -12,6 +12,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; 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; @@ -51,6 +54,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanNodeListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanNodeListener.class); @@ -63,6 +67,7 @@ public class ElanNodeListener extends AsyncDataTreeChangeListenerBase matches = new ArrayList(); + List matches = new ArrayList<>(); List actionsInfos = Collections.singletonList(new ActionNxResubmit(NwConstants .LPORT_DISPATCHER_TABLE)); List instructions = Collections.singletonList(new InstructionApplyActions(actionsInfos)); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java index a67f34c6a5..8135957d31 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java @@ -7,6 +7,9 @@ */ package org.opendaylight.netvirt.elan.internal; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; @@ -25,6 +28,7 @@ import org.slf4j.LoggerFactory; /** * Listen for new OVSDB nodes and then make sure they have the necessary bridges configured. */ +@Singleton public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanOvsdbNodeListener.class); private final DataBroker dataBroker; @@ -41,6 +45,7 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase { @@ -822,7 +817,7 @@ public class ElanServiceProvider extends AbstractLifecycle implements IElanServi return; } - List nodes = bridgeMgr.southboundUtils.getOvsdbNodes(); + List nodes = southboundUtils.getOvsdbNodes(); if (nodes == null || nodes.isEmpty()) { LOG.trace("No OVS nodes found while creating external network for ELAN {}", elanInstance.getElanInstanceName()); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java index 51d910eea1..ab74c0ad23 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanSmacFlowEventListener.java @@ -15,6 +15,8 @@ import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import javax.inject.Inject; +import javax.inject.Singleton; 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; @@ -40,7 +42,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@SuppressWarnings("deprecation") +@Singleton public class ElanSmacFlowEventListener implements SalFlowListener { private static final Logger LOG = LoggerFactory.getLogger(ElanSmacFlowEventListener.class); @@ -50,6 +52,7 @@ public class ElanSmacFlowEventListener implements SalFlowListener { private final ElanUtils elanUtils; private final JobCoordinator jobCoordinator; + @Inject public ElanSmacFlowEventListener(DataBroker broker, IInterfaceManager interfaceManager, ElanUtils elanUtils, JobCoordinator jobCoordinator) { this.broker = broker; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java index 4e4edaee75..94319ac4c3 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanTunnelInterfaceStateListener.java @@ -9,6 +9,9 @@ package org.opendaylight.netvirt.elan.internal; import java.math.BigInteger; import java.util.Collections; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; @@ -24,6 +27,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanTunnelInterfaceStateListener.class); @@ -32,6 +36,7 @@ public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListene private final ElanUtils elanUtils; private final JobCoordinator jobCoordinator; + @Inject public ElanTunnelInterfaceStateListener(final DataBroker dataBroker, final ElanInterfaceManager elanInterfaceManager, final ElanUtils elanUtils, final JobCoordinator jobCoordinator) { @@ -43,6 +48,7 @@ public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListene } @Override + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java index f3223f15e8..6f3d41c6d9 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/VpnDpnToTransportZoneListener.java @@ -8,7 +8,9 @@ package org.opendaylight.netvirt.elan.internal; import java.util.stream.Collectors; - +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; @@ -22,14 +24,16 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class VpnDpnToTransportZoneListener extends AsyncDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(VpnDpnToTransportZoneListener.class); - private TransportZoneNotificationUtil transportZoneNotificationUtil; - private DataBroker dbx; - private Boolean useTransportZone; + private final TransportZoneNotificationUtil transportZoneNotificationUtil; + private final DataBroker dbx; + private final Boolean useTransportZone; + @Inject public VpnDpnToTransportZoneListener(final DataBroker dbx, final IInterfaceManager interfaceManager, final ElanConfig elanConfig, final TransportZoneNotificationUtil tznu) { useTransportZone = elanConfig.isAutoConfigTransportZones(); @@ -37,6 +41,7 @@ public class VpnDpnToTransportZoneListener this.dbx = dbx; } + @PostConstruct public void start() { LOG.info("{} start", getClass().getSimpleName()); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java index 3f4cb8777b..8fc95effab 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/handlers/HAEventHandler.java @@ -9,25 +9,26 @@ package org.opendaylight.netvirt.elan.l2gw.ha.handlers; import com.google.common.base.Optional; import java.util.concurrent.ExecutionException; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +@Singleton public class HAEventHandler implements IHAEventHandler { private final NodeConnectedHandler nodeConnectedHandler; private final ConfigNodeUpdatedHandler configNodeUpdatedHandler = new ConfigNodeUpdatedHandler(); private final OpNodeUpdatedHandler opNodeUpdatedHandler = new OpNodeUpdatedHandler(); + @Inject public HAEventHandler(DataBroker db) { nodeConnectedHandler = new NodeConnectedHandler(db); } - public void close() { - } - @Override public void handleChildNodeConnected(Node connectedNode, InstanceIdentifier connectedNodePath, diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java index 97f1c4e61d..d05a5e67bc 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAConfigNodeListener.java @@ -11,6 +11,8 @@ import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastor import java.util.Set; import java.util.concurrent.ExecutionException; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -21,9 +23,11 @@ import org.opendaylight.netvirt.elan.l2gw.ha.handlers.IHAEventHandler; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +@Singleton public class HAConfigNodeListener extends HwvtepNodeBaseListener { private final IHAEventHandler haEventHandler; + @Inject public HAConfigNodeListener(DataBroker db, HAEventHandler haEventHandler) throws Exception { super(LogicalDatastoreType.CONFIGURATION, db); this.haEventHandler = haEventHandler; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAListeners.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAListeners.java index c505bf40a6..8dd0bf27cf 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAListeners.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAListeners.java @@ -9,6 +9,9 @@ package org.opendaylight.netvirt.elan.l2gw.ha.listeners; import java.util.ArrayList; import java.util.List; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.genius.utils.batching.ResourceBatchingManager; import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants; @@ -35,6 +38,7 @@ import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +@Singleton public class HAListeners implements AutoCloseable { private static final InstanceIdentifier PHYSICAL_PORT_IID = InstanceIdentifier.create(NetworkTopology.class) @@ -44,6 +48,7 @@ public class HAListeners implements AutoCloseable { private final DataBroker broker; private final List> listeners = new ArrayList<>(); + @Inject public HAListeners(DataBroker broker) { this.broker = broker; registerListener(LocalMcastMacs.class, new LocalMcastCmd()); @@ -59,10 +64,8 @@ public class HAListeners implements AutoCloseable { ResourceBatchingManager.ShardResource.OPERATIONAL_TOPOLOGY)); } - public void init() { - } - @Override + @PreDestroy public void close() throws Exception { for (HwvtepNodeDataListener listener : listeners) { listener.close(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java index 74b14422e9..da4b87c911 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpClusteredListener.java @@ -16,6 +16,8 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.stream.Collectors; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; @@ -29,12 +31,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class HAOpClusteredListener extends HwvtepNodeBaseListener implements ClusteredDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(HAOpClusteredListener.class); private final Set> connectedNodes = ConcurrentHashMap.newKeySet(); private final Map, Set>>> waitingJobs = new ConcurrentHashMap<>(); + @Inject public HAOpClusteredListener(DataBroker db) throws Exception { super(LogicalDatastoreType.OPERATIONAL, db); LOG.info("Registering HAOpClusteredListener"); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java index 74953130ca..1fe8c5a358 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HAOpNodeListener.java @@ -22,6 +22,8 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import javax.annotation.Nonnull; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; @@ -34,6 +36,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hw import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +@Singleton public class HAOpNodeListener extends HwvtepNodeBaseListener { private final IHAEventHandler haEventHandler; @@ -41,6 +44,7 @@ public class HAOpNodeListener extends HwvtepNodeBaseListener { private final Map availableGlobalNodes = new HashMap<>(); private final Map availablePsNodes = new HashMap<>(); + @Inject public HAOpNodeListener(DataBroker db, HAEventHandler haEventHandler) throws Exception { super(OPERATIONAL, db); this.haEventHandler = haEventHandler; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java index 4f6eb29b94..d992d96026 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/ha/listeners/HwvtepNodeBaseListener.java @@ -9,6 +9,7 @@ package org.opendaylight.netvirt.elan.l2gw.ha.listeners; import java.util.Collection; import java.util.concurrent.ExecutionException; +import javax.annotation.PreDestroy; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener; @@ -144,7 +145,8 @@ public abstract class HwvtepNodeBaseListener implements DataTreeChangeListener elanInstanceManager.getElanInstanceByName(logicalSwitchName)); return logicalSwitchAddedJob.call(); } } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java index a6fde389f2..0dc50a6cc3 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/jobs/DisAssociateHwvtepFromElanJob.java @@ -11,12 +11,13 @@ import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; +import java.util.function.Supplier; import javax.annotation.Nullable; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils; import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l2gateways.rev150712.l2gateway.attributes.Devices; import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; import org.slf4j.Logger; @@ -28,7 +29,6 @@ import org.slf4j.LoggerFactory; public class DisAssociateHwvtepFromElanJob implements Callable>> { private static final Logger LOG = LoggerFactory.getLogger(DisAssociateHwvtepFromElanJob.class); - private final DataBroker broker; private final ElanL2GatewayUtils elanL2GatewayUtils; private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; private final L2GatewayDevice l2GatewayDevice; @@ -37,17 +37,18 @@ public class DisAssociateHwvtepFromElanJob implements Callable elanInstanceSupplier; - public DisAssociateHwvtepFromElanJob(DataBroker broker, ElanL2GatewayUtils elanL2GatewayUtils, + public DisAssociateHwvtepFromElanJob(ElanL2GatewayUtils elanL2GatewayUtils, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, @Nullable L2GatewayDevice l2GatewayDevice, String elanName, - Devices l2Device, Integer defaultVlan, String nodeId, - boolean isLastL2GwConnDeleted) { - this.broker = broker; + Supplier elanInstanceSupplier, Devices l2Device, + Integer defaultVlan, String nodeId, boolean isLastL2GwConnDeleted) { this.elanL2GatewayUtils = elanL2GatewayUtils; this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.l2GatewayDevice = l2GatewayDevice; this.elanName = elanName; + this.elanInstanceSupplier = elanInstanceSupplier; this.l2Device = l2Device; this.defaultVlan = defaultVlan; this.isLastL2GwConnDeleted = isLastL2GwConnDeleted; @@ -84,7 +85,7 @@ public class DisAssociateHwvtepFromElanJob implements Callable>> { + private static final Logger LOG = LoggerFactory.getLogger(LogicalSwitchAddedJob.class); + /** The logical switch name. */ private final String logicalSwitchName; @@ -36,21 +40,21 @@ public class LogicalSwitchAddedJob implements Callable elanInstanceSupplier; public LogicalSwitchAddedJob(ElanL2GatewayUtils elanL2GatewayUtils, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, String logicalSwitchName, - Devices physicalDevice, L2GatewayDevice l2GatewayDevice, - Integer defaultVlanId) { + Devices physicalDevice, L2GatewayDevice l2GatewayDevice, Integer defaultVlanId, + Supplier elanInstanceSupplier) { this.elanL2GatewayUtils = elanL2GatewayUtils; this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.logicalSwitchName = logicalSwitchName; this.physicalDevice = physicalDevice; this.elanL2GwDevice = l2GatewayDevice; this.defaultVlanId = defaultVlanId; + this.elanInstanceSupplier = elanInstanceSupplier; LOG.debug("created logical switch added job for {} {}", logicalSwitchName, elanL2GwDevice.getHwvtepNodeId()); } @@ -69,7 +73,8 @@ public class LogicalSwitchAddedJob implements Callable getParentWildCardPath(); @Override + @PreDestroy public void close() throws Exception { if (registration != null) { registration.close(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java index 6ac0f974d0..bfd66da2e5 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanGroupListener.java @@ -11,11 +11,12 @@ import java.math.BigInteger; import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentMap; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase; -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.utils.ElanClusterUtils; import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils; @@ -31,21 +32,23 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(ElanGroupListener.class); - private final ElanInterfaceManager elanInterfaceManager; private final DataBroker broker; - private final ElanInstanceManager elanInstanceManager; private final ElanClusterUtils elanClusterUtils; + private final ElanUtils elanUtils; + private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; - public ElanGroupListener(ElanInterfaceManager elanInterfaceManager, final DataBroker db, - ElanClusterUtils elanClusterUtils, ElanInstanceManager elanInstanceManager) { + @Inject + public ElanGroupListener(DataBroker db, ElanClusterUtils elanClusterUtils, ElanUtils elanUtils, + ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils) { super(Group.class, ElanGroupListener.class); - this.elanInterfaceManager = elanInterfaceManager; broker = db; this.elanClusterUtils = elanClusterUtils; - this.elanInstanceManager = elanInstanceManager; + this.elanUtils = elanUtils; + this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; registerListener(LogicalDatastoreType.CONFIGURATION, broker); LOG.trace("ElanGroupListener registered"); } @@ -114,7 +117,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< return; } boolean updateGroup = false; - List dpns = elanInstanceManager.getElanDPNByName(elanInstance.getElanInstanceName()); + List dpns = elanUtils.getElanDPNByName(elanInstance.getElanInstanceName()); if (dpns.size() > 0) { expectedElanFootprint += dpns.size(); } else { @@ -130,7 +133,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< } } if (updateGroup) { - List bucketList = elanInterfaceManager.getRemoteBCGroupBuckets(elanInstance, null, dpnId, 0, + List bucketList = elanL2GatewayMulticastUtils.getRemoteBCGroupBuckets(elanInstance, null, dpnId, 0, elanInstance.getElanTag()); expectedElanFootprint--;//remove local bcgroup bucket if (bucketList.size() != expectedElanFootprint) { @@ -140,7 +143,7 @@ public class ElanGroupListener extends AsyncClusteredDataTreeChangeListenerBase< LOG.trace("no of buckets mismatched {} {}", elanInstance.getElanInstanceName(), update.getKey().getGroupId()); elanClusterUtils.runOnlyInOwnerNode(elanInstance.getElanInstanceName(), "updating broadcast group", () -> { - elanInterfaceManager.setupElanBroadcastGroups(elanInstance, dpnId); + elanL2GatewayMulticastUtils.setupElanBroadcastGroups(elanInstance, dpnId); return null; }); } else { diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java index 224e363588..d1fa8434ff 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/ElanInstanceListener.java @@ -11,6 +11,9 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -27,6 +30,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanInstanceListener extends AsyncClusteredDataTreeChangeListenerBase { @@ -36,18 +40,16 @@ public class ElanInstanceListener extends AsyncClusteredDataTreeChangeListenerBa private final ElanClusterUtils elanClusterUtils; private static final Map> WAITING_JOB_LIST = new ConcurrentHashMap<>(); + @Inject public ElanInstanceListener(final DataBroker db, final ElanClusterUtils elanClusterUtils) { super(ElanInstance.class, ElanInstanceListener.class); broker = db; this.elanClusterUtils = elanClusterUtils; - registerListener(LogicalDatastoreType.CONFIGURATION, db); } + @PostConstruct public void init() { - } - - @Override - public void close() { + registerListener(LogicalDatastoreType.CONFIGURATION, broker); } @Override diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepLogicalSwitchListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepLogicalSwitchListener.java index b059fb11e1..75b2c8e6e7 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepLogicalSwitchListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepLogicalSwitchListener.java @@ -9,6 +9,7 @@ package org.opendaylight.netvirt.elan.l2gw.listeners; import org.opendaylight.genius.datastoreutils.hwvtep.HwvtepClusteredDataTreeChangeListener; import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils; +import org.opendaylight.netvirt.elan.internal.ElanInstanceManager; import org.opendaylight.netvirt.elan.l2gw.jobs.LogicalSwitchAddedJob; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils; import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils; @@ -54,6 +55,7 @@ public class HwvtepLogicalSwitchListener extends // Id of L2 Gateway connection responsible for this logical switch creation private final Uuid l2GwConnId; + private final ElanInstanceManager elanInstanceManager; private final ElanL2GatewayUtils elanL2GatewayUtils; private final ElanClusterUtils elanClusterUtils; private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; @@ -62,11 +64,12 @@ public class HwvtepLogicalSwitchListener extends /** * Instantiates a new hardware vtep logical switch listener. */ - public HwvtepLogicalSwitchListener(ElanL2GatewayUtils elanL2GatewayUtils, ElanClusterUtils elanClusterUtils, - ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, L2GatewayConnectionUtils l2GatewayConnectionUtils, - L2GatewayDevice l2GatewayDevice, String logicalSwitchName, Devices physicalDevice, Integer defaultVlanId, - Uuid l2GwConnId) { + public HwvtepLogicalSwitchListener(ElanInstanceManager elanInstanceManager, ElanL2GatewayUtils elanL2GatewayUtils, + ElanClusterUtils elanClusterUtils, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, + L2GatewayConnectionUtils l2GatewayConnectionUtils, L2GatewayDevice l2GatewayDevice, + String logicalSwitchName, Devices physicalDevice, Integer defaultVlanId, Uuid l2GwConnId) { super(LogicalSwitches.class, HwvtepLogicalSwitchListener.class); + this.elanInstanceManager = elanInstanceManager; this.elanL2GatewayUtils = elanL2GatewayUtils; this.elanClusterUtils = elanClusterUtils; this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; @@ -136,9 +139,9 @@ public class HwvtepLogicalSwitchListener extends L2GatewayDevice elanDevice = l2GatewayConnectionUtils.addL2DeviceToElanL2GwCache( logicalSwitchNew.getHwvtepNodeName().getValue(), l2GatewayDevice, l2GwConnId, physicalDevice); - LogicalSwitchAddedJob logicalSwitchAddedWorker = new LogicalSwitchAddedJob(elanL2GatewayUtils, - elanL2GatewayMulticastUtils, logicalSwitchName, physicalDevice, elanDevice, - defaultVlanId); + LogicalSwitchAddedJob logicalSwitchAddedWorker = new LogicalSwitchAddedJob( + elanL2GatewayUtils, elanL2GatewayMulticastUtils, logicalSwitchName, physicalDevice, elanDevice, + defaultVlanId, () -> elanInstanceManager.getElanInstanceByName(logicalSwitchName)); elanClusterUtils.runOnlyInOwnerNode(logicalSwitchAddedWorker.getJobKey(), "create vlan mappings and mcast configurations", logicalSwitchAddedWorker); } catch (RuntimeException e) { diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java index 4b94277ba8..851d306a40 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepPhysicalSwitchListener.java @@ -15,6 +15,9 @@ import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.function.BiPredicate; import java.util.function.Predicate; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; @@ -50,6 +53,7 @@ import org.slf4j.LoggerFactory; /** * Listener to handle physical switch updates. */ +@Singleton public class HwvtepPhysicalSwitchListener extends HwvtepAbstractDataTreeChangeListener implements ClusteredDataTreeChangeListener { @@ -122,6 +126,7 @@ public class HwvtepPhysicalSwitchListener /** * Instantiates a new hwvtep physical switch listener. */ + @Inject public HwvtepPhysicalSwitchListener(final DataBroker dataBroker, ItmRpcService itmRpcService, ElanClusterUtils elanClusterUtils, L2gwServiceProvider l2gwServiceProvider, HAOpClusteredListener haListener) { @@ -134,6 +139,7 @@ public class HwvtepPhysicalSwitchListener } @Override + @PostConstruct public void init() { registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java index 3c398cc41f..a90aa3e845 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/HwvtepTerminationPointListener.java @@ -18,6 +18,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nonnull; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -53,6 +55,7 @@ import org.slf4j.LoggerFactory; /** * Listener for physical locator presence in operational datastore. */ +@Singleton public class HwvtepTerminationPointListener extends HwvtepClusteredDataTreeChangeListener { @@ -62,6 +65,7 @@ public class HwvtepTerminationPointListener private final ElanL2GatewayUtils elanL2GatewayUtils; private final ElanClusterUtils elanClusterUtils; + @Inject public HwvtepTerminationPointListener(DataBroker broker, ElanL2GatewayUtils elanL2GatewayUtils, ElanClusterUtils elanClusterUtils) { super(TerminationPoint.class, HwvtepTerminationPointListener.class); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java index cf5214c5a0..5de55b3d17 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/L2GatewayConnectionListener.java @@ -7,6 +7,9 @@ */ package org.opendaylight.netvirt.elan.l2gw.listeners; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase; @@ -18,6 +21,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeListenerBase { private static final Logger LOG = LoggerFactory.getLogger(L2GatewayConnectionListener.class); @@ -25,12 +29,14 @@ public class L2GatewayConnectionListener extends AsyncClusteredDataTreeChangeLis private final DataBroker broker; private final L2GatewayConnectionUtils l2GatewayConnectionUtils; + @Inject public L2GatewayConnectionListener(final DataBroker db, L2GatewayConnectionUtils l2GatewayConnectionUtils) { super(L2gatewayConnection.class, L2GatewayConnectionListener.class); this.broker = db; this.l2GatewayConnectionUtils = l2GatewayConnectionUtils; } + @PostConstruct public void init() { registerListener(LogicalDatastoreType.CONFIGURATION, broker); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java index d23807d222..fdf9e8db12 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/listeners/LocalUcastMacListener.java @@ -13,12 +13,13 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; +import javax.annotation.PostConstruct; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; @@ -45,6 +46,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +@Singleton public class LocalUcastMacListener extends ChildListener implements ClusteredDataTreeChangeListener { @@ -64,11 +66,10 @@ public class LocalUcastMacListener extends ChildListener, List>> staleCandidateMacsByNodeId - = new ConcurrentHashMap<>(); private final HAOpClusteredListener haOpClusteredListener; private final JobCoordinator jobCoordinator; + @Inject public LocalUcastMacListener(final DataBroker dataBroker, final HAOpClusteredListener haOpClusteredListener, final ElanL2GatewayUtils elanL2GatewayUtils, @@ -80,6 +81,7 @@ public class LocalUcastMacListener extends ChildListener identifier, final LocalUcastMacs macAdded) { - InstanceIdentifier nodeIid = identifier.firstIdentifierOf(Node.class); - if (staleCandidateMacsByNodeId.get(nodeIid) != null) { - LOG.trace("Clearing from candidate stale mac {}", identifier); - staleCandidateMacsByNodeId.get(nodeIid).remove(identifier); - } ResourceBatchingManager.getInstance().put(ResourceBatchingManager.ShardResource.CONFIG_TOPOLOGY, identifier, macAdded); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java index 32f75fbb42..567496e368 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayMulticastUtils.java @@ -7,38 +7,52 @@ */ package org.opendaylight.netvirt.elan.l2gw.utils; +import static org.opendaylight.netvirt.elan.utils.ElanUtils.isVxlan; + import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.concurrent.ConcurrentMap; +import javax.annotation.Nonnull; import javax.inject.Inject; import javax.inject.Singleton; 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.interfacemanager.interfaces.IInterfaceManager; import org.opendaylight.genius.mdsalutil.MDSALUtil; +import org.opendaylight.genius.mdsalutil.actions.ActionGroup; +import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.genius.utils.batching.ResourceBatchingManager; import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils; import org.opendaylight.genius.utils.hwvtep.HwvtepUtils; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; -import org.opendaylight.netvirt.elan.internal.ElanInstanceManager; -import org.opendaylight.netvirt.elan.internal.ElanInterfaceManager; import org.opendaylight.netvirt.elan.l2gw.jobs.HwvtepDeviceMcastMacUpdateJob; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanItmUtils; +import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils; import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice; 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.yang.types.rev130715.MacAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp.rev160428.DesignatedSwitchesForExternalTunnels; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp.rev160428.designated.switches._for.external.tunnels.DesignatedSwitchForTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.dhcp.rev160428.designated.switches._for.external.tunnels.DesignatedSwitchForTunnelKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInstance; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.elan.instance.ExternalTeps; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation; @@ -68,23 +82,21 @@ public class ElanL2GatewayMulticastUtils { /** The broker. */ private final DataBroker broker; - /** The elan instance manager. */ - private final ElanInstanceManager elanInstanceManager; - - /** The elan interface manager. */ - private final ElanInterfaceManager elanInterfaceManager; - private final ElanItmUtils elanItmUtils; private final JobCoordinator jobCoordinator; + private final ElanUtils elanUtils; + private final IMdsalApiManager mdsalManager; + private final IInterfaceManager interfaceManager; @Inject - public ElanL2GatewayMulticastUtils(DataBroker broker, ElanInstanceManager elanInstanceManager, - ElanInterfaceManager elanInterfaceManager, ElanItmUtils elanItmUtils, JobCoordinator jobCoordinator) { + public ElanL2GatewayMulticastUtils(DataBroker broker, ElanItmUtils elanItmUtils, JobCoordinator jobCoordinator, + ElanUtils elanUtils, IMdsalApiManager mdsalManager, IInterfaceManager interfaceManager) { this.broker = broker; - this.elanInstanceManager = elanInstanceManager; - this.elanInterfaceManager = elanInterfaceManager; this.elanItmUtils = elanItmUtils; this.jobCoordinator = jobCoordinator; + this.elanUtils = elanUtils; + this.mdsalManager = mdsalManager; + this.interfaceManager = interfaceManager; } /** @@ -96,8 +108,9 @@ public class ElanL2GatewayMulticastUtils { * the device * @return the listenable future */ - public ListenableFuture handleMcastForElanL2GwDeviceAdd(String elanName, L2GatewayDevice device) { - return updateMcastMacsForAllElanDevices(elanName, device, true/* updateThisDevice */); + public ListenableFuture handleMcastForElanL2GwDeviceAdd(String elanName, ElanInstance elanInstance, + L2GatewayDevice device) { + return updateMcastMacsForAllElanDevices(elanName, elanInstance, device, true/* updateThisDevice */); } /** @@ -147,7 +160,7 @@ public class ElanL2GatewayMulticastUtils { L2GatewayDevice device) { ConcurrentMap elanL2gwDevices = ElanL2GwCacheUtils .getInvolvedL2GwDevices(elanName); - List dpns = elanInstanceManager.getElanDPNByName(elanName); + List dpns = elanUtils.getElanDPNByName(elanName); List dpnsTepIps = getAllTepIpsOfDpns(device, dpns); List l2GwDevicesTepIps = getAllTepIpsOfL2GwDevices(elanL2gwDevices); preapareRemoteMcastMacEntry(transaction, elanName, device, dpnsTepIps, l2GwDevicesTepIps); @@ -160,22 +173,23 @@ public class ElanL2GatewayMulticastUtils { * * @param elanName * the elan name + * @param elanInstance + * the ElanInstance * @param device * the device * @param updateThisDevice * the update this device * @return the listenable future */ - public ListenableFuture updateMcastMacsForAllElanDevices(String elanName, L2GatewayDevice device, - boolean updateThisDevice) { + private ListenableFuture updateMcastMacsForAllElanDevices(String elanName, ElanInstance elanInstance, + L2GatewayDevice device, boolean updateThisDevice) { SettableFuture ft = SettableFuture.create(); ft.set(null); - ElanInstance elanInstance = elanInstanceManager.getElanInstanceByName(elanName); - elanInterfaceManager.updateRemoteBroadcastGroupForAllElanDpns(elanInstance); + updateRemoteBroadcastGroupForAllElanDpns(elanInstance); - List dpns = elanInstanceManager.getElanDPNByName(elanName); + List dpns = elanUtils.getElanDPNByName(elanName); ConcurrentMap devices = ElanL2GwCacheUtils .getInvolvedL2GwDevices(elanName); @@ -203,6 +217,189 @@ public class ElanL2GatewayMulticastUtils { } + public void updateRemoteBroadcastGroupForAllElanDpns(ElanInstance elanInfo) { + List dpns = elanUtils.getInvolvedDpnsInElan(elanInfo.getElanInstanceName()); + for (DpnInterfaces dpn : dpns) { + setupElanBroadcastGroups(elanInfo, dpn.getDpId()); + } + } + + public void setupElanBroadcastGroups(ElanInstance elanInfo, BigInteger dpnId) { + setupElanBroadcastGroups(elanInfo, null, dpnId); + } + + public void setupElanBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId) { + setupStandardElanBroadcastGroups(elanInfo, dpnInterfaces, dpnId); + setupLeavesEtreeBroadcastGroups(elanInfo, dpnInterfaces, dpnId); + } + + public void setupStandardElanBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId) { + List listBucket = new ArrayList<>(); + int bucketId = 0; + int actionKey = 0; + Long elanTag = elanInfo.getElanTag(); + List listAction = new ArrayList<>(); + listAction.add(new ActionGroup(ElanUtils.getElanLocalBCGId(elanTag)).buildAction(++actionKey)); + listBucket.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, + MDSALUtil.WATCH_GROUP)); + bucketId++; + List listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, dpnInterfaces, dpnId, bucketId, elanTag); + listBucket.addAll(listBucketInfoRemote); + long groupId = ElanUtils.getElanRemoteBCGId(elanTag); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, + MDSALUtil.buildBucketLists(listBucket)); + LOG.trace("Installing the remote BroadCast Group:{}", group); + mdsalManager.syncInstallGroup(dpnId, group); + } + + public void setupLeavesEtreeBroadcastGroups(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId) { + EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class); + if (etreeInstance != null) { + long etreeLeafTag = etreeInstance.getEtreeLeafTagVal().getValue(); + List listBucket = new ArrayList<>(); + int bucketId = 0; + int actionKey = 0; + List listAction = new ArrayList<>(); + listAction.add(new ActionGroup(ElanUtils.getEtreeLeafLocalBCGId(etreeLeafTag)).buildAction(++actionKey)); + listBucket.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, + MDSALUtil.WATCH_GROUP)); + bucketId++; + List listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, dpnInterfaces, dpnId, bucketId, + etreeLeafTag); + listBucket.addAll(listBucketInfoRemote); + long groupId = ElanUtils.getEtreeLeafRemoteBCGId(etreeLeafTag); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, + MDSALUtil.buildBucketLists(listBucket)); + LOG.trace("Installing the remote BroadCast Group:{}", group); + mdsalManager.syncInstallGroup(dpnId, group); + } + } + + private DpnInterfaces getDpnInterfaces(ElanDpnInterfacesList elanDpns, BigInteger dpnId) { + if (elanDpns != null) { + for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { + if (dpnInterface.getDpId().equals(dpnId)) { + return dpnInterface; + } + } + } + return null; + } + + private List getRemoteBCGroupExternalPortBuckets(ElanDpnInterfacesList elanDpns, + DpnInterfaces dpnInterfaces, BigInteger dpnId, int bucketId) { + DpnInterfaces currDpnInterfaces = dpnInterfaces != null ? dpnInterfaces : getDpnInterfaces(elanDpns, dpnId); + if (currDpnInterfaces == null || !elanUtils.isDpnPresent(currDpnInterfaces.getDpId()) + || currDpnInterfaces.getInterfaces() == null || currDpnInterfaces.getInterfaces().isEmpty()) { + return Collections.emptyList(); + } + List listBucketInfo = new ArrayList<>(); + for (String interfaceName : currDpnInterfaces.getInterfaces()) { + if (interfaceManager.isExternalInterface(interfaceName)) { + List listActionInfo = elanItmUtils.getExternalPortItmEgressAction(interfaceName); + if (!listActionInfo.isEmpty()) { + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, + MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + } + } + return listBucketInfo; + } + + @Nonnull + public List getRemoteBCGroupBuckets(ElanInstance elanInfo, DpnInterfaces dpnInterfaces, BigInteger dpnId, + int bucketId, long elanTag) { + List listBucketInfo = new ArrayList<>(); + ElanDpnInterfacesList elanDpns = elanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); + + if (isVxlan(elanInfo)) { + listBucketInfo.addAll(getRemoteBCGroupTunnelBuckets(elanDpns, dpnId, bucketId, + elanUtils.isOpenstackVniSemanticsEnforced() ? elanInfo.getSegmentationId() : elanTag)); + } + listBucketInfo.addAll(getRemoteBCGroupExternalPortBuckets(elanDpns, dpnInterfaces, dpnId, + getNextAvailableBucketId(listBucketInfo.size()))); + listBucketInfo.addAll(getRemoteBCGroupBucketsOfElanL2GwDevices(elanInfo, dpnId, + getNextAvailableBucketId(listBucketInfo.size()))); + listBucketInfo.addAll(getRemoteBCGroupBucketsOfElanExternalTeps(elanInfo, dpnId, + getNextAvailableBucketId(listBucketInfo.size()))); + return listBucketInfo; + } + + public List getRemoteBCGroupBucketsOfElanL2GwDevices(ElanInstance elanInfo, BigInteger dpnId, + int bucketId) { + List listBucketInfo = new ArrayList<>(); + ConcurrentMap map = ElanL2GwCacheUtils + .getInvolvedL2GwDevices(elanInfo.getElanInstanceName()); + for (L2GatewayDevice device : map.values()) { + String interfaceName = elanItmUtils.getExternalTunnelInterfaceName(String.valueOf(dpnId), + device.getHwvtepNodeId()); + if (interfaceName == null) { + continue; + } + List listActionInfo = elanItmUtils.buildTunnelItmEgressActions(interfaceName, + ElanUtils.getVxlanSegmentationId(elanInfo)); + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, + MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + return listBucketInfo; + } + + public List getRemoteBCGroupBucketsOfElanExternalTeps(ElanInstance elanInfo, BigInteger dpnId, + int bucketId) { + List listBucketInfo = new ArrayList<>(); + List teps = elanInfo.getExternalTeps(); + if (teps == null || teps.isEmpty()) { + return listBucketInfo; + } + for (ExternalTeps tep : teps) { + String interfaceName = elanItmUtils.getExternalTunnelInterfaceName(String.valueOf(dpnId), + tep.getTepIp().toString()); + if (interfaceName == null) { + LOG.error("Could not get interface name to ext tunnel {} {}", dpnId, tep.getTepIp()); + continue; + } + List listActionInfo = elanItmUtils.buildTunnelItmEgressActions(interfaceName, + elanInfo.getSegmentationId()); + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, + MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + return listBucketInfo; + } + + private int getNextAvailableBucketId(int bucketSize) { + return bucketSize + 1; + } + + @SuppressWarnings("checkstyle:IllegalCatch") + private List getRemoteBCGroupTunnelBuckets(ElanDpnInterfacesList elanDpns, BigInteger dpnId, int bucketId, + long elanTagOrVni) { + List listBucketInfo = new ArrayList<>(); + if (elanDpns != null) { + for (DpnInterfaces dpnInterface : elanDpns.getDpnInterfaces()) { + if (elanUtils.isDpnPresent(dpnInterface.getDpId()) && !Objects.equals(dpnInterface.getDpId(), dpnId) + && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { + try { + List listActionInfo = elanItmUtils.getInternalTunnelItmEgressAction(dpnId, + dpnInterface.getDpId(), elanTagOrVni); + if (listActionInfo.isEmpty()) { + continue; + } + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, + MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } catch (Exception ex) { + LOG.error("Logical Group Interface not found between source Dpn - {}, destination Dpn - {} ", + dpnId, dpnInterface.getDpId(), ex); + } + } + } + } + return listBucketInfo; + } + /** * Update remote mcast mac. * @@ -338,14 +535,16 @@ public class ElanL2GatewayMulticastUtils { * * @param elanName * the elan instance name + * @param elanInstance + * the ElanInstance * @param l2GatewayDevice * the l2 gateway device * @return the listenable future */ public List> handleMcastForElanL2GwDeviceDelete(String elanName, - L2GatewayDevice l2GatewayDevice) { + ElanInstance elanInstance, L2GatewayDevice l2GatewayDevice) { ListenableFuture updateMcastMacsFuture = updateMcastMacsForAllElanDevices( - elanName, l2GatewayDevice, false/* updateThisDevice */); + elanName, elanInstance, l2GatewayDevice, false/* updateThisDevice */); ListenableFuture deleteRemoteMcastMacFuture = deleteRemoteMcastMac( new NodeId(l2GatewayDevice.getHwvtepNodeId()), elanName); return Arrays.asList(updateMcastMacsFuture, deleteRemoteMcastMacFuture); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java index 140a3cae53..99cc20daad 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/ElanL2GatewayUtils.java @@ -45,7 +45,6 @@ import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils; import org.opendaylight.genius.utils.hwvtep.HwvtepUtils; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.netvirt.elan.ElanException; -import org.opendaylight.netvirt.elan.internal.ElanInstanceManager; import org.opendaylight.netvirt.elan.l2gw.jobs.DeleteL2GwDeviceMacsFromElanJob; import org.opendaylight.netvirt.elan.l2gw.jobs.DeleteLogicalSwitchJob; import org.opendaylight.netvirt.elan.utils.ElanClusterUtils; @@ -113,6 +112,7 @@ public class ElanL2GatewayUtils { private final ElanClusterUtils elanClusterUtils; private final OdlInterfaceRpcService interfaceManagerRpcService; private final JobCoordinator jobCoordinator; + private final ElanUtils elanUtils; private final Timer logicalSwitchDeleteJobTimer = new Timer(); private final ConcurrentMap, TimerTask> logicalSwitchDeletedTasks = new ConcurrentHashMap<>(); @@ -121,13 +121,14 @@ public class ElanL2GatewayUtils { @Inject public ElanL2GatewayUtils(DataBroker broker, ElanDmacUtils elanDmacUtils, ElanItmUtils elanItmUtils, ElanClusterUtils elanClusterUtils, OdlInterfaceRpcService interfaceManagerRpcService, - JobCoordinator jobCoordinator) { + JobCoordinator jobCoordinator, ElanUtils elanUtils) { this.broker = broker; this.elanDmacUtils = elanDmacUtils; this.elanItmUtils = elanItmUtils; this.elanClusterUtils = elanClusterUtils; this.interfaceManagerRpcService = interfaceManagerRpcService; this.jobCoordinator = jobCoordinator; + this.elanUtils = elanUtils; } @PreDestroy @@ -1037,7 +1038,7 @@ public class ElanL2GatewayUtils { public List getElanDpns(String elanName) { Set dpnInterfaces = ElanUtils.getElanInvolvedDPNsFromCache(elanName); if (dpnInterfaces == null) { - return ElanInstanceManager.getElanDPNByName(broker, elanName); + return elanUtils.getElanDPNByName(elanName); } return new ArrayList<>(dpnInterfaces); } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java index 098e04739f..3802f40067 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayConnectionUtils.java @@ -21,6 +21,9 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; import javax.annotation.Nonnull; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.mdsalutil.MDSALUtil; @@ -34,7 +37,6 @@ import org.opendaylight.netvirt.elan.l2gw.listeners.ElanInstanceListener; import org.opendaylight.netvirt.elan.l2gw.listeners.HwvtepLocalUcastMacListener; import org.opendaylight.netvirt.elan.l2gw.listeners.HwvtepLogicalSwitchListener; import org.opendaylight.netvirt.elan.utils.ElanClusterUtils; -import org.opendaylight.netvirt.elan.utils.ElanUtils; import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils; import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice; import org.opendaylight.netvirt.neutronvpn.api.l2gw.utils.L2GatewayCacheUtils; @@ -56,6 +58,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class L2GatewayConnectionUtils implements AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(L2GatewayConnectionUtils.class); @@ -67,18 +70,20 @@ public class L2GatewayConnectionUtils implements AutoCloseable { private final JobCoordinator jobCoordinator; private final List closeables = new CopyOnWriteArrayList<>(); + @Inject public L2GatewayConnectionUtils(DataBroker dataBroker, ElanInstanceManager elanInstanceManager, - ElanClusterUtils elanClusterUtils, ElanUtils elanUtils, ElanL2GatewayUtils elanL2GatewayUtils, - JobCoordinator jobCoordinator) { + ElanClusterUtils elanClusterUtils, ElanL2GatewayUtils elanL2GatewayUtils, + JobCoordinator jobCoordinator, ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils) { this.broker = dataBroker; this.elanInstanceManager = elanInstanceManager; this.elanL2GatewayUtils = elanL2GatewayUtils; this.elanClusterUtils = elanClusterUtils; - this.elanL2GatewayMulticastUtils = elanUtils.getElanL2GatewayMulticastUtils(); + this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.jobCoordinator = jobCoordinator; } @Override + @PreDestroy @SuppressWarnings("checkstyle:IllegalCatch") public void close() { closeables.forEach(c -> { @@ -251,8 +256,8 @@ public class L2GatewayConnectionUtils implements AutoCloseable { } DisAssociateHwvtepFromElanJob disAssociateHwvtepToElanJob = - new DisAssociateHwvtepFromElanJob(broker, elanL2GatewayUtils, elanL2GatewayMulticastUtils, - elanL2GwDevice, elanName, + new DisAssociateHwvtepFromElanJob(elanL2GatewayUtils, elanL2GatewayMulticastUtils, + elanL2GwDevice, elanName, () -> elanInstanceManager.getElanInstanceByName(elanName), l2Device, defaultVlan, hwvtepNodeId, isLastL2GwConnDeleted); elanClusterUtils.runOnlyInOwnerNode(disAssociateHwvtepToElanJob.getJobKey(), "remove l2gw connection job", disAssociateHwvtepToElanJob); @@ -293,8 +298,8 @@ public class L2GatewayConnectionUtils implements AutoCloseable { hwvtepNodeId, elanName); if (logicalSwitch == null) { HwvtepLogicalSwitchListener hwVTEPLogicalSwitchListener = new HwvtepLogicalSwitchListener( - elanL2GatewayUtils, elanClusterUtils, elanL2GatewayMulticastUtils, this, - l2GatewayDevice, elanName, l2Device, defaultVlan, l2GwConnId); + elanInstanceManager, elanL2GatewayUtils, elanClusterUtils, elanL2GatewayMulticastUtils, + this, l2GatewayDevice, elanName, l2Device, defaultVlan, l2GwConnId); hwVTEPLogicalSwitchListener.registerListener(LogicalDatastoreType.OPERATIONAL, broker); closeables.add(hwVTEPLogicalSwitchListener); createLogicalSwitch = true; @@ -303,8 +308,8 @@ public class L2GatewayConnectionUtils implements AutoCloseable { createLogicalSwitch = false; } AssociateHwvtepToElanJob associateHwvtepToElanJob = new AssociateHwvtepToElanJob(broker, - elanL2GatewayUtils, elanL2GatewayMulticastUtils, l2GatewayDevice, elanInstance, - l2Device, defaultVlan, createLogicalSwitch); + elanL2GatewayUtils, elanL2GatewayMulticastUtils, elanInstanceManager, l2GatewayDevice, + elanInstance, l2Device, defaultVlan, createLogicalSwitch); elanClusterUtils.runOnlyInOwnerNode(associateHwvtepToElanJob.getJobKey(), "create logical switch in hwvtep topo", associateHwvtepToElanJob); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayUtils.java index 6fb1c3bd64..be993af6da 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2GatewayUtils.java @@ -9,7 +9,6 @@ package org.opendaylight.netvirt.elan.l2gw.utils; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants; import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; @@ -23,25 +22,6 @@ import org.slf4j.LoggerFactory; public class L2GatewayUtils { private static final Logger LOG = LoggerFactory.getLogger(L2GatewayUtils.class); - private final DataBroker dataBroker; - - private final ItmRpcService itmRpcService; - - private final L2GatewayConnectionUtils l2GatewayConnectionUtils; - - public L2GatewayUtils(DataBroker dataBroker, ItmRpcService itmRpcService, - L2GatewayConnectionUtils l2GatewayConnectionUtils) { - this.dataBroker = dataBroker; - this.itmRpcService = itmRpcService; - this.l2GatewayConnectionUtils = l2GatewayConnectionUtils; - } - - public void init() { - } - - public void close() { - } - public static void deleteItmTunnels(ItmRpcService itmRpcService, String hwvtepId, String psName, IpAddress tunnelIp) { DeleteL2GwDeviceInputBuilder builder = new DeleteL2GwDeviceInputBuilder(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java index 14fe026760..64efcda2d1 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/l2gw/utils/L2gwServiceProvider.java @@ -11,6 +11,8 @@ package org.opendaylight.netvirt.elan.l2gw.utils; import java.util.Collections; import java.util.List; import java.util.Set; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.infrautils.inject.AbstractLifecycle; import org.opendaylight.netvirt.elan.utils.ElanClusterUtils; @@ -27,6 +29,7 @@ import org.slf4j.LoggerFactory; /** * Created by eaksahu on 3/15/2017. */ +@Singleton public class L2gwServiceProvider extends AbstractLifecycle implements IL2gwService { private static final Logger LOG = LoggerFactory.getLogger(L2gwServiceProvider.class); @@ -36,6 +39,7 @@ public class L2gwServiceProvider extends AbstractLifecycle implements IL2gwServi private final L2GatewayConnectionUtils l2GatewayConnectionUtils; private final ElanClusterUtils elanClusterUtils; + @Inject public L2gwServiceProvider(final DataBroker dataBroker, final ElanClusterUtils elanClusterUtils, ItmRpcService itmRpcService, L2GatewayConnectionUtils l2GatewayConnectionUtils) { this.dataBroker = dataBroker; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java index 465e1fdd00..6c6a081a95 100755 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statisitcs/ElanStatisticsImpl.java @@ -9,6 +9,8 @@ package org.opendaylight.netvirt.elan.statisitcs; import com.google.common.util.concurrent.Futures; import java.util.concurrent.Future; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; @@ -26,12 +28,14 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanStatisticsImpl implements ElanStatisticsService { private static final Logger LOG = LoggerFactory.getLogger(ElanStatisticsImpl.class); private final DataBroker dataBroker; private final IInterfaceManager interfaceManager; + @Inject public ElanStatisticsImpl(DataBroker dataBroker, IInterfaceManager interfaceManager) { this.dataBroker = dataBroker; this.interfaceManager = interfaceManager; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statusanddiag/ElanStatusMonitorJMX.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statusanddiag/ElanStatusMonitorJMX.java index 9ff946eb84..f1383e07e8 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statusanddiag/ElanStatusMonitorJMX.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/statusanddiag/ElanStatusMonitorJMX.java @@ -8,14 +8,16 @@ package org.opendaylight.netvirt.elan.statusanddiag; import java.lang.management.ManagementFactory; - +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Singleton; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class ElanStatusMonitorJMX implements ElanStatusMonitor, ElanStatusMonitorMBean { private String serviceStatus; @@ -23,6 +25,7 @@ public class ElanStatusMonitorJMX implements ElanStatusMonitor, ElanStatusMonito private static final Logger LOG = LoggerFactory.getLogger(ElanStatusMonitorJMX.class); private static final MBeanServer MBS = ManagementFactory.getPlatformMBeanServer(); + @PostConstruct public void init() throws Exception { registerMbean(); } @@ -33,6 +36,7 @@ public class ElanStatusMonitorJMX implements ElanStatusMonitor, ElanStatusMonito LOG.info("ElanStatusMonitor MXBean successfully registered {}", JMX_ELAN_OBJ_NAME); } + @PreDestroy public void close() { try { ObjectName objName = new ObjectName(JMX_ELAN_OBJ_NAME); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInstanceListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInstanceListener.java index 6f738fedd3..c51f782f38 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInstanceListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInstanceListener.java @@ -8,6 +8,10 @@ package org.opendaylight.netvirt.elan.utils; import java.util.Collection; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; @@ -21,6 +25,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class CacheElanInstanceListener implements ClusteredDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(CacheElanInstanceListener.class); @@ -29,10 +34,12 @@ public class CacheElanInstanceListener implements ClusteredDataTreeChangeListene private ListenerRegistration registration; + @Inject public CacheElanInstanceListener(DataBroker dataBroker) { this.broker = dataBroker; } + @PostConstruct public void init() { registerListener(); } @@ -48,6 +55,7 @@ public class CacheElanInstanceListener implements ClusteredDataTreeChangeListene return InstanceIdentifier.create(ElanInstances.class).child(ElanInstance.class); } + @PreDestroy public void close() throws Exception { if (registration != null) { registration.close(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java index 4208c6575a..5e1733768f 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/CacheElanInterfaceListener.java @@ -8,6 +8,10 @@ package org.opendaylight.netvirt.elan.utils; import java.util.Collection; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.inject.Inject; +import javax.inject.Singleton; import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; @@ -21,16 +25,19 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class CacheElanInterfaceListener implements ClusteredDataTreeChangeListener { private ListenerRegistration registration; private static final Logger LOG = LoggerFactory.getLogger(CacheElanInterfaceListener.class); private final DataBroker broker; + @Inject public CacheElanInterfaceListener(DataBroker dataBroker) { this.broker = dataBroker; } + @PostConstruct public void init() { registerListener(); } @@ -46,6 +53,7 @@ public class CacheElanInterfaceListener implements ClusteredDataTreeChangeListen return InstanceIdentifier.create(ElanInterfaces.class).child(ElanInterface.class); } + @PreDestroy public void close() throws Exception { if (registration != null) { registration.close(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java index a863610ee0..aeed676c5f 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanForwardingEntriesHandler.java @@ -30,14 +30,11 @@ public class ElanForwardingEntriesHandler { private static final Logger LOG = LoggerFactory.getLogger(ElanForwardingEntriesHandler.class); private final DataBroker broker; - private ElanUtils elanUtils; + private final ElanUtils elanUtils; @Inject - public ElanForwardingEntriesHandler(DataBroker dataBroker) { + public ElanForwardingEntriesHandler(DataBroker dataBroker, ElanUtils elanUtils) { this.broker = dataBroker; - } - - public void setElanUtils(ElanUtils elanUtils) { this.elanUtils = elanUtils; } diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index 75293a846e..40e107ce69 100755 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -66,8 +66,6 @@ import org.opendaylight.genius.mdsalutil.packet.IPv4; import org.opendaylight.infrautils.utils.concurrent.JdkFutures; import org.opendaylight.netvirt.elan.ElanException; import org.opendaylight.netvirt.elan.arp.responder.ArpResponderUtil; -import org.opendaylight.netvirt.elan.internal.ElanInstanceManager; -import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils; import org.opendaylight.netvirt.elanmanager.api.ElanHelper; 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.IpAddressBuilder; @@ -186,10 +184,8 @@ public class ElanUtils { private final DataBroker broker; private final IMdsalApiManager mdsalManager; - private final ElanInstanceManager elanInstanceManager; private final OdlInterfaceRpcService interfaceManagerRpcService; private final ItmRpcService itmRpcService; - private final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils; private final IInterfaceManager interfaceManager; private final ElanConfig elanConfig; private final ElanItmUtils elanItmUtils; @@ -208,29 +204,19 @@ public class ElanUtils { }; @Inject - public ElanUtils(DataBroker dataBroker, IMdsalApiManager mdsalManager, ElanInstanceManager elanInstanceManager, - OdlInterfaceRpcService interfaceManagerRpcService, ItmRpcService itmRpcService, - ElanConfig elanConfig, - IInterfaceManager interfaceManager, - ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils, ElanEtreeUtils elanEtreeUtils, - ElanItmUtils elanItmUtils) { + public ElanUtils(DataBroker dataBroker, IMdsalApiManager mdsalManager, + OdlInterfaceRpcService interfaceManagerRpcService, ItmRpcService itmRpcService, ElanConfig elanConfig, + IInterfaceManager interfaceManager, ElanEtreeUtils elanEtreeUtils, ElanItmUtils elanItmUtils) { this.broker = dataBroker; this.mdsalManager = mdsalManager; - this.elanInstanceManager = elanInstanceManager; this.interfaceManagerRpcService = interfaceManagerRpcService; this.itmRpcService = itmRpcService; this.interfaceManager = interfaceManager; this.elanConfig = elanConfig; - - this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils; this.elanEtreeUtils = elanEtreeUtils; this.elanItmUtils = elanItmUtils; } - public ElanL2GatewayMulticastUtils getElanL2GatewayMulticastUtils() { - return elanL2GatewayMulticastUtils; - } - public final Boolean isOpenstackVniSemanticsEnforced() { return elanConfig.isOpenstackVniSemanticsEnforced() != null ? elanConfig.isOpenstackVniSemanticsEnforced() : false; @@ -895,7 +881,14 @@ public class ElanUtils { @Nonnull public List getInvolvedDpnsInElan(String elanName) { - return elanInstanceManager.getElanDPNByName(elanName); + return getElanDPNByName(elanName); + } + + @Nonnull + public List getElanDPNByName(String elanInstanceName) { + InstanceIdentifier elanIdentifier = getElanDpnOperationDataPath(elanInstanceName); + return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, elanIdentifier).toJavaUtil().map( + ElanDpnInterfacesList::getDpnInterfaces).orElse(Collections.emptyList()); } private void setupLocalDmacFlow(long elanTag, BigInteger dpId, String ifName, String macAddress, diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java index ad9b531fff..95eb0a3617 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/TransportZoneNotificationUtil.java @@ -21,6 +21,8 @@ import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Nonnull; +import javax.inject.Inject; +import javax.inject.Singleton; 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; @@ -62,6 +64,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +@Singleton public class TransportZoneNotificationUtil { private static final Logger LOG = LoggerFactory.getLogger(TransportZoneNotificationUtil.class); private static final String TUNNEL_PORT = "tunnel_port"; @@ -77,6 +80,7 @@ public class TransportZoneNotificationUtil { private final ElanConfig elanConfig; private final ElanBridgeManager elanBridgeManager; + @Inject public TransportZoneNotificationUtil(final DataBroker dbx, final IInterfaceManager interfaceManager, final IElanService elanService, final ElanConfig elanConfig, final ElanBridgeManager elanBridgeManager) { this.dataBroker = dbx; diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml b/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml index 35697454fd..43d931b654 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml @@ -10,15 +10,15 @@ interface="org.opendaylight.controller.md.sal.binding.api.NotificationService" /> - - - - - @@ -44,209 +44,26 @@ - + - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java index c9025bb644..5f98f0afd5 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java @@ -37,6 +37,8 @@ import org.opendaylight.netvirt.elanmanager.tests.utils.VpnManagerTestImpl; import org.opendaylight.netvirt.neutronvpn.NeutronvpnManagerImpl; import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager; import org.opendaylight.netvirt.vpnmanager.api.IVpnManager; +import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils; +import org.opendaylight.ovsdb.utils.southbound.utils.SouthboundUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService; @@ -111,5 +113,9 @@ public class ElanServiceTestModule extends AbstractGuiceJsr250Module { bind(IBgpManager.class).toInstance(ibgpManager); bind(DataImportBootReady.class).toInstance(new DataImportBootReady() {}); bind(IElanService.class).to(ElanServiceProvider.class); + + MdsalUtils mdsalUtils = new MdsalUtils(dataBroker); + bind(MdsalUtils.class).toInstance(mdsalUtils); + bind(SouthboundUtils.class).toInstance(new SouthboundUtils(mdsalUtils)); } } -- 2.36.6