Optional clean-up
[netvirt.git] / vpnservice / dhcpservice / dhcpservice-impl / src / main / java / org / opendaylight / netvirt / dhcpservice / DhcpUCastMacListener.java
index d67649eb57e8b588fde24aa9c0851a5e6be0e6bf..af599cdcea9f17c22e2f80797d2851d8c3a956db 100644 (file)
@@ -7,23 +7,20 @@
  */
 package org.opendaylight.netvirt.dhcpservice;
 
-import java.math.BigInteger;
-
 import com.google.common.base.Optional;
+import java.math.BigInteger;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
-import org.opendaylight.controller.md.sal.binding.api.ClusteredDataChangeListener;
 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.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.netvirt.dhcpservice.api.DHCPMConstants;
+import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.netvirt.dhcpservice.api.DhcpMConstants;
 import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
-import org.opendaylight.genius.datastoreutils.AsyncClusteredDataChangeListenerBase;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
@@ -31,29 +28,32 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
+public class DhcpUCastMacListener
+        extends AsyncClusteredDataTreeChangeListenerBase<LocalUcastMacs, DhcpUCastMacListener>
+        implements AutoCloseable {
 
-public class DhcpUCastMacListener extends AsyncClusteredDataChangeListenerBase<LocalUcastMacs, DhcpUCastMacListener> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(DhcpUCastMacListener.class);
 
-    private static final Logger logger = LoggerFactory.getLogger(DhcpUCastMacListener.class);
-    private DataBroker broker;
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private DhcpExternalTunnelManager dhcpExternalTunnelManager;
-    private DhcpManager dhcpManager;
+    private final DhcpExternalTunnelManager dhcpExternalTunnelManager;
+    private final DhcpManager dhcpManager;
+    private final DataBroker broker;
 
-    public DhcpUCastMacListener(DhcpManager dhcpManager,DhcpExternalTunnelManager dhcpExtTunnelMgr, DataBroker dataBroker) {
+    public DhcpUCastMacListener(DhcpManager dhcpManager,DhcpExternalTunnelManager dhcpExtTunnelMgr,
+                                DataBroker dataBroker) {
         super(LocalUcastMacs.class, DhcpUCastMacListener.class);
         this.broker = dataBroker;
         this.dhcpExternalTunnelManager = dhcpExtTunnelMgr;
         this.dhcpManager = dhcpManager;
     }
 
+    public void init() {
+        registerListener(LogicalDatastoreType.OPERATIONAL, broker);
+    }
+
     @Override
     protected InstanceIdentifier<LocalUcastMacs> getWildCardPath() {
         return InstanceIdentifier.create(NetworkTopology.class).child(Topology.class).child(Node.class)
@@ -62,15 +62,8 @@ public class DhcpUCastMacListener extends AsyncClusteredDataChangeListenerBase<L
 
     @Override
     public void close() throws Exception {
-        if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                logger.error("Error when cleaning up DataChangeListener.", e);
-            }
-            listenerRegistration = null;
-        }
-        logger.info("DhcpUCastMacListener Closed");
+        super.close();
+        LOG.info("DhcpUCastMacListener Closed");
     }
 
     @Override
@@ -81,13 +74,13 @@ public class DhcpUCastMacListener extends AsyncClusteredDataChangeListenerBase<L
         NodeId torNodeId = identifier.firstKeyOf(Node.class).getNodeId();
         LogicalSwitches logicalSwitch = getLogicalSwitches(del);
         if (null == logicalSwitch) {
-            logger.error("DhcpUCastMacListener remove :Logical Switch ref doesn't have data {}", logicalSwitch);
+            LOG.error("DhcpUCastMacListener remove :Logical Switch ref doesn't have data {}", logicalSwitch);
             return;
         }
         String elanInstanceName = logicalSwitch.getHwvtepNodeName().getValue();
         L2GatewayDevice device = ElanL2GwCacheUtils.getL2GatewayDeviceFromCache(elanInstanceName, torNodeId.getValue());
         if (device == null) {
-            logger.error("Logical Switch Device with name {} is not present in L2GWCONN cache", elanInstanceName);
+            LOG.error("Logical Switch Device with name {} is not present in L2GWCONN cache", elanInstanceName);
             return;
         }
         IpAddress tunnelIp = device.getTunnelIp();
@@ -106,10 +99,12 @@ public class DhcpUCastMacListener extends AsyncClusteredDataChangeListenerBase<L
     protected void add(InstanceIdentifier<LocalUcastMacs> identifier,
             LocalUcastMacs add) {
         NodeId torNodeId = identifier.firstKeyOf(Node.class).getNodeId();
-        InstanceIdentifier<LogicalSwitches> logicalSwitchRef = (InstanceIdentifier<LogicalSwitches>) add.getLogicalSwitchRef().getValue();
-        Optional<LogicalSwitches> logicalSwitchOptional = MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef);
+        InstanceIdentifier<LogicalSwitches> logicalSwitchRef =
+                (InstanceIdentifier<LogicalSwitches>) add.getLogicalSwitchRef().getValue();
+        Optional<LogicalSwitches> logicalSwitchOptional =
+                MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef);
         if ( !logicalSwitchOptional.isPresent() ) {
-            logger.error("Logical Switch ref doesn't have data {}", logicalSwitchRef);
+            LOG.error("Logical Switch ref doesn't have data {}", logicalSwitchRef);
             return;
         }
         LogicalSwitches logicalSwitch = logicalSwitchOptional.get();
@@ -118,49 +113,42 @@ public class DhcpUCastMacListener extends AsyncClusteredDataChangeListenerBase<L
         BigInteger vni = new BigInteger(logicalSwitch.getTunnelKey());
         Port port = dhcpExternalTunnelManager.readVniMacToPortCache(vni, macAddress);
         if (port == null) {
-            logger.trace("No neutron port created for macAddress {}, tunnelKey {}", macAddress, vni);
+            LOG.trace("No neutron port created for macAddress {}, tunnelKey {}", macAddress, vni);
             return;
         }
         L2GatewayDevice device = ElanL2GwCacheUtils.getL2GatewayDeviceFromCache(elanInstanceName, torNodeId.getValue());
         if (device == null) {
-            logger.error("Logical Switch Device with name {} is not present in L2GWCONN cache", elanInstanceName);
+            LOG.error("Logical Switch Device with name {} is not present in L2GWCONN cache", elanInstanceName);
             return;
         }
         IpAddress tunnelIp = device.getTunnelIp();
         Subnet subnet = dhcpManager.getNeutronSubnet(port);
         if (null != subnet && !subnet.isEnableDhcp()) {
             dhcpExternalTunnelManager.updateExistingVMTunnelIPCache(tunnelIp, elanInstanceName, macAddress);
-            logger.warn("DhcpUCastMacListener add: flag for the subnetId "+subnet.getUuid()+ " is False so Table 18 " +
-                    "entries are not added" );
+            LOG.warn("DhcpUCastMacListener add: flag for the subnetId {} is False so Table 18 entries are not added",
+                     subnet.getUuid());
             return;
         }
-        BigInteger designatedDpnId = dhcpExternalTunnelManager.readDesignatedSwitchesForExternalTunnel(tunnelIp, elanInstanceName);
-        if (designatedDpnId == null || designatedDpnId.equals(DHCPMConstants.INVALID_DPID)) {
-            logger.trace("Unable to install flows for macAddress {}. TunnelIp {}, elanInstanceName {}, designatedDpn {} ", macAddress, tunnelIp, elanInstanceName, designatedDpnId);
+        BigInteger designatedDpnId =
+                dhcpExternalTunnelManager.readDesignatedSwitchesForExternalTunnel(tunnelIp, elanInstanceName);
+        if (designatedDpnId == null || designatedDpnId.equals(DhcpMConstants.INVALID_DPID)) {
+            LOG.trace("Unable to install flows for macAddress {}. TunnelIp {}, elanInstanceName {}, designatedDpn {} ",
+                    macAddress, tunnelIp, elanInstanceName, designatedDpnId);
+            dhcpExternalTunnelManager.updateLocalCache(tunnelIp, elanInstanceName, macAddress);
             return;
         }
-        dhcpExternalTunnelManager.installDhcpFlowsForVms(tunnelIp, elanInstanceName, DhcpServiceUtils.getListOfDpns(broker), designatedDpnId, macAddress);
+        dhcpExternalTunnelManager.installDhcpFlowsForVms(tunnelIp, elanInstanceName,
+                DhcpServiceUtils.getListOfDpns(broker), designatedDpnId, macAddress);
     }
 
-    @Override
-    protected ClusteredDataChangeListener getDataChangeListener() {
-        return DhcpUCastMacListener.this;
+    private LogicalSwitches getLogicalSwitches(LocalUcastMacs ucastMacs) {
+        InstanceIdentifier<LogicalSwitches> logicalSwitchRef =
+                (InstanceIdentifier<LogicalSwitches>)ucastMacs.getLogicalSwitchRef().getValue();
+        return MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL, logicalSwitchRef).orNull();
     }
 
     @Override
-    protected DataChangeScope getDataChangeScope() {
-        return DataChangeScope.SUBTREE;
-    }
-
-    private LogicalSwitches getLogicalSwitches(LocalUcastMacs ucastMacs) {
-        LogicalSwitches logicalSwitch = null;
-        InstanceIdentifier<LogicalSwitches> logicalSwitchRef = (InstanceIdentifier<LogicalSwitches>)
-                                                                ucastMacs.getLogicalSwitchRef().getValue();
-        Optional<LogicalSwitches> logicalSwitchOptional = MDSALUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                logicalSwitchRef);
-        if (logicalSwitchOptional.isPresent()) {
-            logicalSwitch = logicalSwitchOptional.get();
-        }
-        return logicalSwitch;
+    protected DhcpUCastMacListener getDataTreeChangeListener() {
+        return DhcpUCastMacListener.this;
     }
-}
+}
\ No newline at end of file