Updated L2Gw changes in "neutronvpn", "elanmanager" and "dhcpservice" modules
[vpnservice.git] / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / vpnservice / elan / internal / ElanInterfaceStateChangeListener.java
index d056d1ae05fc2b2c47b3f0978ae11395a56f6180..f74e4b886a808385e4d9f5f84e26f6b2fa2d9325 100644 (file)
@@ -8,13 +8,16 @@
 package org.opendaylight.vpnservice.elan.internal;
 
 
-import com.google.common.base.Optional;
+import java.math.BigInteger;
+import java.util.List;
+
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.vpnservice.elan.utils.ElanConstants;
 import org.opendaylight.vpnservice.elan.utils.ElanUtils;
-import org.opendaylight.vpnservice.interfacemgr.IfmUtil;
 import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo;
 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
 import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
@@ -25,13 +28,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.instances.ElanInstance;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.interfaces.ElanInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.TunnelList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.tunnel.list.InternalTunnel;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-
 public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener<Interface> implements AutoCloseable {
     private DataBroker broker;
     private IInterfaceManager interfaceManager;
@@ -64,19 +67,6 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener
         this.interfaceManager = interfaceManager;
     }
 
-    private void handleVlanInterfaceOperationalStateChange(String interfaceName, boolean isStateUp) {
-        //fetching the elanInstanceName from elan-interface config data-store
-        ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
-        if (elanInterface == null) {
-            return;
-        }
-        ElanInstance elanInfo = ElanUtils.getElanInstanceByName(elanInterface.getElanInstanceName());
-        InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName);
-
-        logger.trace("ElanService Interface Operational state has changes for Interface:{}", interfaceName);
-        elanInterfaceManager.handleInterfaceUpated(interfaceInfo, elanInfo , isStateUp);
-    }
-
     @Override
     protected void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
         logger.trace("Received interface {} Down event", delIf);
@@ -87,31 +77,33 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener
             return;
         }
         NodeConnectorId nodeConnectorId = new NodeConnectorId(delIf.getLowerLayerIf().get(0));
-        BigInteger dpId = MDSALUtil.getDpnIdFromNodeName(nodeConnectorId.getValue());
+        BigInteger dpId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(nodeConnectorId));
         InterfaceInfo interfaceInfo = new InterfaceInfo(dpId, nodeConnectorId.getValue());
         interfaceInfo.setInterfaceName(interfaceName);
+        interfaceInfo.setInterfaceType(InterfaceInfo.InterfaceType.VLAN_INTERFACE);
         interfaceInfo.setInterfaceTag(delIf.getIfIndex());
-        elanInterfaceManager.removeElanService(elanInterface, interfaceInfo);
+        String elanInstanceName = elanInterface.getElanInstanceName();
+        ElanInstance elanInstance = ElanUtils.getElanInstanceByName(elanInstanceName);
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+        ElanInterfaceRemoveWorker removeWorker = new ElanInterfaceRemoveWorker(elanInstanceName, elanInstance, 
+                interfaceName, interfaceInfo, elanInterfaceManager);
+        coordinator.enqueueJob(elanInstanceName, removeWorker, ElanConstants.JOB_MAX_RETRIES);
     }
 
     @Override
     protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
         logger.trace("Operation Interface update event - Old: {}, New: {}", original, update);
         String interfaceName = update.getName();
-        ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
-        if(elanInterface == null) {
-            logger.debug("No Elan Interface is created for the interface:{} ", interfaceName);
+        if (update.getType() == null) {
+            logger.trace("Interface type for interface {} is null", interfaceName);
             return;
         }
-        Optional<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface>
-        intf = ElanUtils.read(broker, LogicalDatastoreType.CONFIGURATION, IfmUtil.buildId(interfaceName));
-        if (intf != null && intf.get().getType().equals(Tunnel.class)) {
-            if(update.getOperStatus().equals(Interface.OperStatus.Up) && update.getAdminStatus() == Interface.AdminStatus.Up) {
-                logger.trace("Operation Status for Interface:{}  event state UP ", interfaceName);
-                handleVlanInterfaceOperationalStateChange(interfaceName, true);
-            } else if(update.getOperStatus().equals(Interface.OperStatus.Down)) {
-                logger.trace("Operation Status for Interface:{}  event state DOWN ", interfaceName);
-                handleVlanInterfaceOperationalStateChange(interfaceName, false);
+        if(update.getType().equals(Tunnel.class)) {
+            if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
+                InternalTunnel internalTunnel = getTunnelState(interfaceName);
+                if (internalTunnel != null) {
+                    elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(), internalTunnel.getDestinationDPN());
+                }
             }
         }
     }
@@ -122,7 +114,15 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener
         String interfaceName =  intrf.getName();
         ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
         if(elanInterface == null) {
-            logger.debug("No Elan Interface is created for the interface:{} ", interfaceName);
+            if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
+                if(intrf.getOperStatus().equals(Interface.OperStatus.Up)) {
+                    InternalTunnel internalTunnel = getTunnelState(interfaceName);
+                    if (internalTunnel != null) {
+                        elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(),
+                                internalTunnel.getDestinationDPN());
+                    }
+                }
+            }
             return;
         }
         InstanceIdentifier<ElanInterface> elanInterfaceId = ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName);
@@ -133,4 +133,19 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener
     public void close() throws Exception {
 
     }
+
+    public  InternalTunnel getTunnelState(String interfaceName) {
+        InternalTunnel internalTunnel = null;
+        TunnelList tunnelList = ElanUtils.buildInternalTunnel(broker);
+        if (tunnelList != null && tunnelList.getInternalTunnel() != null) {
+            List<InternalTunnel> internalTunnels = tunnelList.getInternalTunnel();
+            for (InternalTunnel tunnel : internalTunnels) {
+                if (tunnel.getTunnelInterfaceName().equalsIgnoreCase(interfaceName)) {
+                    internalTunnel = tunnel;
+                    break;
+                }
+            }
+        }
+        return internalTunnel;
+    }
 }