2 * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.vpnservice.itm.listeners;
11 import java.math.BigInteger;
12 import java.util.ArrayList;
13 import java.util.List;
16 import java.util.concurrent.ConcurrentHashMap;
18 import com.google.common.base.Optional;
19 import com.google.common.util.concurrent.CheckedFuture;
20 import com.google.common.util.concurrent.ListenableFuture;
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.idmanager.rev150403.IdManagerService;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeBase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.DPNTEPsInfo;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.TransportZones;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.TransportZonesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.TransportZone;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.Subnets;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rev150701.transport.zones.transport.zone.subnets.Vteps;
36 import org.opendaylight.vpnservice.datastoreutils.AsyncDataTreeChangeListenerBase;
37 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
38 import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager;
39 import org.opendaylight.vpnservice.itm.impl.ITMManager;
40 import org.opendaylight.vpnservice.itm.impl.ItmUtils;
41 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
42 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
43 import org.opendaylight.vpnservice.itm.confighelpers.ItmTepAddWorker ;
44 import org.opendaylight.vpnservice.itm.confighelpers.ItmTepRemoveWorker;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
49 * This class listens for interface creation/removal/update in Configuration DS.
50 * This is used to handle interfaces for base of-ports.
52 public class TransportZoneListener extends AsyncDataTreeChangeListenerBase<TransportZone, TransportZoneListener> implements AutoCloseable{
53 private static final Logger LOG = LoggerFactory.getLogger(TransportZoneListener.class);
54 private DataBroker dataBroker;
55 private IdManagerService idManagerService;
56 private IMdsalApiManager mdsalManager;
57 private ITMManager itmManager;
59 public TransportZoneListener(final DataBroker dataBroker, final IdManagerService idManagerService) {
60 super(TransportZone.class, TransportZoneListener.class);
61 this.dataBroker = dataBroker;
62 this.idManagerService = idManagerService;
63 initializeTZNode(dataBroker);
66 public void setItmManager(ITMManager itmManager) {
67 this.itmManager = itmManager;
70 public void setMdsalManager(IMdsalApiManager mdsalManager) {
71 this.mdsalManager = mdsalManager;
74 private void initializeTZNode(DataBroker db) {
75 ReadWriteTransaction transaction = db.newReadWriteTransaction();
76 InstanceIdentifier<TransportZones> path = InstanceIdentifier.create(TransportZones.class);
77 CheckedFuture<Optional<TransportZones>, ReadFailedException> tzones =
78 transaction.read(LogicalDatastoreType.CONFIGURATION,path);
80 if (!tzones.get().isPresent()) {
81 TransportZonesBuilder tzb = new TransportZonesBuilder();
82 transaction.put(LogicalDatastoreType.CONFIGURATION,path,tzb.build());
87 } catch (Exception e) {
88 LOG.error("Error initializing TransportZones {}",e);
93 public void close() throws Exception {
94 LOG.info("tzChangeListener Closed");
97 protected InstanceIdentifier<TransportZone> getWildCardPath() {
98 return InstanceIdentifier.create(TransportZones.class).child(TransportZone.class);
102 protected TransportZoneListener getDataTreeChangeListener() {
103 return TransportZoneListener.this;
107 protected void remove(InstanceIdentifier<TransportZone> key, TransportZone tzOld) {
108 LOG.debug("Received Transport Zone Remove Event: {}, {}", key, tzOld);
109 List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzOld);
110 LOG.trace("Delete: Invoking deleteTunnels in ItmManager with DpnList {}", opDpnList);
111 if(opDpnList.size()>0) {
112 LOG.trace("Delete: Invoking ItmManager");
113 // itmManager.deleteTunnels(opDpnList);
114 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
115 ItmTepRemoveWorker removeWorker = new ItmTepRemoveWorker(opDpnList, dataBroker, idManagerService, mdsalManager);
116 coordinator.enqueueJob(tzOld.getZoneName(), removeWorker);
121 protected void update(InstanceIdentifier<TransportZone> key, TransportZone tzOld, TransportZone tzNew) {
122 LOG.debug("Received Transport Zone Update Event: {}, {}, {}", key, tzOld, tzNew);
123 if( !(tzOld.equals(tzNew))) {
129 protected void add(InstanceIdentifier<TransportZone> key, TransportZone tzNew) {
130 LOG.debug("Received Transport Zone Add Event: {}, {}", key, tzNew);
131 List<DPNTEPsInfo> opDpnList = createDPNTepInfo(tzNew);
132 LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
133 if(opDpnList.size()>0) {
134 LOG.trace("Add: Invoking ItmManager with DPN List {} " , opDpnList);
135 //itmManager.build_all_tunnels(opDpnList);
136 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
137 ItmTepAddWorker addWorker = new ItmTepAddWorker(opDpnList,dataBroker, idManagerService, mdsalManager);
138 coordinator.enqueueJob(tzNew.getZoneName(), addWorker);
142 private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone){
144 Map<BigInteger, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
145 List<DPNTEPsInfo> dpnTepInfo = new ArrayList<DPNTEPsInfo>();
146 // List<TransportZone> transportZoneList = transportZones.getTransportZone();
147 // for(TransportZone transportZone : transportZoneList) {
148 String zone_name = transportZone.getZoneName();
149 Class<? extends TunnelTypeBase> tunnel_type = transportZone.getTunnelType();
150 LOG.trace("Transport Zone_name: {}", zone_name);
151 List<Subnets> subnetsList = transportZone.getSubnets();
152 if(subnetsList!=null){
153 for (Subnets subnet : subnetsList) {
154 IpPrefix ipPrefix = subnet.getPrefix();
155 IpAddress gatewayIP = subnet.getGatewayIp();
156 int vlanID = subnet.getVlanId();
157 LOG.trace("IpPrefix: {}, gatewayIP: {}, vlanID: {} ", ipPrefix, gatewayIP, vlanID);
158 List<Vteps> vtepsList = subnet.getVteps();
159 for (Vteps vteps : vtepsList) {
160 BigInteger dpnID = vteps.getDpnId();
161 String port = vteps.getPortname();
162 IpAddress ipAddress = vteps.getIpAddress();
163 LOG.trace("DpnID: {}, port: {}, ipAddress: {}", dpnID, port, ipAddress);
164 TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(dpnID, ipAddress, port, vlanID, ipPrefix, gatewayIP, zone_name, tunnel_type);
165 List<TunnelEndPoints> tunnelEndPointsList = mapDPNToTunnelEndpt.get(dpnID);
166 if (tunnelEndPointsList != null) {
167 LOG.trace("Existing DPN info list in the Map: {} ", dpnID);
168 tunnelEndPointsList.add(tunnelEndPoints);
170 LOG.trace("Adding new DPN info list to the Map: {} ", dpnID);
171 tunnelEndPointsList = new ArrayList<TunnelEndPoints>();
172 tunnelEndPointsList.add(tunnelEndPoints);
173 mapDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
179 if(mapDPNToTunnelEndpt.size()>0){
180 Set<BigInteger> keys = mapDPNToTunnelEndpt.keySet();
181 LOG.trace("List of dpns in the Map: {} ", keys);
182 for(BigInteger key: keys){
183 DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(key, mapDPNToTunnelEndpt.get(key));
184 dpnTepInfo.add(newDpnTepsInfo);