de-static-ify ElanUtils field in ElanServiceProvider
[netvirt.git] / vpnservice / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / netvirt / elan / internal / ElanServiceProvider.java
index c181a26d1a32ac2641e7d335600167cb712fbfe9..0c1e70be9dccdd9f5df859b88d18d1c822c5c461 100644 (file)
@@ -28,6 +28,8 @@ import org.opendaylight.genius.interfacemanager.exceptions.InterfaceAlreadyExist
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.genius.utils.clustering.EntityOwnerUtils;
 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
 import org.opendaylight.netvirt.elan.statusanddiag.ElanStatusMonitor;
@@ -76,9 +78,10 @@ public class ElanServiceProvider implements IElanService {
     private final ElanBridgeManager bridgeMgr;
     private final DataBroker broker;
     private final ElanStatusMonitor elanStatusMonitor;
-    private static ElanUtils elanUtils;
+    private final ElanUtils elanUtils;
 
     private boolean generateIntBridgeMac = true;
+    private boolean isL2BeforeL3;
 
     public ElanServiceProvider(IdManagerService idManager, IInterfaceManager interfaceManager,
                                ElanInstanceManager elanInstanceManager, ElanBridgeManager bridgeMgr,
@@ -107,6 +110,7 @@ public class ElanServiceProvider implements IElanService {
     public void init() throws Exception {
         LOG.info("Starting ElnaServiceProvider");
         elanStatusMonitor.reportStatus("STARTING");
+        setIsL2BeforeL3();
         try {
             createIdPool();
             elanStatusMonitor.reportStatus("OPERATIONAL");
@@ -421,15 +425,10 @@ public class ElanServiceProvider implements IElanService {
 
     @Override
     public List<ElanInstance> getElanInstances() {
-        List<ElanInstance> elanList = new ArrayList<>();
         InstanceIdentifier<ElanInstances> elanInstancesIdentifier = InstanceIdentifier.builder(ElanInstances.class)
                 .build();
-        Optional<ElanInstances> elansOptional = elanUtils.read(broker, LogicalDatastoreType.CONFIGURATION,
-                elanInstancesIdentifier);
-        if (elansOptional.isPresent()) {
-            elanList.addAll(elansOptional.get().getElanInstance());
-        }
-        return elanList;
+        return elanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, elanInstancesIdentifier).transform(
+                ElanInstances::getElanInstance).or(Collections.emptyList());
     }
 
     @Override
@@ -477,7 +476,7 @@ public class ElanServiceProvider implements IElanService {
 
     private void createExternalElanNetwork(ElanInstance elanInstance, String interfaceName) {
         if (interfaceName == null) {
-            LOG.trace("No physial interface is attached to {}", elanInstance.getPhysicalNetworkName());
+            LOG.trace("No physical interface is attached to {}", elanInstance.getPhysicalNetworkName());
             return;
         }
 
@@ -550,7 +549,7 @@ public class ElanServiceProvider implements IElanService {
                 if (hasPortNameUpdated(origPortName, updatedPortName)
                         || hasDatapathIdAdded(hasDatapathIdOnOrigNode, hasDatapathIdOnUpdatedNode)) {
                     createExternalElanNetwork(elanInstance,
-                            bridgeMgr.getProviderInterfaceName(updatedNode, updatedPortName));
+                            bridgeMgr.getProviderInterfaceName(updatedNode, physicalNetworkName));
                 }
             }
         }
@@ -569,9 +568,7 @@ public class ElanServiceProvider implements IElanService {
     }
 
     private Map<String, String> getMapFromOtherConfig(Node node, String otherConfigColumn) {
-        Optional<Map<String, String>> providerMapOpt = bridgeMgr.getOpenvswitchOtherConfigMap(node,
-                otherConfigColumn);
-        return providerMapOpt.or(Collections.emptyMap());
+        return bridgeMgr.getOpenvswitchOtherConfigMap(node, otherConfigColumn);
     }
 
     @Override
@@ -584,7 +581,7 @@ public class ElanServiceProvider implements IElanService {
 
         Set<String> externalElanInterfaces = new HashSet<>();
         for (String elanInterface : elanInterfaces) {
-            if (elanUtils.isExternal(elanInterface)) {
+            if (interfaceManager.isExternalInterface(elanInterface)) {
                 externalElanInterfaces.add(elanInterface);
             }
         }
@@ -592,13 +589,14 @@ public class ElanServiceProvider implements IElanService {
         return externalElanInterfaces;
     }
 
+    @Override
     public String getExternalElanInterface(String elanInstanceName, BigInteger dpnId) {
         return elanUtils.getExternalElanInterface(elanInstanceName, dpnId);
     }
 
     @Override
     public boolean isExternalInterface(String interfaceName) {
-        return elanUtils.isExternal(interfaceName);
+        return interfaceManager.isExternalInterface(interfaceName);
     }
 
     @Override
@@ -608,6 +606,10 @@ public class ElanServiceProvider implements IElanService {
 
     @Override
     public void handleKnownL3DmacAddress(String macAddress, String elanInstanceName, int addOrRemove) {
+        if (!isL2BeforeL3) {
+            LOG.trace("ELAN service is after L3VPN in the Netvirt pipeline skip known L3DMAC flows installation");
+            return;
+        }
         ElanInstance elanInstance = ElanUtils.getElanInstanceByName(broker, elanInstanceName);
         if (elanInstance == null) {
             LOG.warn("Null elan instance {}", elanInstanceName);
@@ -653,7 +655,7 @@ public class ElanServiceProvider implements IElanService {
                 interfaceName = parentRef + IfmConstants.OF_URI_SEPARATOR + segmentationId;
                 String trunkName = parentRef + IfmConstants.OF_URI_SEPARATOR + "trunk";
                 // trunk interface may have been created by other vlan network
-                Interface trunkInterface = ElanUtils.getInterfaceFromConfigDS(trunkName, broker);
+                Interface trunkInterface = interfaceManager.getInterfaceInfoFromConfigDataStore(trunkName);
                 if (trunkInterface == null) {
                     interfaceManager.createVLANInterface(trunkName, parentRef, null, null, null,
                             IfL2vlan.L2vlanMode.Trunk, true);
@@ -717,4 +719,17 @@ public class ElanServiceProvider implements IElanService {
         }
     }
 
+    private void setIsL2BeforeL3() {
+        short elanServiceRealIndex = ServiceIndex.getIndex(NwConstants.ELAN_SERVICE_NAME,
+                NwConstants.ELAN_SERVICE_INDEX);
+        short l3vpnServiceRealIndex = ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME,
+                NwConstants.L3VPN_SERVICE_INDEX);
+        if (elanServiceRealIndex < l3vpnServiceRealIndex) {
+            LOG.info("ELAN service is set before L3VPN service in the Netvirt pipeline");
+            isL2BeforeL3 = true;
+        } else {
+            LOG.info("ELAN service is set after L3VPN service in the Netvirt pipeline");
+            isL2BeforeL3 = false;
+        }
+    }
 }