Support for CreatingTerminatingService RPC
[vpnservice.git] / itm / itm-impl / src / main / java / org / opendaylight / vpnservice / itm / listeners / TransportZoneListener.java
1 /*
2  * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.vpnservice.itm.listeners;
10
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.Set;
16 import java.util.concurrent.ConcurrentHashMap;
17
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.CheckedFuture;
20 import com.google.common.util.concurrent.ListenableFuture;
21
22 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
23 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
24 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeBase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.DPNTEPsInfo;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.TransportZones;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.TransportZonesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.TransportZone;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.Subnets;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.subnets.Vteps;
35 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
36 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
37 import org.opendaylight.vpnservice.itm.impl.ITMManager;
38 import org.opendaylight.vpnservice.itm.impl.ItmUtils;
39 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41 import org.opendaylight.vpnservice.itm.confighelpers.ItmTepAddWorker ;
42 import org.opendaylight.vpnservice.itm.confighelpers.ItmTepRemoveWorker;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 /**
47  * This class listens for interface creation/removal/update in Configuration DS.
48  * This is used to handle interfaces for base of-ports.
49  */
50 public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<TransportZone, TransportZoneListener> implements AutoCloseable{
51     private static final Logger LOG = LoggerFactory.getLogger(TransportZoneListener.class);
52     private DataBroker dataBroker;
53     private ITMManager itmManager;
54
55     public TransportZoneListener(final DataBroker dataBroker) {
56         super(TransportZone.class, TransportZoneListener.class);
57         this.dataBroker = dataBroker;
58         initializeTZNode(dataBroker);
59     }
60
61     public void setItmManager(ITMManager itmManager) {
62         this.itmManager = itmManager;
63     }
64
65     private void initializeTZNode(DataBroker db) {
66         ReadWriteTransaction transaction = db.newReadWriteTransaction();
67         InstanceIdentifier<TransportZones> path = InstanceIdentifier.create(TransportZones.class);
68         CheckedFuture<Optional<TransportZones>, ReadFailedException> tzones =
69                         transaction.read(LogicalDatastoreType.CONFIGURATION,path);
70         try {
71             if (!tzones.get().isPresent()) {
72                 TransportZonesBuilder tzb = new TransportZonesBuilder();
73                 transaction.put(LogicalDatastoreType.CONFIGURATION,path,tzb.build());
74                 transaction.submit();
75             } else {
76                 transaction.cancel();
77             }
78         } catch (Exception e) {
79             LOG.error("Error initializing TransportZones {}",e);
80         }
81     }
82
83     @Override
84     public void close() throws Exception {
85         LOG.info("tzChangeListener Closed");
86     }
87     @Override
88     protected InstanceIdentifier<TransportZone> getWildCardPath() {
89         return InstanceIdentifier.create(TransportZones.class).child(TransportZone.class);
90     }
91
92     @Override
93     protected TransportZoneListener getDataTreeChangeListener() {
94         return TransportZoneListener.this;
95     }
96
97     @Override
98     protected void remove(InstanceIdentifier<TransportZone> key, TransportZone tzOld) {
99         LOG.debug("Received Transport Zone Remove Event: {}, {}", key, tzOld);
100         List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzOld);
101         LOG.trace("Delete: Invoking deleteTunnels in ItmManager with DpnList {}", opDpnList);
102         if(opDpnList.size()>0) {
103             LOG.trace("Delete: Invoking ItmManager");
104            // itmManager.deleteTunnels(opDpnList);
105             DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
106             ItmTepRemoveWorker removeWorker = new ItmTepRemoveWorker(opDpnList, dataBroker);
107             coordinator.enqueueJob(tzOld.getZoneName(), removeWorker);
108         }
109     }
110
111     @Override
112     protected void update(InstanceIdentifier<TransportZone> key, TransportZone tzOld, TransportZone tzNew) {
113         LOG.debug("Received Transport Zone Update Event: {}, {}, {}", key, tzOld, tzNew);
114         if( !(tzOld.equals(tzNew))) {
115            add(key, tzNew);
116         }
117     }
118
119     @Override
120     protected void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
121         LOG.debug("Received Transport Zone Add Event: {}, {}", key, tzNew);
122         List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzNew);
123         LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
124         if(opDpnList.size()>0) {
125           LOG.trace("Add: Invoking ItmManager with DPN List {} " , opDpnList);
126           //itmManager.build_all_tunnels(opDpnList);
127           DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
128           ItmTepAddWorker addWorker = new ItmTepAddWorker(opDpnList,dataBroker);
129           coordinator.enqueueJob(tzNew.getZoneName(), addWorker);
130       }
131     }
132
133     private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone){
134
135         Map<BigInteger, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
136         List<DPNTEPsInfo> dpnTepInfo = new ArrayList<DPNTEPsInfo>();
137        // List<TransportZone> transportZoneList = transportZones.getTransportZone();
138        // for(TransportZone transportZone : transportZoneList) {
139             String zone_name = transportZone.getZoneName();
140             Class<? extends TunnelTypeBase> tunnel_type = transportZone.getTunnelType();
141             LOG.trace("Transport Zone_name: {}", zone_name);
142             List<Subnets> subnetsList = transportZone.getSubnets();
143             if(subnetsList!=null){
144                 for (Subnets subnet : subnetsList) {
145                     IpPrefix ipPrefix = subnet.getPrefix();
146                     IpAddress gatewayIP = subnet.getGatewayIp();
147                     int vlanID = subnet.getVlanId();
148                     LOG.trace("IpPrefix: {}, gatewayIP: {}, vlanID: {} ", ipPrefix, gatewayIP, vlanID);
149                     List<Vteps> vtepsList = subnet.getVteps();
150                     for (Vteps vteps : vtepsList) {
151                         BigInteger dpnID = vteps.getDpnId();
152                         String port = vteps.getPortname();
153                         IpAddress ipAddress = vteps.getIpAddress();
154                         LOG.trace("DpnID: {}, port: {}, ipAddress: {}", dpnID, port, ipAddress);
155                     TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(dpnID, ipAddress, port, vlanID, ipPrefix, gatewayIP, zone_name, tunnel_type);
156                         List<TunnelEndPoints> tunnelEndPointsList = mapDPNToTunnelEndpt.get(dpnID);
157                         if (tunnelEndPointsList != null) {
158                             LOG.trace("Existing DPN info list in the Map: {} ", dpnID);
159                             tunnelEndPointsList.add(tunnelEndPoints);
160                         } else {
161                             LOG.trace("Adding new DPN info list to the Map: {} ", dpnID);
162                             tunnelEndPointsList = new ArrayList<TunnelEndPoints>();
163                             tunnelEndPointsList.add(tunnelEndPoints);
164                             mapDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
165                         }
166                     }
167                 }
168             }
169         //}
170         if(mapDPNToTunnelEndpt.size()>0){
171             Set<BigInteger> keys = mapDPNToTunnelEndpt.keySet();
172             LOG.trace("List of dpns in the Map: {} ", keys);
173             for(BigInteger key: keys){
174                 DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(key, mapDPNToTunnelEndpt.get(key));
175                 dpnTepInfo.add(newDpnTepsInfo);
176             }
177         }
178         return dpnTepInfo;
179     }
180 }