NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / dhcpservice / impl / src / main / java / org / opendaylight / netvirt / dhcpservice / DhcpInterfaceEventListener.java
index faf2e8d36a10228698e1603de4ba06b531072e8b..fd3515839b41b1ac24a3336725f16df7fd757e75 100644 (file)
@@ -7,22 +7,22 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import java.math.BigInteger;
 import java.util.List;
-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 javax.annotation.PreDestroy;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceAddJob;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceRemoveJob;
 import org.opendaylight.netvirt.dhcpservice.jobs.DhcpInterfaceUpdateJob;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronConstants;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
@@ -30,11 +30,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.I
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DhcpInterfaceEventListener
-        extends AsyncDataTreeChangeListenerBase<Interface, DhcpInterfaceEventListener> {
+public class DhcpInterfaceEventListener extends AbstractAsyncDataTreeChangeListener<Interface> {
 
     private static final Logger LOG = LoggerFactory.getLogger(DhcpInterfaceEventListener.class);
 
@@ -52,7 +52,9 @@ public class DhcpInterfaceEventListener
                                       IInterfaceManager interfaceManager, IElanService elanService,
                                       DhcpPortCache dhcpPortCache, JobCoordinator jobCoordinator,
                                       ItmRpcService itmRpcService) {
-        super(Interface.class, DhcpInterfaceEventListener.class);
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
+                .child(Interface.class),
+                Executors.newListeningSingleThreadExecutor("DhcpInterfaceEventListener", LOG));
         this.dhcpManager = dhcpManager;
         this.dataBroker = dataBroker;
         this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
@@ -61,17 +63,18 @@ public class DhcpInterfaceEventListener
         this.dhcpPortCache = dhcpPortCache;
         this.jobCoordinator = jobCoordinator;
         this.itmRpcService = itmRpcService;
-        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
+    @PreDestroy
     public void close() {
         super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
         LOG.info("DhcpInterfaceEventListener Closed");
     }
 
     @Override
-    protected void remove(InstanceIdentifier<Interface> identifier, Interface del) {
+    public void remove(InstanceIdentifier<Interface> identifier, Interface del) {
         if (!L2vlan.class.equals(del.getType()) && !Tunnel.class.equals(del.getType())) {
             return;
         }
@@ -85,7 +88,8 @@ public class DhcpInterfaceEventListener
             return;
         }
         NodeConnectorId nodeConnectorId = new NodeConnectorId(ofportIds.get(0));
-        BigInteger dpnId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(nodeConnectorId));
+        Uint64 dpnId = DhcpServiceUtils.getDpnIdFromNodeConnectorId(nodeConnectorId);
+
         DhcpInterfaceRemoveJob job = new DhcpInterfaceRemoveJob(dhcpManager, dhcpExternalTunnelManager,
                 dataBroker, del, dpnId, interfaceManager, elanService, port);
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(interfaceName), job, DhcpMConstants.RETRY_COUNT);
@@ -93,36 +97,34 @@ public class DhcpInterfaceEventListener
     }
 
     @Override
-    protected void update(InstanceIdentifier<Interface> identifier,
+    public void update(InstanceIdentifier<Interface> identifier,
             Interface original, Interface update) {
         // We're only interested in Vlan and Tunnel ports
         if (!L2vlan.class.equals(update.getType()) && !Tunnel.class.equals(update.getType())) {
             return;
         }
         if ((original.getOperStatus().getIntValue() ^ update.getOperStatus().getIntValue()) == 0) {
-            LOG.trace("Interface operstatus {} is same", update.getOperStatus());
-            return;
-        }
-
-        if (original.getOperStatus().equals(OperStatus.Unknown) || update.getOperStatus().equals(OperStatus.Unknown)) {
-            LOG.trace("New/old interface state is unknown not handling");
+            LOG.trace("Interface operstatus is same orig {} updated {}", original, update);
             return;
         }
-
         List<String> ofportIds = update.getLowerLayerIf();
         if (ofportIds == null || ofportIds.isEmpty()) {
             return;
         }
         NodeConnectorId nodeConnectorId = new NodeConnectorId(ofportIds.get(0));
-        BigInteger dpnId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(nodeConnectorId));
+        Uint64 dpnId = DhcpServiceUtils.getDpnIdFromNodeConnectorId(nodeConnectorId);
         String interfaceName = update.getName();
+        OperStatus updatedOperStatus = update.getOperStatus();
+        if (original.getOperStatus().equals(OperStatus.Up) && updatedOperStatus.equals(OperStatus.Unknown)) {
+            updatedOperStatus = OperStatus.Down;
+        }
         DhcpInterfaceUpdateJob job = new DhcpInterfaceUpdateJob(dhcpExternalTunnelManager, dataBroker,
-                interfaceName, dpnId, update.getOperStatus(), interfaceManager);
+                interfaceName, dpnId, updatedOperStatus, interfaceManager);
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(interfaceName), job, DhcpMConstants.RETRY_COUNT);
     }
 
     @Override
-    protected void add(InstanceIdentifier<Interface> identifier, Interface add) {
+    public void add(InstanceIdentifier<Interface> identifier, Interface add) {
         // We're only interested in Vlan and Tunnel ports
         if (!L2vlan.class.equals(add.getType()) && !Tunnel.class.equals(add.getType())) {
             return;
@@ -133,25 +135,17 @@ public class DhcpInterfaceEventListener
         if (ofportIds == null || ofportIds.isEmpty()) {
             return;
         }
-        Port port = dhcpManager.getNeutronPort(interfaceName);
-        if (NeutronConstants.IS_DHCP_PORT.test(port)) {
-            return;
+        if (!Tunnel.class.equals(add.getType())) {
+            Port port = dhcpManager.getNeutronPort(interfaceName);
+            if (NeutronConstants.IS_DHCP_PORT.test(port)) {
+                return;
+            }
+            dhcpPortCache.put(interfaceName, port);
         }
-        dhcpPortCache.put(interfaceName, port);
         NodeConnectorId nodeConnectorId = new NodeConnectorId(ofportIds.get(0));
-        BigInteger dpnId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(nodeConnectorId));
+        Uint64 dpnId = DhcpServiceUtils.getDpnIdFromNodeConnectorId(nodeConnectorId);
         DhcpInterfaceAddJob job = new DhcpInterfaceAddJob(dhcpManager, dhcpExternalTunnelManager, dataBroker,
                 add, dpnId, interfaceManager, elanService, itmRpcService);
         jobCoordinator.enqueueJob(DhcpServiceUtils.getJobKey(interfaceName), job, DhcpMConstants.RETRY_COUNT);
     }
-
-    @Override
-    protected InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
-    }
-
-    @Override
-    protected DhcpInterfaceEventListener getDataTreeChangeListener() {
-        return DhcpInterfaceEventListener.this;
-    }
 }