2 * Copyright (c) 2016, 2017 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.genius.itm.listeners;
11 import com.google.common.util.concurrent.FluentFuture;
12 import java.util.ArrayList;
13 import java.util.Collections;
14 import java.util.List;
16 import java.util.Map.Entry;
17 import java.util.Objects;
18 import java.util.Optional;
19 import java.util.concurrent.ConcurrentHashMap;
20 import javax.inject.Inject;
21 import javax.inject.Singleton;
22 import org.eclipse.jdt.annotation.NonNull;
23 import org.opendaylight.genius.cloudscaler.api.TombstonedNodeManager;
24 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
25 import org.opendaylight.genius.infra.Datastore;
26 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
27 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
28 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
29 import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
30 import org.opendaylight.genius.itm.cache.DpnTepStateCache;
31 import org.opendaylight.genius.itm.cache.OfEndPointCache;
32 import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
33 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
34 import org.opendaylight.genius.itm.cache.TunnelStateCache;
35 import org.opendaylight.genius.itm.confighelpers.HwVtep;
36 import org.opendaylight.genius.itm.confighelpers.ItmExternalTunnelAddWorker;
37 import org.opendaylight.genius.itm.confighelpers.ItmInternalTunnelAddWorker;
38 import org.opendaylight.genius.itm.confighelpers.ItmInternalTunnelDeleteWorker;
39 import org.opendaylight.genius.itm.confighelpers.ItmTepAddWorker;
40 import org.opendaylight.genius.itm.confighelpers.ItmTepRemoveWorker;
41 import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedAddWorker;
42 import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedMoveWorker;
43 import org.opendaylight.genius.itm.confighelpers.ItmTepsNotHostedRemoveWorker;
44 import org.opendaylight.genius.itm.globals.ITMConstants;
45 import org.opendaylight.genius.itm.impl.ItmUtils;
46 import org.opendaylight.genius.itm.impl.TunnelMonitoringConfig;
47 import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
48 import org.opendaylight.genius.itm.recovery.impl.ItmServiceRecoveryHandler;
49 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
50 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
51 import org.opendaylight.mdsal.binding.api.DataBroker;
52 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
53 import org.opendaylight.serviceutils.srm.RecoverableListener;
54 import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
55 import org.opendaylight.serviceutils.tools.listener.AbstractSyncDataTreeChangeListener;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.tunnel.end.points.TzMembership;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.NotHostedTransportZones;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZones;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.TransportZonesBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.TepsInNotHostedTransportZone;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.TepsInNotHostedTransportZoneKey;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.tepsinnothostedtransportzone.UnknownVteps;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.tepsinnothostedtransportzone.UnknownVtepsBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.not.hosted.transport.zones.tepsinnothostedtransportzone.UnknownVtepsKey;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.DeviceVteps;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.VtepsKey;
75 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
76 import org.opendaylight.yangtools.yang.common.Uint64;
77 import org.slf4j.Logger;
78 import org.slf4j.LoggerFactory;
81 * This class listens for interface creation/removal/update in Configuration DS.
82 * This is used to handle interfaces for base of-ports.
85 public class TransportZoneListener extends AbstractSyncDataTreeChangeListener<TransportZone>
86 implements RecoverableListener {
88 private static final Logger LOG = LoggerFactory.getLogger(TransportZoneListener.class);
89 private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("GeniusEventLogger");
91 private final DataBroker dataBroker;
92 private final JobCoordinator jobCoordinator;
93 private final IMdsalApiManager mdsalManager;
94 private final ItmConfig itmConfig;
95 private final ItmInternalTunnelDeleteWorker itmInternalTunnelDeleteWorker;
96 private final ItmInternalTunnelAddWorker itmInternalTunnelAddWorker;
97 private final ItmExternalTunnelAddWorker externalTunnelAddWorker;
98 private final DPNTEPsInfoCache dpnTEPsInfoCache;
99 private final ManagedNewTransactionRunner txRunner;
100 private final DataTreeEventCallbackRegistrar eventCallbacks;
101 private final TombstonedNodeManager tombstonedNodeManager;
104 public TransportZoneListener(final DataBroker dataBroker,
105 final IMdsalApiManager mdsalManager,
106 final ItmConfig itmConfig, final JobCoordinator jobCoordinator,
107 final TunnelMonitoringConfig tunnelMonitoringConfig,
108 final DPNTEPsInfoCache dpnTEPsInfoCache,
109 final TunnelStateCache tunnelStateCache,
110 final DirectTunnelUtils directTunnelUtils,
111 final DpnTepStateCache dpnTepStateCache, final OvsBridgeEntryCache ovsBridgeEntryCache,
112 final OvsBridgeRefEntryCache ovsBridgeRefEntryCache,
113 final IInterfaceManager interfaceManager,
114 final OfEndPointCache ofEndPointCache,
115 final ServiceRecoveryRegistry serviceRecoveryRegistry,
116 final DataTreeEventCallbackRegistrar eventCallbacks,
117 final TombstonedNodeManager tombstonedNodeManager) {
118 super(dataBroker, LogicalDatastoreType.CONFIGURATION,
119 InstanceIdentifier.create(TransportZones.class).child(TransportZone.class));
120 this.dataBroker = dataBroker;
121 this.jobCoordinator = jobCoordinator;
122 this.mdsalManager = mdsalManager;
123 this.itmConfig = itmConfig;
124 this.dpnTEPsInfoCache = dpnTEPsInfoCache;
125 this.tombstonedNodeManager = tombstonedNodeManager;
126 this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
127 this.eventCallbacks = eventCallbacks;
129 this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
130 tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
131 ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils, ofEndPointCache, itmConfig,
132 tombstonedNodeManager);
133 this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
134 tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
135 ovsBridgeRefEntryCache, ofEndPointCache, eventCallbacks);
136 this.externalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig, dpnTEPsInfoCache);
137 serviceRecoveryRegistry.addRecoverableListener(ItmServiceRecoveryHandler.getServiceRegistryKey(),
142 public void registerListener() {
147 public void deregisterListener() {
151 @SuppressWarnings("checkstyle:IllegalCatch")
152 private void initializeTZNode() {
153 InstanceIdentifier<TransportZones> path = InstanceIdentifier.create(TransportZones.class);
154 txRunner.callWithNewReadWriteTransactionAndSubmit(Datastore.CONFIGURATION, tx -> {
155 FluentFuture<Boolean> tzones = tx.exists(path);
157 TransportZonesBuilder tzb = new TransportZonesBuilder();
158 tx.put(path, tzb.build());
164 public void remove(@NonNull InstanceIdentifier<TransportZone> instanceIdentifier,
165 @NonNull TransportZone transportZone) {
166 LOG.debug("Received Transport Zone Remove Event: {}", transportZone);
167 boolean allowTunnelDeletion;
169 // check if TZ received for removal is default-transport-zone,
170 // if yes, then check if it is received from northbound, then
171 // do not entertain request and skip tunnels remove operation
172 // if def-tz removal request is due to def-tz-enabled flag is disabled or
173 // due to change in def-tz-tunnel-type, then allow def-tz tunnels deletion
174 if (ITMConstants.DEFAULT_TRANSPORT_ZONE.equalsIgnoreCase(transportZone.getZoneName())) {
175 // Get TunnelTypeBase object for tunnel-type configured in config file
176 Class<? extends TunnelTypeBase> tunType = ItmUtils.getTunnelType(itmConfig.getDefTzTunnelType());
178 if (!itmConfig.isDefTzEnabled() || !Objects.equals(transportZone.getTunnelType(), tunType)) {
179 allowTunnelDeletion = true;
181 // this is case when def-tz removal request is from Northbound.
182 allowTunnelDeletion = false;
183 LOG.error("Deletion of {} is an incorrect usage",ITMConstants.DEFAULT_TRANSPORT_ZONE);
186 allowTunnelDeletion = true;
189 if (allowTunnelDeletion) {
190 //TODO : DPList code can be refactor with new specific class
191 // which implement TransportZoneValidator
192 EVENT_LOGGER.debug("ITM-Transportzone,TunnelDeletion {}", transportZone.getZoneName());
193 List<DPNTEPsInfo> opDpnList = createDPNTepInfo(transportZone);
194 List<HwVtep> hwVtepList = createhWVteps(transportZone);
195 LOG.trace("Delete: Invoking deleteTunnels in ItmManager with DpnList {}", opDpnList);
196 if (!opDpnList.isEmpty() || !hwVtepList.isEmpty()) {
197 LOG.trace("Delete: Invoking ItmManager with hwVtep List {} ", hwVtepList);
198 jobCoordinator.enqueueJob(transportZone.getZoneName(),
199 new ItmTepRemoveWorker(opDpnList, hwVtepList, transportZone, mdsalManager,
200 itmInternalTunnelDeleteWorker, dpnTEPsInfoCache, txRunner, itmConfig));
202 if (transportZone.getVteps() != null && !transportZone.getVteps().isEmpty()) {
203 List<UnknownVteps> unknownVteps = convertVtepListToUnknownVtepList(transportZone.getVteps());
204 LOG.trace("Moving Transport Zone {} to tepsInNotHostedTransportZone Oper Ds.",
205 transportZone.getZoneName());
206 jobCoordinator.enqueueJob(transportZone.getZoneName(),
207 new ItmTepsNotHostedAddWorker(unknownVteps, transportZone.getZoneName(),
208 dataBroker, txRunner));
215 public void update(@NonNull InstanceIdentifier<TransportZone> instanceIdentifier,
216 @NonNull TransportZone originalTransportZone, @NonNull TransportZone updatedTransportZone) {
217 LOG.debug("Received Transport Zone Update Event: Old - {}, Updated - {}", originalTransportZone,
218 updatedTransportZone);
219 EVENT_LOGGER.debug("ITM-Transportzone,UPDATE {}", updatedTransportZone.getZoneName());
220 List<DPNTEPsInfo> oldDpnTepsList = createDPNTepInfo(originalTransportZone);
221 List<DPNTEPsInfo> newDpnTepsList = createDPNTepInfo(updatedTransportZone);
222 List<DPNTEPsInfo> oldDpnTepsListcopy = new ArrayList<>();
223 oldDpnTepsListcopy.addAll(oldDpnTepsList);
224 LOG.trace("oldcopy0 {}", oldDpnTepsListcopy);
225 List<DPNTEPsInfo> newDpnTepsListcopy = new ArrayList<>();
226 newDpnTepsListcopy.addAll(newDpnTepsList);
227 LOG.trace("newcopy0 {}", newDpnTepsListcopy);
229 oldDpnTepsList.removeAll(newDpnTepsListcopy);
230 newDpnTepsList.removeAll(oldDpnTepsListcopy);
232 LOG.trace("oldDpnTepsList {}", oldDpnTepsList);
233 LOG.trace("newDpnTepsList {}", newDpnTepsList);
234 LOG.trace("oldcopy {}", oldDpnTepsListcopy);
235 LOG.trace("newcopy {}", newDpnTepsListcopy);
236 LOG.trace("oldcopy Size {}", oldDpnTepsList.size());
237 LOG.trace("newcopy Size {}", newDpnTepsList.size());
239 boolean equalLists = newDpnTepsList.size() == oldDpnTepsList.size()
240 && newDpnTepsList.containsAll(oldDpnTepsList);
241 LOG.trace("Is List Duplicate {} ", equalLists);
242 if (!newDpnTepsList.isEmpty() && !equalLists) {
243 LOG.trace("Adding TEPs ");
244 jobCoordinator.enqueueJob(updatedTransportZone.getZoneName(),
245 new ItmTepAddWorker(newDpnTepsList, Collections.emptyList(), dataBroker, mdsalManager,
246 itmInternalTunnelAddWorker, externalTunnelAddWorker));
248 if (!oldDpnTepsList.isEmpty() && !equalLists) {
249 LOG.trace("Removing TEPs ");
250 jobCoordinator.enqueueJob(updatedTransportZone.getZoneName(),
251 new ItmTepRemoveWorker(oldDpnTepsList, Collections.emptyList(), originalTransportZone, mdsalManager,
252 itmInternalTunnelDeleteWorker, dpnTEPsInfoCache, txRunner, itmConfig));
254 List<HwVtep> oldHwList = createhWVteps(originalTransportZone);
255 List<HwVtep> newHwList = createhWVteps(updatedTransportZone);
256 List<HwVtep> oldHwListcopy = new ArrayList<>();
257 oldHwListcopy.addAll(oldHwList);
258 LOG.trace("oldHwListcopy0 {}", oldHwListcopy);
259 List<HwVtep> newHwListcopy = new ArrayList<>();
260 newHwListcopy.addAll(newHwList);
261 LOG.trace("newHwListcopy0 {}", newHwListcopy);
263 oldHwList.removeAll(newHwListcopy);
264 newHwList.removeAll(oldHwListcopy);
265 LOG.trace("oldHwList {}", oldHwList);
266 LOG.trace("newHwList {}", newHwList);
267 LOG.trace("oldHwListcopy {}", oldHwListcopy);
268 LOG.trace("newHwListcopy {}", newHwListcopy);
269 if (!newHwList.isEmpty()) {
270 LOG.trace("Adding HW TEPs ");
271 jobCoordinator.enqueueJob(updatedTransportZone.getZoneName(), new ItmTepAddWorker(Collections.emptyList(),
272 newHwList, dataBroker, mdsalManager, itmInternalTunnelAddWorker, externalTunnelAddWorker));
274 if (!oldHwList.isEmpty()) {
275 LOG.trace("Removing HW TEPs ");
276 jobCoordinator.enqueueJob(updatedTransportZone.getZoneName(),
277 new ItmTepRemoveWorker(Collections.emptyList(), oldHwList, originalTransportZone, mdsalManager,
278 itmInternalTunnelDeleteWorker, dpnTEPsInfoCache, txRunner, itmConfig));
283 public void add(@NonNull TransportZone transportZone) {
284 LOG.debug("Received Transport Zone Add Event: {}", transportZone);
285 EVENT_LOGGER.debug("ITM-Transportzone,ADD {}", transportZone.getZoneName());
286 List<DPNTEPsInfo> opDpnList = createDPNTepInfo(transportZone);
287 //avoiding adding duplicates from nothosted to new dpnlist.
288 List<DPNTEPsInfo> duplicateFound = new ArrayList<>();
289 List<DPNTEPsInfo> notHostedDpnList = getDPNTepInfoFromNotHosted(transportZone, opDpnList);
290 for (DPNTEPsInfo notHostedDPN:notHostedDpnList) {
291 for (DPNTEPsInfo newlyAddedDPN:opDpnList) {
292 if (newlyAddedDPN.getDPNID().compareTo(notHostedDPN.getDPNID()) == 0
293 || newlyAddedDPN.getTunnelEndPoints().get(0).getIpAddress()
294 .equals(notHostedDPN.getTunnelEndPoints().get(0).getIpAddress())) {
295 duplicateFound.add(notHostedDPN);
299 notHostedDpnList.removeAll(duplicateFound);
300 opDpnList.addAll(notHostedDpnList);
302 List<HwVtep> hwVtepList = createhWVteps(transportZone);
303 LOG.trace("Add: Operational dpnTepInfo - Before invoking ItmManager {}", opDpnList);
304 if (!opDpnList.isEmpty() || !hwVtepList.isEmpty()) {
305 LOG.trace("Add: Invoking ItmManager with DPN List {} ", opDpnList);
306 LOG.trace("Add: Invoking ItmManager with hwVtep List {} ", hwVtepList);
307 jobCoordinator.enqueueJob(transportZone.getZoneName(),
308 new ItmTepAddWorker(opDpnList, hwVtepList, dataBroker, mdsalManager, itmInternalTunnelAddWorker,
309 externalTunnelAddWorker));
313 private List<DPNTEPsInfo> getDPNTepInfoFromNotHosted(TransportZone tzNew, List<DPNTEPsInfo> opDpnList) {
314 List<DPNTEPsInfo> notHostedOpDpnList = new ArrayList<>();
315 if (isNewTZExistInNotHostedTZ(tzNew)) {
316 notHostedOpDpnList = createDPNTepInfoFromNotHosted(tzNew, opDpnList);
318 return notHostedOpDpnList;
321 private List<DPNTEPsInfo> createDPNTepInfoFromNotHosted(TransportZone tzNew, List<DPNTEPsInfo> opDpnList) {
322 Map<Uint64, List<TunnelEndPoints>> mapNotHostedDPNToTunnelEndpt = new ConcurrentHashMap<>();
323 List<DPNTEPsInfo> notHostedDpnTepInfo = new ArrayList<>();
324 String newZoneName = tzNew.getZoneName();
325 List<TzMembership> zones = ItmUtils.createTransportZoneMembership(newZoneName);
326 Class<? extends TunnelTypeBase> tunnelType = tzNew.getTunnelType();
328 TepsInNotHostedTransportZone tepsInNotHostedTransportZone = getNotHostedTransportZone(newZoneName).get();
329 if (tepsInNotHostedTransportZone == null) {
330 return notHostedDpnTepInfo;
332 List<UnknownVteps> unVtepsLst = tepsInNotHostedTransportZone.getUnknownVteps();
333 List<Vteps> vtepsList = new ArrayList<>();
334 if (unVtepsLst != null && !unVtepsLst.isEmpty()) {
335 for (UnknownVteps vteps : unVtepsLst) {
336 Uint64 dpnID = vteps.getDpnId();
337 IpAddress ipAddress = vteps.getIpAddress();
338 String portName = itmConfig.getPortname() == null ? ITMConstants.DUMMY_PORT : itmConfig.getPortname();
339 int vlanId = itmConfig.getVlanId() != null ? itmConfig.getVlanId().toJava()
340 : ITMConstants.DUMMY_VLANID;
341 boolean useOfTunnel = ItmUtils.falseIfNull(vteps.isOfTunnel());
342 String tos = vteps.getOptionTunnelTos();
344 tos = itmConfig.getDefaultTunnelTos();
346 TunnelEndPoints tunnelEndPoints =
347 ItmUtils.createTunnelEndPoints(dpnID, ipAddress, portName, useOfTunnel, vlanId, zones,
349 List<TunnelEndPoints> tunnelEndPointsList = mapNotHostedDPNToTunnelEndpt.get(dpnID);
350 if (tunnelEndPointsList != null) {
351 tunnelEndPointsList.add(tunnelEndPoints);
353 tunnelEndPointsList = new ArrayList<>();
354 tunnelEndPointsList.add(tunnelEndPoints);
355 mapNotHostedDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
357 Vteps newVtep = createVtepFromUnKnownVteps(dpnID,ipAddress);
358 vtepsList.add(newVtep);
360 // Enqueue 'remove TEP from TepsNotHosted list' operation
361 // into DataStoreJobCoordinator
362 jobCoordinator.enqueueJob(newZoneName,
363 new ItmTepsNotHostedRemoveWorker(newZoneName, ipAddress, dpnID, dataBroker, txRunner));
366 //avoiding duplicate vteps which are already present in dpn list pushed from NBI
367 List<Vteps> foundDuplicatevtepsList = new ArrayList<>();
368 for (Vteps notHostedVteps:vtepsList) {
369 for (DPNTEPsInfo newlyAddedDPN:opDpnList) {
370 if (notHostedVteps.getDpnId().compareTo(newlyAddedDPN.getDPNID()) == 0
371 || newlyAddedDPN.getTunnelEndPoints().get(0).getIpAddress()
372 .equals(notHostedVteps.getIpAddress())) {
373 foundDuplicatevtepsList.add(notHostedVteps);
377 vtepsList.removeAll(foundDuplicatevtepsList);
379 // Enqueue 'add TEP received from southbound OVSDB into ITM config DS' operation
380 // into DataStoreJobCoordinator
381 jobCoordinator.enqueueJob(newZoneName, new ItmTepsNotHostedMoveWorker(vtepsList, newZoneName, txRunner));
383 if (mapNotHostedDPNToTunnelEndpt.size() > 0) {
384 for (Entry<Uint64, List<TunnelEndPoints>> entry: mapNotHostedDPNToTunnelEndpt.entrySet()) {
385 DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(entry.getKey(), entry.getValue());
386 notHostedDpnTepInfo.add(newDpnTepsInfo);
389 return notHostedDpnTepInfo;
393 private Vteps createVtepFromUnKnownVteps(Uint64 dpnID, IpAddress ipAddress) {
394 VtepsKey vtepkey = new VtepsKey(dpnID);
395 Vteps vtepObj = new VtepsBuilder().setDpnId(dpnID).setIpAddress(ipAddress).withKey(vtepkey)
400 private List<UnknownVteps> convertVtepListToUnknownVtepList(List<Vteps> vteps) {
401 List<UnknownVteps> unknownVtepsList = new ArrayList<>();
402 for (Vteps vtep : vteps) {
403 UnknownVtepsKey vtepkey = new UnknownVtepsKey(vtep.getDpnId());
404 UnknownVteps vtepObj =
405 new UnknownVtepsBuilder().setDpnId(vtep.getDpnId()).setIpAddress(vtep.getIpAddress())
406 .withKey(vtepkey).setOfTunnel(vtep.isOptionOfTunnel()).build();
407 unknownVtepsList.add(vtepObj);
409 return unknownVtepsList;
412 private boolean isNewTZExistInNotHostedTZ(TransportZone tzNew) {
413 boolean isPresent = false;
414 if (getNotHostedTransportZone(tzNew.getZoneName()).isPresent()) {
420 public Optional<TepsInNotHostedTransportZone> getNotHostedTransportZone(String transportZoneName) {
421 InstanceIdentifier<TepsInNotHostedTransportZone> notHostedTzPath = InstanceIdentifier
422 .builder(NotHostedTransportZones.class).child(TepsInNotHostedTransportZone.class,
423 new TepsInNotHostedTransportZoneKey(transportZoneName)).build();
424 Optional<TepsInNotHostedTransportZone> tepsInNotHostedTransportZoneOptional =
425 ItmUtils.read(LogicalDatastoreType.OPERATIONAL, notHostedTzPath, dataBroker);
426 return tepsInNotHostedTransportZoneOptional;
429 private List<DPNTEPsInfo> createDPNTepInfo(TransportZone transportZone) {
431 Map<Uint64, List<TunnelEndPoints>> mapDPNToTunnelEndpt = new ConcurrentHashMap<>();
432 List<DPNTEPsInfo> dpnTepInfo = new ArrayList<>();
433 List<TzMembership> zones = ItmUtils.createTransportZoneMembership(transportZone.getZoneName());
434 Class<? extends TunnelTypeBase> tunnelType = transportZone.getTunnelType();
435 LOG.trace("Transport Zone_name: {}", transportZone.getZoneName());
436 List<Vteps> vtepsList = transportZone.getVteps();
438 String portName = itmConfig.getPortname() == null ? ITMConstants.DUMMY_PORT : itmConfig.getPortname();
439 int vlanId = itmConfig.getVlanId() != null ? itmConfig.getVlanId().toJava() : ITMConstants.DUMMY_VLANID;
441 if (vtepsList != null && !vtepsList.isEmpty()) {
442 for (Vteps vteps : vtepsList) {
443 Uint64 dpnID = vteps.getDpnId();
444 IpAddress ipAddress = vteps.getIpAddress();
445 boolean useOfTunnel = itmConfig.isUseOfTunnels();
446 String tos = vteps.getOptionTunnelTos();
448 tos = itmConfig.getDefaultTunnelTos();
450 LOG.trace("DpnID: {}, ipAddress: {}", dpnID, ipAddress);
451 TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(dpnID, ipAddress, portName,
452 useOfTunnel, vlanId, zones, tunnelType, tos);
453 EVENT_LOGGER.debug("ITM-createDPNTepInfo for {} {}", dpnID, ipAddress);
454 List<TunnelEndPoints> tunnelEndPointsList = mapDPNToTunnelEndpt.get(dpnID);
455 if (tunnelEndPointsList != null) {
456 LOG.trace("Existing DPN info list in the Map: {} ", dpnID);
457 tunnelEndPointsList.add(tunnelEndPoints);
459 LOG.trace("Adding new DPN info list to the Map: {} ", dpnID);
460 tunnelEndPointsList = new ArrayList<>();
461 tunnelEndPointsList.add(tunnelEndPoints);
462 mapDPNToTunnelEndpt.put(dpnID, tunnelEndPointsList);
468 if (!mapDPNToTunnelEndpt.isEmpty()) {
469 LOG.trace("List of dpns in the Map: {} ", mapDPNToTunnelEndpt.keySet());
470 for (Entry<Uint64, List<TunnelEndPoints>> entry : mapDPNToTunnelEndpt.entrySet()) {
471 DPNTEPsInfo newDpnTepsInfo = ItmUtils.createDPNTepInfo(entry.getKey(), entry.getValue());
472 dpnTepInfo.add(newDpnTepsInfo);
478 private List<HwVtep> createhWVteps(TransportZone transportZone) {
479 List<HwVtep> hwVtepsList = new ArrayList<>();
481 String zoneName = transportZone.getZoneName();
482 Class<? extends TunnelTypeBase> tunnelType = transportZone.getTunnelType();
483 LOG.trace("Transport Zone_name: {}", zoneName);
484 List<DeviceVteps> deviceVtepsList = transportZone.getDeviceVteps();
485 if (deviceVtepsList != null) {
486 for (DeviceVteps vteps : deviceVtepsList) {
487 String topologyId = vteps.getTopologyId();
488 String nodeId = vteps.getNodeId();
489 IpAddress ipAddress = vteps.getIpAddress();
490 LOG.trace("topo-id: {}, node-id: {}, ipAddress: {}", topologyId, nodeId, ipAddress);
491 HwVtep hwVtep = ItmUtils.createHwVtepObject(topologyId, nodeId, ipAddress,
492 tunnelType, transportZone);
494 LOG.trace("Adding new HwVtep {} info ", hwVtep.getHwIp());
495 hwVtepsList.add(hwVtep);
498 LOG.trace("returning hwvteplist {}", hwVtepsList);