Merge "DHCP Handling for TOR VM"
[vpnservice.git] / dhcpservice / dhcpservice-impl / src / main / java / org / opendaylight / vpnservice / dhcpservice / NodeListener.java
index b7d0f2be5aa45994182b49eec67072a317b41892..11bbb71a04a3efdea40160626defb24404df0bf2 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.vpnservice.dhcpservice;
 
+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.dhcpservice.api.DHCPMConstants;
-import org.opendaylight.vpnservice.mdsalutil.*;
-import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
-import org.opendaylight.vpnservice.mdsalutil.packet.IPProtocols;
+import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
+import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -23,30 +25,27 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
 public class NodeListener extends AbstractDataChangeListener<Node> implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(NodeListener.class);
 
-    private IMdsalApiManager mdsalManager;
     private ListenerRegistration<DataChangeListener> listenerRegistration;
     private final DataBroker broker;
     private DhcpManager dhcpManager;
+    private DhcpExternalTunnelManager dhcpExternalTunnelManager;
 
-    public NodeListener(final DataBroker db, final DhcpManager dhcpMgr) {
+    public NodeListener(final DataBroker db, final DhcpManager dhcpMgr, final DhcpExternalTunnelManager dhcpExternalTunnelManager) {
         super(Node.class);
         broker = db;
         dhcpManager = dhcpMgr;
+        this.dhcpExternalTunnelManager = dhcpExternalTunnelManager;
         registerListener(db);
     }
 
     private void registerListener(final DataBroker db) {
         try {
             listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getWildCardPath(), NodeListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
+            getWildCardPath(), NodeListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
         } catch (final Exception e) {
             LOG.error("NodeListener: DataChange listener registration fail!", e);
             throw new IllegalStateException("NodeListener: registration Listener failed.", e);
@@ -57,10 +56,12 @@ public class NodeListener extends AbstractDataChangeListener<Node> implements Au
         return InstanceIdentifier.create(Nodes.class).child(Node.class);
     }
 
-
     @Override
     protected void remove(InstanceIdentifier<Node> identifier, Node del) {
-
+        NodeId nodeId = del.getId();
+        BigInteger dpnId = MDSALUtil.getDpnIdFromNodeName(nodeId);
+        List<BigInteger> listOfDpns = DhcpServiceUtils.getListOfDpns(broker);
+        dhcpExternalTunnelManager.handleDesignatedDpnDown(dpnId, listOfDpns);
     }
 
     @Override
@@ -72,8 +73,15 @@ public class NodeListener extends AbstractDataChangeListener<Node> implements Au
     protected void add(InstanceIdentifier<Node> identifier, Node add) {
         NodeId nodeId = add.getId();
         String[] node =  nodeId.getValue().split(":");
+        if(node.length < 2) {
+            LOG.warn("Unexpected nodeId {}", nodeId.getValue());
+            return;
+        }
         BigInteger dpId = new BigInteger(node[1]);
         dhcpManager.setupTableMissForDhcpTable(dpId);
+        dhcpExternalTunnelManager.installDhcpDropActionOnDpn(dpId);
+        List<BigInteger> listOfDpns = DhcpServiceUtils.getListOfDpns(broker);
+        dhcpExternalTunnelManager.handleDesignatedDpnDown(DHCPMConstants.INVALID_DPID, listOfDpns);
     }
 
     @Override