e9fb7aef2f9578f546c053d222821e424d078553
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / cli / TepCommandHelper.java
1 /*
2  * Copyright (c) 2016, 2017 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 package org.opendaylight.genius.itm.cli;
9
10 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
11
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.MoreExecutors;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Map.Entry;
21 import java.util.Objects;
22 import java.util.Optional;
23 import java.util.concurrent.ExecutionException;
24 import java.util.concurrent.atomic.AtomicInteger;
25 import javax.annotation.PostConstruct;
26 import javax.annotation.PreDestroy;
27 import javax.inject.Inject;
28 import javax.inject.Singleton;
29 import org.apache.commons.lang3.StringUtils;
30 import org.opendaylight.genius.infra.Datastore;
31 import org.opendaylight.genius.infra.RetryingManagedNewTransactionRunner;
32 import org.opendaylight.genius.itm.cache.UnprocessedTunnelsStateCache;
33 import org.opendaylight.genius.itm.globals.ITMConstants;
34 import org.opendaylight.genius.itm.impl.ItmUtils;
35 import org.opendaylight.mdsal.binding.api.DataBroker;
36 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBfd;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeLldp;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeGre;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeLogicalGroup;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeMplsOverGre;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorInterval;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorIntervalBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorParams;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.TunnelMonitorParamsBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelOperStatus;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZonesBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZoneKey;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsKey;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
64 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
65 import org.opendaylight.yangtools.yang.binding.DataObject;
66 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
67 import org.opendaylight.yangtools.yang.common.Uint64;
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70
71 @Singleton
72 @SuppressWarnings("checkstyle:RegexpSingleLineJava")
73 public class TepCommandHelper {
74
75     private static final Logger LOG = LoggerFactory.getLogger(TepCommandHelper.class);
76
77     private static final AtomicInteger CHECK = new AtomicInteger();
78
79     private final DataBroker dataBroker;
80     private final RetryingManagedNewTransactionRunner txRunner;
81     private final ItmConfig itmConfig;
82     private final UnprocessedTunnelsStateCache unprocessedTunnelsStateCache;
83
84     /*
85      * boolean flag add_or_delete --- can be set to true if the last called tep
86      * command is Tep-add else set to false when Tep-delete is called
87      * tepCommandHelper object is created only once in session initiated
88      */
89     private final Map<String, List<Vteps>> transportZonesHashMap = new HashMap<>();
90     private List<TransportZone> transportZoneArrayList = new ArrayList<>();
91     private final List<Vteps> vtepDelCommitList = new ArrayList<>();
92
93     @Inject
94     public TepCommandHelper(final DataBroker dataBroker, final ItmConfig itmConfig,
95                             final UnprocessedTunnelsStateCache unprocessedTunnelsStateCache) {
96         this.dataBroker = dataBroker;
97         this.txRunner = new RetryingManagedNewTransactionRunner(dataBroker);
98         this.itmConfig = itmConfig;
99         this.unprocessedTunnelsStateCache = unprocessedTunnelsStateCache;
100     }
101
102     @PostConstruct
103     public void start() throws ExecutionException, InterruptedException {
104         LOG.info("TepCommandHelper Started");
105     }
106
107     @PreDestroy
108     public void close() {
109         LOG.info("TepCommandHelper Closed");
110     }
111
112     @SuppressWarnings("checkstyle:IllegalCatch")
113     public void createLocalCache(Uint64 dpnId, String ipAddress,
114                                  String transportZone) throws TepException {
115
116         CHECK.incrementAndGet();
117         IpAddress ipAddressObj;
118
119         final VtepsKey vtepkey = new VtepsKey(dpnId);
120
121         ipAddressObj = IpAddressBuilder.getDefaultInstance(ipAddress);
122
123         if (checkTepPerTzPerDpn(transportZone, dpnId)) {
124             handleError("Only one end point per transport Zone per Dpn is allowed");
125             return;
126         }
127
128         Vteps vtepCli = new VtepsBuilder().setDpnId(dpnId).setIpAddress(ipAddressObj).withKey(vtepkey)
129                 .build();
130
131         if (transportZonesHashMap.containsKey(transportZone)) {
132             List<Vteps> vtepListTemp = transportZonesHashMap.get(transportZone);
133             if (!vtepListTemp.contains(vtepCli)) {
134                 vtepListTemp.add(vtepCli);
135             }
136         } else {
137             List<Vteps> vtepListTemp = new ArrayList<>();
138             vtepListTemp.add(vtepCli);
139             transportZonesHashMap.put(transportZone, vtepListTemp);
140         }
141     }
142
143     /**
144      * Gets the transport zone.
145      *
146      * @param transportZoneName
147      *            the tzone
148      * @return the transport zone
149      */
150     public TransportZone getTransportZone(String transportZoneName) {
151         InstanceIdentifier<TransportZone> tzonePath = InstanceIdentifier.builder(TransportZones.class)
152                 .child(TransportZone.class, new TransportZoneKey(transportZoneName)).build();
153         return ItmUtils.read(LogicalDatastoreType.CONFIGURATION, tzonePath, dataBroker).orElse(null);
154     }
155
156     /**
157      * Gets all transport zones.
158      *
159      * @return all transport zones
160      */
161     public TransportZones getAllTransportZones() {
162         InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
163         return ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker).orElse(null);
164     }
165
166
167     public boolean checkTepPerTzPerDpn(String tzone, Uint64 dpnId) {
168         // check in local cache
169         if (transportZonesHashMap.containsKey(tzone)) {
170             List<Vteps> vtepList = transportZonesHashMap.get(tzone);
171             for (Vteps vtep : vtepList) {
172                 if (Objects.equals(vtep.getDpnId(), dpnId)) {
173                     return true;
174                 }
175             }
176         }
177
178         // check in DS
179         InstanceIdentifier<TransportZone> tzonePath =
180                 InstanceIdentifier.builder(TransportZones.class)
181                         .child(TransportZone.class, new TransportZoneKey(tzone)).build();
182         Optional<TransportZone> transportZoneOptional =
183                 ItmUtils.read(LogicalDatastoreType.CONFIGURATION, tzonePath, dataBroker);
184         if (transportZoneOptional.isPresent()) {
185             TransportZone tz = transportZoneOptional.get();
186             for (Vteps vtep : tz.getVteps()) {
187                 if (Objects.equals(vtep.getDpnId(), dpnId)) {
188                     return true;
189                 }
190             }
191         }
192         return false;
193     }
194
195     @SuppressWarnings("checkstyle:IllegalCatch")
196     public void buildTeps() {
197         TransportZone transportZone = null;
198         try {
199             LOG.debug("no of teps added {}", CHECK);
200             if (transportZonesHashMap != null && !transportZonesHashMap.isEmpty()) {
201                 transportZoneArrayList = new ArrayList<>();
202                 for (Entry<String, List<Vteps>> mapEntry : transportZonesHashMap.entrySet()) {
203                     String tz = mapEntry.getKey();
204                     LOG.debug("transportZonesHashMap {}", tz);
205                     List<Vteps> vtepListTemp = mapEntry.getValue();
206                     InstanceIdentifier<TransportZone> transportZonePath =
207                             InstanceIdentifier.builder(TransportZones.class)
208                                     .child(TransportZone.class, new TransportZoneKey(tz)).build();
209                     Optional<TransportZone> transportZoneOptional =
210                             ItmUtils.read(LogicalDatastoreType.CONFIGURATION, transportZonePath, dataBroker);
211                     LOG.debug("read container from DS");
212                     if (transportZoneOptional.isPresent()) {
213                         TransportZone tzoneFromDs = transportZoneOptional.get();
214                         LOG.debug("read tzone container {}", tzoneFromDs);
215                         if (tzoneFromDs.getTunnelType() == null
216                                 || tzoneFromDs.getTunnelType().equals(TunnelTypeVxlan.class)) {
217                             transportZone =
218                                     new TransportZoneBuilder().withKey(new TransportZoneKey(tz))
219                                             .setTunnelType(TunnelTypeVxlan.class)
220                                             .setZoneName(tz).setVteps(vtepListTemp).build();
221                         } else if (tzoneFromDs.getTunnelType().equals(TunnelTypeGre.class)) {
222                             transportZone =
223                                     new TransportZoneBuilder().withKey(new TransportZoneKey(tz))
224                                             .setTunnelType(TunnelTypeGre.class).setVteps(vtepListTemp)
225                                             .setZoneName(tz).build();
226                         }
227                     } else {
228                         transportZone =
229                                 new TransportZoneBuilder().withKey(new TransportZoneKey(tz))
230                                         .setTunnelType(TunnelTypeVxlan.class).setZoneName(tz).setVteps(vtepListTemp)
231                                         .build();
232                     }
233                     LOG.debug("tzone object {}", transportZone);
234                     transportZoneArrayList.add(transportZone);
235                 }
236                 TransportZones transportZones =
237                         new TransportZonesBuilder().setTransportZone(transportZoneArrayList).build();
238                 InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
239                 LOG.debug("InstanceIdentifier {}", path);
240                 Futures.addCallback(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
241                     tx -> tx.merge(path, transportZones, true)), ItmUtils.DEFAULT_WRITE_CALLBACK,
242                     MoreExecutors.directExecutor());
243                 LOG.debug("wrote to Config DS {}", transportZones);
244                 transportZonesHashMap.clear();
245                 transportZoneArrayList.clear();
246                 LOG.debug("Everything cleared");
247             } else {
248                 LOG.debug("NO vteps were configured");
249             }
250         } catch (RuntimeException e) {
251             LOG.error("Error building TEPs", e);
252         }
253     }
254
255     public List<String> showTeps(boolean monitorEnabled, int monitorInterval) throws TepException {
256         boolean flag = false;
257         InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
258         Optional<TransportZones> transportZonesOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
259                 path, dataBroker);
260         if (transportZonesOptional.isPresent()) {
261             List<String> result = new ArrayList<>();
262             TransportZones transportZones = transportZonesOptional.get();
263             if (transportZones.getTransportZone() == null || transportZones.getTransportZone().isEmpty()) {
264                 handleError("No teps configured");
265                 return result;
266             }
267             result.add(String.format("Tunnel Monitoring (for VXLAN tunnels): %s", monitorEnabled ? "On" : "Off"));
268             result.add(String.format("Tunnel Monitoring Interval (for VXLAN tunnels): %d", monitorInterval));
269             result.add(System.lineSeparator());
270             result.add(String.format("%-16s  %-16s  %-16s  %-12s  %-12s %-12s %-16s %-12s", "TransportZone",
271                     "TunnelType", "SubnetMask", "GatewayIP", "VlanID", "DpnID", "IPAddress", "PortName"));
272             result.add("---------------------------------------------------------------------------------------------"
273                     + "---------------------------------");
274             for (TransportZone tz : transportZones.getTransportZone()) {
275                 if (tz.getVteps() == null || tz.getVteps().isEmpty()) {
276                     continue;
277                 }
278                 for (Vteps vtep : tz.getVteps()) {
279                     flag = true;
280                     String strTunnelType ;
281                     if (TunnelTypeGre.class.equals(tz.getTunnelType())) {
282                         strTunnelType = ITMConstants.TUNNEL_TYPE_GRE;
283                     } else {
284                         strTunnelType = ITMConstants.TUNNEL_TYPE_VXLAN;
285                     }
286                     result.add(String.format("%-16s  %-16s  %-12s %-16s",
287                             tz.getZoneName(), strTunnelType,
288                             vtep.getDpnId().toString(), vtep.getIpAddress().stringValue()));
289                 }
290             }
291             if (flag) {
292                 return result;
293             } else {
294                 return Collections.singletonList("No teps to display");
295             }
296         } else {
297             return Collections.singletonList("No teps configured");
298         }
299     }
300
301     @SuppressWarnings("checkstyle:RegexpSinglelineJava")
302     public void showCache(String cacheName) {
303         final Collection<String> cacheContent;
304         switch (cacheName) {
305             case ITMConstants.INTERNAL_TUNNEL_CACHE_NAME:
306                 cacheContent = ItmUtils.ITM_CACHE.getAllInternalInterfaces();
307                 break;
308             case ITMConstants.EXTERNAL_TUNNEL_CACHE_NAME:
309                 cacheContent = ItmUtils.ITM_CACHE.getAllExternalInterfaces();
310                 break;
311             case ITMConstants.UNPROCESSED_TUNNELS_CACHE_NAME:
312                 cacheContent = unprocessedTunnelsStateCache.getAllUnprocessedTunnels();
313                 break;
314             default:
315                 System.out.println(" " + cacheName + " is not a valid Cache Name ");
316                 return;
317         }
318         System.out.println("Dumping the data in cache for " + cacheName);
319         System.out.println("Number of data in cache " + cacheContent.size());
320         if (!cacheContent.isEmpty()) {
321             for (String key : cacheContent) {
322                 System.out.println(key + " ");
323             }
324         } else {
325             System.out.println("No data in cache for " + cacheName);
326         }
327     }
328
329     @SuppressWarnings("checkstyle:IllegalCatch")
330     public void deleteVtep(Uint64 dpnId, String ipAddress,
331                            String transportZone) throws TepException {
332
333         final VtepsKey vtepkey = new VtepsKey(dpnId);
334
335         IpAddress ipAddressObj = IpAddressBuilder.getDefaultInstance(ipAddress);
336
337         Vteps vtepCli;
338
339         InstanceIdentifier<Vteps> vpath = InstanceIdentifier.builder(TransportZones.class)
340                 .child(TransportZone.class, new TransportZoneKey(transportZone))
341                 .child(Vteps.class, vtepkey).build();
342
343         // check if present in tzones and delete from cache
344         boolean existsInCache = isInCache(dpnId, ipAddress, transportZone);
345         if (!existsInCache) {
346             Optional<Vteps> vtepOptional = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, vpath, dataBroker);
347             if (vtepOptional.isPresent()) {
348                 vtepCli = vtepOptional.get();
349                 if (Objects.equals(vtepCli.getIpAddress(), ipAddressObj)) {
350                     vtepDelCommitList.add(vtepCli);
351                 }
352             } else {
353                 handleError("Vtep Doesnt exist");
354             }
355         }
356     }
357
358     @SuppressWarnings("checkstyle:IllegalCatch")
359     public <T extends DataObject> void deleteOnCommit() {
360         List<InstanceIdentifier<T>> vtepPaths = new ArrayList<>();
361         List<InstanceIdentifier<T>> subnetPaths = new ArrayList<>();
362         List<Vteps> vtepDelList = new ArrayList<>();
363         List<InstanceIdentifier<T>> allPaths = new ArrayList<>();
364         try {
365             if (vtepDelCommitList != null && !vtepDelCommitList.isEmpty()) {
366                 InstanceIdentifier<TransportZones> path = InstanceIdentifier.builder(TransportZones.class).build();
367                 Optional<TransportZones> transportZonesOptional =
368                         ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker);
369                 if (transportZonesOptional.isPresent()) {
370                     List<TransportZone> transportZones = transportZonesOptional.get().nonnullTransportZone();
371                     for (TransportZone tz : transportZones) {
372                         if (tz.getVteps() == null || tz.getVteps().isEmpty()) {
373                             continue;
374                         }
375                         vtepDelList.addAll(vtepDelCommitList);
376                         for (Vteps vtep : vtepDelList) {
377                             InstanceIdentifier<T> vpath =
378                                     (InstanceIdentifier<T>) InstanceIdentifier
379                                             .builder(TransportZones.class)
380                                             .child(TransportZone.class, tz.key())
381                                             .child(Vteps.class, vtep.key()).build();
382                             vtepPaths.add(vpath);
383                         }
384                     }
385
386                     allPaths.addAll(vtepPaths);
387                     allPaths.addAll(subnetPaths);
388                     Futures.addCallback(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
389                         tx -> allPaths.forEach(tx::delete)), ItmUtils.DEFAULT_WRITE_CALLBACK,
390                         MoreExecutors.directExecutor());
391                 }
392                 vtepPaths.clear();
393                 subnetPaths.clear();
394                 allPaths.clear();
395                 vtepDelCommitList.clear();
396             }
397         } catch (RuntimeException e) {
398             LOG.error("Unexpected error", e);
399         }
400     }
401
402     @SuppressWarnings("checkstyle:RegexpSinglelineJava")
403     public void showState(Collection<StateTunnelList> tunnelLists, boolean tunnelMonitorEnabled) throws TepException {
404         if (tunnelLists == null || tunnelLists.isEmpty()) {
405             handleError("No Internal Tunnels Exist");
406             return;
407         }
408         if (!tunnelMonitorEnabled) {
409             System.out.println("Tunnel Monitoring is Off");
410         }
411         String displayFormat = "%-16s  %-16s  %-16s  %-16s  %-16s  %-10s  %-10s";
412         System.out.println(String.format(displayFormat, "Tunnel Name", "Source-DPN",
413                 "Destination-DPN", "Source-IP", "Destination-IP", "Trunk-State", "Transport Type"));
414         System.out.println("-----------------------------------------------------------------------------------------"
415                 + "--------------------------------------------");
416
417         for (StateTunnelList tunnelInst : tunnelLists) {
418             // Display only the internal tunnels
419             if (TepTypeInternal.class.equals(tunnelInst.getDstInfo().getTepDeviceType())) {
420                 String tunnelInterfaceName = tunnelInst.getTunnelInterfaceName();
421                 LOG.trace("tunnelInterfaceName::: {}", tunnelInterfaceName);
422                 String tunnelState = ITMConstants.TUNNEL_STATE_UNKNOWN;
423                 if (tunnelInst.getOperState() == TunnelOperStatus.Up) {
424                     tunnelState = ITMConstants.TUNNEL_STATE_UP;
425                 } else if (tunnelInst.getOperState() == TunnelOperStatus.Down) {
426                     tunnelState = ITMConstants.TUNNEL_STATE_DOWN;
427                 }
428                 Class<? extends TunnelTypeBase> tunType = tunnelInst.getTransportType();
429                 String tunnelType = ITMConstants.TUNNEL_TYPE_VXLAN;
430                 if (TunnelTypeVxlan.class.equals(tunType)) {
431                     tunnelType = ITMConstants.TUNNEL_TYPE_VXLAN;
432                 } else if (tunType.equals(TunnelTypeGre.class)) {
433                     tunnelType = ITMConstants.TUNNEL_TYPE_GRE;
434                 } else if (tunType.equals(TunnelTypeMplsOverGre.class)) {
435                     tunnelType = ITMConstants.TUNNEL_TYPE_MPLSoGRE;
436                 } else if (tunType.equals(TunnelTypeLogicalGroup.class)) {
437                     tunnelType = ITMConstants.TUNNEL_TYPE_LOGICAL_GROUP_VXLAN;
438                 }
439                 System.out.println(String.format(displayFormat, tunnelInst.getTunnelInterfaceName(),
440                         tunnelInst.getSrcInfo().getTepDeviceId(), tunnelInst.getDstInfo().getTepDeviceId(),
441                         tunnelInst.getSrcInfo().getTepIp().stringValue(),
442                         tunnelInst.getDstInfo().getTepIp().stringValue(), tunnelState, tunnelType));
443             }
444         }
445     }
446
447     // Show DPN-ID and Bridge mapping
448     public void showBridges(Map<Uint64, OvsdbBridgeRef> dpnIdBridgeRefMap) {
449         System.out.println(String.format("%-16s  %-16s  %-36s%n", "DPN-ID", "Bridge-Name", "Bridge-UUID")
450                 + "------------------------------------------------------------------------");
451         dpnIdBridgeRefMap.forEach((dpnId, ovsdbBridgeRef) -> {
452             String szBridgeId = ovsdbBridgeRef.getValue().firstKeyOf(Node.class).getNodeId().getValue();
453             String bridgeUUID = szBridgeId.substring(13, 49);
454             String bridgeName = szBridgeId.substring(57);
455             System.out.println(String.format("%-16s  %-16s  %-36s", dpnId, bridgeName, bridgeUUID));
456         });
457     }
458
459     // deletes from ADD-cache if it exists.
460     public boolean isInCache(Uint64 dpnId, String ipAddress,
461                              String transportZone) throws TepException {
462         boolean exists = false;
463         final VtepsKey vtepkey = new VtepsKey(dpnId);
464         IpAddress ipAddressObj = IpAddressBuilder.getDefaultInstance(ipAddress);
465
466         Vteps vtepCli = new VtepsBuilder().setDpnId(dpnId).setIpAddress(ipAddressObj).withKey(vtepkey).build();
467
468         if (transportZonesHashMap.containsKey(transportZone)) {
469             List<Vteps> vtepListTemp = transportZonesHashMap.get(transportZone);
470             if (vtepListTemp.contains(vtepCli)) {
471                 exists = true; // return true if tzones has vtep
472                 vtepListTemp.remove(vtepCli);
473                 if (vtepListTemp.size() == 0) {
474                     transportZonesHashMap.remove(transportZone);
475                 }
476             } else {
477                 handleError("Vtep has not been configured");
478             }
479         }
480         return exists;
481     }
482
483     public void configureTunnelType(String transportZoneName, String tunnelType) throws ExecutionException,
484             InterruptedException {
485         LOG.debug("configureTunnelType {} for transportZone {}", tunnelType, transportZoneName);
486
487         TransportZone transportZoneFromConfigDS = ItmUtils.getTransportZoneFromConfigDS(transportZoneName, dataBroker);
488         Class<? extends TunnelTypeBase> tunType;
489
490         if (transportZoneFromConfigDS != null) {
491             if (!transportZoneName.equals(ITMConstants.DEFAULT_TRANSPORT_ZONE)) {
492                 LOG.debug("Transport zone {} with tunnel type {} already exists. No action required.",
493                         transportZoneName, tunnelType);
494                 return;
495             } else {
496                 tunnelType = StringUtils.upperCase(tunnelType);
497                 tunType = ItmUtils.TUNNEL_TYPE_MAP.get(tunnelType);
498                 if (Objects.equals(transportZoneFromConfigDS.getTunnelType(), tunType)) {
499                     // default-TZ already exists and tunnel-type is not changed during
500                     // controller restart, then nothing to do now. Just return.
501                     return;
502                 }
503             }
504         }
505
506         // get tunnel-type
507         tunnelType = StringUtils.upperCase(tunnelType);
508         tunType = ItmUtils.TUNNEL_TYPE_MAP.get(tunnelType);
509
510
511         InstanceIdentifier<TransportZones> path = InstanceIdentifier.create(TransportZones.class);
512
513         Optional<TransportZones> tzones = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker);
514
515         TransportZone tzone = new TransportZoneBuilder().withKey(new TransportZoneKey(transportZoneName))
516                 .setTunnelType(tunType).build();
517         List<TransportZone> tzList = new ArrayList<>();
518         if (tzones.isPresent()) {
519             final List<TransportZone> lst = tzones.get().getTransportZone();
520             if (lst != null) {
521                 tzList.addAll(lst);
522             }
523         }
524         tzList.add(tzone);
525         TransportZones transportZones = new TransportZonesBuilder().setTransportZone(tzList).build();
526
527         /*InstanceIdentifier<TransportZone> path = InstanceIdentifier.builder(TransportZones.class).
528         child(TransportZone.class, new TransportZoneKey(transportZoneName)).build();
529
530         TransportZone transportZone = new TransportZoneBuilder().setZoneName(transportZoneName)
531                 .setTunnelType(tunType)
532                 .withKey(new TransportZoneKey(transportZoneName)).build();*/
533
534         txRunner.callWithNewWriteOnlyTransactionAndSubmit(tx -> tx.put(LogicalDatastoreType.CONFIGURATION,
535                 path, transportZones)).get();
536
537     }
538
539     public void configureTunnelMonitorParams(boolean monitorEnabled, String monitorProtocol) {
540         InstanceIdentifier<TunnelMonitorParams> path = InstanceIdentifier.create(TunnelMonitorParams.class);
541         Optional<TunnelMonitorParams> storedTunnelMonitor = ItmUtils.read(LogicalDatastoreType.CONFIGURATION,
542                 path, dataBroker);
543         Class<? extends TunnelMonitoringTypeBase> monitorType ;
544         if (storedTunnelMonitor.isPresent() && storedTunnelMonitor.get().getMonitorProtocol() != null) {
545             monitorType = storedTunnelMonitor.get().getMonitorProtocol();
546         } else {
547             if (monitorProtocol != null && monitorProtocol.equalsIgnoreCase(ITMConstants.MONITOR_TYPE_LLDP)) {
548                 monitorType = TunnelMonitoringTypeLldp.class;
549             } else {
550                 monitorType = TunnelMonitoringTypeBfd.class;
551             }
552         }
553         if (!storedTunnelMonitor.isPresent() || storedTunnelMonitor.get().isEnabled() != monitorEnabled) {
554             TunnelMonitorParams tunnelMonitor = new TunnelMonitorParamsBuilder().setEnabled(monitorEnabled)
555                     .setMonitorProtocol(monitorType).build();
556             Futures.addCallback(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
557                 tx -> tx.merge(path, tunnelMonitor)), ItmUtils.DEFAULT_WRITE_CALLBACK,
558                 MoreExecutors.directExecutor());
559         }
560     }
561
562     public void configureTunnelMonitorInterval(int interval) {
563         InstanceIdentifier<TunnelMonitorInterval> path =
564                 InstanceIdentifier.builder(TunnelMonitorInterval.class).build();
565         Optional<TunnelMonitorInterval> storedTunnelMonitor = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path,
566                 dataBroker);
567         if (!storedTunnelMonitor.isPresent() || storedTunnelMonitor.get().getInterval().toJava() != interval) {
568             TunnelMonitorInterval tunnelMonitor = new TunnelMonitorIntervalBuilder().setInterval(interval).build();
569             Futures.addCallback(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
570                 tx -> tx.merge(path, tunnelMonitor, true)), ItmUtils.DEFAULT_WRITE_CALLBACK,
571                 MoreExecutors.directExecutor());
572         }
573     }
574
575     public void handleError(String errorMessage) throws TepException {
576         throw new TepException(errorMessage);
577     }
578 }