To move Tep's from not hosted transport zone to transport zone. 97/45797/17
authorNishchya Gupta <nishchyag@altencalsoftlabs.com>
Mon, 19 Sep 2016 09:22:51 +0000 (14:52 +0530)
committerFaseela K <faseela.k@ericsson.com>
Wed, 15 Mar 2017 09:25:58 +0000 (09:25 +0000)
-If teps are present under some transport zone in Not hosted transport zone and similar transport
zone is created by NBI, then move the tep from not hosted list to transport
zone list

Testcases:-
1.Add some teps to not hosted transport zone with some transport
zone(which is not yet present in Transport zone)
2.Create the same name transport zone from NBI.
3.Validate that teps should move from not hosted list to Transport zone
list.

Change-Id: I7d17d1c1608b025efaa36ede007825fa657073d5
Signed-off-by: Nishchya Gupta <nishchyag@altencalsoftlabs.com>
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedMoveWorker.java [new file with mode: 0644]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedRemoveWorker.java [new file with mode: 0644]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/listeners/TransportZoneListener.java

diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedMoveWorker.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedMoveWorker.java
new file mode 100644 (file)
index 0000000..cc04faa
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2017 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,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.confighelpers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.impl.ItmUtils;
+import org.opendaylight.genius.itm.confighelpers.OvsdbTepAddConfigHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class ItmTepsNotHostedMoveWorker implements Callable<List<ListenableFuture<Void>>> {
+    private static final Logger LOG = LoggerFactory.getLogger(ItmTepsNotHostedMoveWorker.class );
+    final private  List<Vteps> vTepList;
+    final private  String tzName;
+
+    final private  DataBroker dataBroker;
+
+
+    public ItmTepsNotHostedMoveWorker(List<Vteps> vTepList, String tzName, DataBroker broker) {
+        this.vTepList = vTepList;
+        this.tzName = tzName;
+        this.dataBroker = broker ;
+    }
+
+    @Override
+    public List<ListenableFuture<Void>> call() throws Exception {
+        List<ListenableFuture<Void>> futures = new ArrayList<>();
+        WriteTransaction wrTx = dataBroker.newWriteOnlyTransaction();
+        List<Subnets> subnetList=new ArrayList<Subnets>();
+        IpPrefix subnetMaskObj = ItmUtils.getDummySubnet();
+        IpAddress tepIpAddress = null;
+        BigInteger dpnId = BigInteger.valueOf(0);
+
+        LOG.trace("Move TEP from TepsNotHosted list to NBI configured TZ task is picked from DataStoreJobCoordinator for execution.");
+
+        // Move TEP from TepsNotHosted list to NBI configured TZ.
+        OvsdbTepAddConfigHelper.addVtepInITMConfigDS(subnetList, subnetMaskObj, vTepList, tepIpAddress, tzName, dpnId,
+                ITMConstants.DUMMY_PORT, false, wrTx);
+
+        futures.add(wrTx.submit());
+        return futures;
+    }
+}
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedRemoveWorker.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/confighelpers/ItmTepsNotHostedRemoveWorker.java
new file mode 100644 (file)
index 0000000..c6e1cb7
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2017 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,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.confighelpers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.genius.itm.confighelpers.OvsdbTepRemoveConfigHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+public class ItmTepsNotHostedRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
+    private static final Logger LOG = LoggerFactory.getLogger(ItmTepsNotHostedRemoveWorker.class );
+    final private  IpAddress tepIpAddress;
+    final private  String tzName;
+    final private  BigInteger dpnId;
+    final private  DataBroker dataBroker;
+
+
+    public ItmTepsNotHostedRemoveWorker(String tzName, IpAddress tepIpAddress,
+        BigInteger dpnId, DataBroker broker) {
+
+        this.tepIpAddress = tepIpAddress;
+        this.tzName = tzName;
+        this.dpnId = dpnId;
+        this.dataBroker = broker ;
+    }
+
+    @Override
+    public List<ListenableFuture<Void>> call() throws Exception {
+        List<ListenableFuture<Void>> futures = new ArrayList<>();
+        WriteTransaction wrTx = dataBroker.newWriteOnlyTransaction();
+
+        LOG.trace("Remove TEP from TepsNotHosted list task is picked from DataStoreJobCoordinator for execution.");
+
+        // Remove TEP from TepsNotHosted list.
+        OvsdbTepRemoveConfigHelper.removeUnknownTzTepFromTepsNotHosted(tzName, tepIpAddress, dpnId, dataBroker, wrTx);
+
+        futures.add(wrTx.submit());
+        return futures;
+    }
+}
index 38512aa47099b0132a87a3a0c1ac5b25fe6d56d0..7d5415b0926eecfcca8b15ada1c500467d73c956 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2017 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,
@@ -30,6 +30,8 @@ import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
 import org.opendaylight.genius.itm.confighelpers.HwVtep;
 import org.opendaylight.genius.itm.confighelpers.ItmTepAddWorker;
 import org.opendaylight.genius.itm.confighelpers.ItmTepRemoveWorker;
+import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedMoveWorker;
+import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedRemoveWorker;
 import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.itm.impl.ITMManager;
 import org.opendaylight.genius.itm.impl.ItmUtils;
@@ -45,10 +47,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZonesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.tepsnothostedintransportzone.UnknownVteps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TepsNotHostedInTransportZone;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TepsNotHostedInTransportZoneKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.SubnetsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.DeviceVteps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.VtepsKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -230,6 +241,7 @@ public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<Trans
         LOG.debug("Received Transport Zone Add Event: {}, {}", key, tzNew);
         List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzNew);
         List<HwVtep> hwVtepList = createhWVteps(tzNew);
+        opDpnList.addAll(getDPNTepInfoFromNotHosted(tzNew));
         LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
         if (!opDpnList.isEmpty() || !hwVtepList.isEmpty()) {
             LOG.trace("Add: Invoking ItmManager with DPN List {} ", opDpnList);
@@ -241,7 +253,101 @@ public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<Trans
         }
     }
 
-    private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone) {
+    private List<DPNTEPsInfo> getDPNTepInfoFromNotHosted(TransportZone tzNew) {
+        List<DPNTEPsInfo> notHostedOpDpnList=new ArrayList<>();
+        if(isNewTZExistInNotHostedTZ(tzNew)){
+            notHostedOpDpnList = createDPNTepInfoFromNotHosted(tzNew);
+        }
+        return notHostedOpDpnList;
+    }
+
+    private List<DPNTEPsInfo> createDPNTepInfoFromNotHosted(TransportZone tzNew) {
+        Map<BigInteger, List<TunnelEndPoints>> mapNotHostedDPNToTunnelEndpt = new ConcurrentHashMap<>();
+        List<DPNTEPsInfo> notHostedDpnTepInfo = new ArrayList<>();
+        String newZoneName=tzNew.getZoneName();
+        List<TzMembership> zones = ItmUtils.createTransportZoneMembership(newZoneName);
+        Class<? extends TunnelTypeBase> tunnelType=tzNew.getTunnelType();
+        DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
+
+        TepsNotHostedInTransportZone tepNotHostedTransportZone=getNotHostedTransportZone(newZoneName).get();
+        if (tepNotHostedTransportZone == null) {
+            return notHostedDpnTepInfo;
+        }
+        List<UnknownVteps> unVtepsLst=tepNotHostedTransportZone.getUnknownVteps();
+        List<Vteps> vtepsList=new ArrayList<Vteps>();
+        if(unVtepsLst!=null && !unVtepsLst.isEmpty()) {
+            for (UnknownVteps vteps : unVtepsLst) {
+                BigInteger dpnID = vteps.getDpnId();
+                String port = ITMConstants.DUMMY_PORT;
+                int vlanID= ITMConstants.DUMMY_VLANID;
+                IpPrefix ipPrefix = new IpPrefix(ITMConstants.DUMMY_PREFIX.toCharArray());
+                IpAddress gatewayIP = new IpAddress(ITMConstants.DUMMY_GATEWAY_IP.toCharArray());
+                IpAddress ipAddress = vteps.getIpAddress();
+                boolean useOfTunnel = ItmUtils.falseIfNull(vteps.isOfTunnel());
+                TunnelEndPoints tunnelEndPoints =
+                        ItmUtils.createTunnelEndPoints(dpnID, ipAddress, port, useOfTunnel,vlanID, ipPrefix,
+                                gatewayIP, zones, tunnelType);
+                List<TunnelEndPoints> tunnelEndPointsList = mapNotHostedDPNToTunnelEndpt.get(dpnID);
+                if (tunnelEndPointsList != null) {
+                    tunnelEndPointsList.add(tunnelEndPoints);
+                } else {
+                    tunnelEndPointsList = new ArrayList<>();
+                    tunnelEndPointsList.add(tunnelEndPoints);
+                    mapNotHostedDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
+                }
+                Vteps newVtep=createVtepFromUnKnownVteps(dpnID,ipAddress,ITMConstants.DUMMY_PORT);
+                vtepsList.add(newVtep);
+
+                // Enqueue 'remove TEP from TepsNotHosted list' operation
+                // into DataStoreJobCoordinator
+                ItmTepsNotHostedRemoveWorker
+                    removeWorker = new ItmTepsNotHostedRemoveWorker(newZoneName, ipAddress, dpnID, dataBroker);
+                coordinator.enqueueJob(newZoneName, removeWorker);
+            }
+        }
+
+        // Enqueue 'add TEP received from southbound OVSDB into ITM config DS' operation
+        // into DataStoreJobCoordinator
+        ItmTepsNotHostedMoveWorker
+            moveWorker = new ItmTepsNotHostedMoveWorker(vtepsList, newZoneName, dataBroker);
+        coordinator.enqueueJob(newZoneName, moveWorker);
+
+        if(mapNotHostedDPNToTunnelEndpt.size() > 0){
+            Set<BigInteger> keys = mapNotHostedDPNToTunnelEndpt.keySet();
+            for(BigInteger key: keys){
+                DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(key, mapNotHostedDPNToTunnelEndpt.get(key));
+                notHostedDpnTepInfo.add(newDpnTepsInfo);
+            }
+        }
+        return notHostedDpnTepInfo;
+
+    }
+
+    private Vteps createVtepFromUnKnownVteps(BigInteger dpnID, IpAddress ipAddress, String port) {
+        VtepsKey vtepkey = new VtepsKey(dpnID, port);
+        Vteps vtepObj = new VtepsBuilder().setDpnId(dpnID).setIpAddress(ipAddress).setKey(vtepkey)
+                .setPortname(port).build();
+        return vtepObj;
+    }
+
+    private boolean isNewTZExistInNotHostedTZ(TransportZone tzNew){
+        boolean isPresent=false;
+        if (getNotHostedTransportZone(tzNew.getZoneName()).isPresent()) {
+            isPresent=true;
+        }
+        return isPresent;
+    }
+
+    public  Optional<TepsNotHostedInTransportZone> getNotHostedTransportZone(String transportZoneName) {
+        InstanceIdentifier<TepsNotHostedInTransportZone> tzonePath = InstanceIdentifier.builder(TransportZones.class)
+                .child(TepsNotHostedInTransportZone.class, new TepsNotHostedInTransportZoneKey(transportZoneName)).build();
+        Optional<TepsNotHostedInTransportZone> tZoneNotHostedOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, tzonePath,
+                dataBroker);
+        return tZoneNotHostedOptional;
+    }
+
+    private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone){
+
         Map<BigInteger, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
         List<DPNTEPsInfo> dpnTepInfo = new ArrayList<>();
         List<TzMembership> zones = ItmUtils.createTransportZoneMembership(transportZone.getZoneName());