itm and mdsal porting
[vpnservice.git] / itm / itm-impl / src / main / java / org / opendaylight / vpnservice / itm / listeners / TransportZoneListener.java
index f15bd19b0fa0e3126a362635407a68f909aefd2a..fae12dc6454223ca69eaa989c086c9446ceb6c9e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015, 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -9,10 +9,7 @@
 package org.opendaylight.vpnservice.itm.listeners;
 
 import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
 import com.google.common.base.Optional;
@@ -22,6 +19,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.vpnservice.itm.confighelpers.HwVtep;
 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.rev100924.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService;
@@ -32,6 +30,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.Tr
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.TransportZonesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.TransportZone;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.subnets.DeviceVteps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.subnets.Vteps;
 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
@@ -107,34 +106,99 @@ public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<Trans
     protected void remove(InstanceIdentifier<TransportZone> key, TransportZone tzOld) {
         LOG.debug("Received Transport Zone Remove Event: {}, {}", key, tzOld);
         List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzOld);
+        List<HwVtep> hwVtepList = createhWVteps(tzOld);
         LOG.trace("Delete: Invoking deleteTunnels in ItmManager with DpnList {}", opDpnList);
-        if(opDpnList.size()>0) {
+        if(opDpnList.size()>0 || hwVtepList.size()>0) {
             LOG.trace("Delete: Invoking ItmManager");
-           // itmManager.deleteTunnels(opDpnList);
+            LOG.trace("Add: Invoking ItmManager with hwVtep List {} " , hwVtepList);
+            // itmManager.deleteTunnels(opDpnList);
             DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-            ItmTepRemoveWorker removeWorker = new ItmTepRemoveWorker(opDpnList, dataBroker, idManagerService, mdsalManager);
+            ItmTepRemoveWorker removeWorker = new ItmTepRemoveWorker(opDpnList,hwVtepList, dataBroker, idManagerService, mdsalManager);
             coordinator.enqueueJob(tzOld.getZoneName(), removeWorker);
         }
     }
 
     @Override
     protected void update(InstanceIdentifier<TransportZone> key, TransportZone tzOld, TransportZone tzNew) {
-        LOG.debug("Received Transport Zone Update Event: {}, {}, {}", key, tzOld, tzNew);
-        if( !(tzOld.equals(tzNew))) {
-           add(key, tzNew);
+        LOG.debug("Received Transport Zone Update Event: Key - {}, Old - {}, Updated - {}", key, tzOld, tzNew);
+        //if( !(tzOld.equals(tzNew))) {
+        //add(key, tzNew);
+        List<DPNTEPsInfo> oldDpnTepsList = new ArrayList<DPNTEPsInfo>();
+        oldDpnTepsList = createDPNTepInfo(tzOld);
+        List<DPNTEPsInfo> newDpnTepsList = new ArrayList<DPNTEPsInfo>();
+        newDpnTepsList = createDPNTepInfo(tzNew);
+        List<DPNTEPsInfo> oldDpnTepsListcopy = new ArrayList<DPNTEPsInfo>();
+        oldDpnTepsListcopy.addAll(oldDpnTepsList);
+        LOG.trace("oldcopy0" + oldDpnTepsListcopy);
+        List<DPNTEPsInfo> newDpnTepsListcopy = new ArrayList<DPNTEPsInfo>();
+        newDpnTepsListcopy.addAll(newDpnTepsList);
+        LOG.trace("newcopy0" + newDpnTepsListcopy);
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+
+        oldDpnTepsList.removeAll(newDpnTepsListcopy);
+        newDpnTepsList.removeAll(oldDpnTepsListcopy);
+
+        LOG.trace("oldDpnTepsList" + oldDpnTepsList);
+        LOG.trace("newDpnTepsList" + newDpnTepsList);
+        LOG.trace("oldcopy"+oldDpnTepsListcopy);
+        LOG.trace("newcopy"+newDpnTepsListcopy);
+        LOG.trace("oldcopy Size "+oldDpnTepsList.size());
+        LOG.trace("newcopy Size "+newDpnTepsList.size());
+        if(newDpnTepsList.size() > 0) {
+            LOG.trace( "Adding TEPs " );
+            ItmTepAddWorker addWorker = new ItmTepAddWorker(newDpnTepsList, Collections.<HwVtep>emptyList(), dataBroker, idManagerService, mdsalManager);
+            coordinator.enqueueJob(tzNew.getZoneName(), addWorker);
+        }
+        if(oldDpnTepsList.size() > 0) {
+            LOG.trace( "Removing TEPs " );
+            ItmTepRemoveWorker removeWorker =
+                            new ItmTepRemoveWorker(oldDpnTepsList, Collections.<HwVtep>emptyList(), dataBroker, idManagerService, mdsalManager);
+            coordinator.enqueueJob(tzNew.getZoneName(), removeWorker);
+        }
+        List<HwVtep> oldHwList = new ArrayList<HwVtep>();
+        oldHwList = createhWVteps(tzOld);
+        List<HwVtep> newHwList = new ArrayList<HwVtep>();
+        newHwList =  createhWVteps(tzNew);
+        List<HwVtep> oldHwListcopy = new ArrayList<HwVtep>();
+        oldHwListcopy.addAll(oldHwList);
+        LOG.trace("oldHwListcopy0" + oldHwListcopy);
+        List<HwVtep> newHwListcopy = new ArrayList<HwVtep>();
+        newHwListcopy.addAll(newHwList);
+        LOG.trace("newHwListcopy0" + newHwListcopy);
+
+        oldHwList.removeAll(newHwListcopy);
+        newHwList.removeAll(oldHwListcopy);
+        LOG.trace("oldHwList" + oldHwList);
+        LOG.trace("newHwList" + newHwList);
+        LOG.trace("oldHwListcopy" + oldHwListcopy);
+        LOG.trace("newHwListcopy" + newHwListcopy);
+        if(newHwList.size() > 0) {
+            LOG.trace( "Adding HW TEPs " );
+            ItmTepAddWorker addWorker = new ItmTepAddWorker(Collections.<DPNTEPsInfo>emptyList(), newHwList, dataBroker, idManagerService, mdsalManager);
+            coordinator.enqueueJob(tzNew.getZoneName(), addWorker);
         }
+        if(oldHwList.size() > 0) {
+             LOG.trace( "Removing HW TEPs " );
+            ItmTepRemoveWorker removeWorker =
+                            new ItmTepRemoveWorker(Collections.<DPNTEPsInfo>emptyList(), oldHwList, dataBroker,
+                                            idManagerService, mdsalManager);
+            coordinator.enqueueJob(tzNew.getZoneName(), removeWorker);
+        }
+
     }
 
     @Override
     protected void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
         LOG.debug("Received Transport Zone Add Event: {}, {}", key, tzNew);
         List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzNew);
+        List<HwVtep> hwVtepList = createhWVteps(tzNew);
         LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
-        if(opDpnList.size()>0) {
-          LOG.trace("Add: Invoking ItmManager with DPN List {} " , opDpnList);
+        if(opDpnList.size()>0 || hwVtepList.size()>0) {
+            LOG.trace("Add: Invoking ItmManager with DPN List {} " , opDpnList);
+            LOG.trace("Add: Invoking ItmManager with hwVtep List {} " , hwVtepList);
           //itmManager.build_all_tunnels(opDpnList);
           DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-          ItmTepAddWorker addWorker = new ItmTepAddWorker(opDpnList,dataBroker, idManagerService, mdsalManager);
+            ItmTepAddWorker addWorker = new ItmTepAddWorker(opDpnList, hwVtepList, dataBroker, idManagerService, mdsalManager);
           coordinator.enqueueJob(tzNew.getZoneName(), addWorker);
       }
     }
@@ -186,4 +250,45 @@ public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<Trans
         }
         return dpnTepInfo;
     }
-}
\ No newline at end of file
+    private List<HwVtep> createhWVteps(TransportZone transportZone) {
+        //creating hwVtepsList to pass
+        //Inventory model would deprecate Eventually, so not creating hWvtepslist under createDpnTepInfo();
+        List<HwVtep> hwVtepsList = new ArrayList<HwVtep>();
+        //currently the list has only one object always since we are adding L2Gws one by one and only to One TransportZone.
+        //Map<BigInteger, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
+
+        String zone_name = transportZone.getZoneName();
+        Class<? extends TunnelTypeBase> tunnel_type = transportZone.getTunnelType();
+        LOG.trace("Transport Zone_name: {}", zone_name);
+        List<Subnets> subnetsList = transportZone.getSubnets();
+        if (subnetsList != null) {
+            for (Subnets subnet : subnetsList) {
+                IpPrefix ipPrefix = subnet.getPrefix();
+                IpAddress gatewayIP = subnet.getGatewayIp();
+                int vlanID = subnet.getVlanId();
+                LOG.trace("IpPrefix: {}, gatewayIP: {}, vlanID: {} ", ipPrefix, gatewayIP, vlanID);
+                List<DeviceVteps> deviceVtepsList = subnet.getDeviceVteps();
+                if (deviceVtepsList != null) {
+                    for (DeviceVteps vteps : deviceVtepsList) {
+                        String topo_id = vteps.getTopologyId();
+                        String node_id = vteps.getNodeId();
+                        IpAddress ipAddress = vteps.getIpAddress();
+                        LOG.trace("topo-id: {}, node-id: {}, ipAddress: {}", topo_id, node_id, ipAddress);
+                        //TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(dpnID, ipAddress, port, vlanID, ipPrefix, gatewayIP, zone_name, tunnel_type);
+                        HwVtep hwVtep = ItmUtils.createHwVtepObject(topo_id, node_id, ipAddress, ipPrefix, gatewayIP, vlanID, tunnel_type, transportZone);
+
+                        if (hwVtepsList != null) {
+                            LOG.trace("Existing hwVteps");
+                            hwVtepsList.add(hwVtep);
+                        } else {
+                            LOG.trace("Adding new HwVtep {} info ", hwVtep.getHwIp());
+                            hwVtepsList.add(hwVtep);
+                        }
+                    }
+                }
+            }
+        }
+        LOG.trace("returning hwvteplist {}", hwVtepsList);
+        return hwVtepsList;
+    }
+}