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 java.time.Duration;
12 import java.util.List;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.eclipse.jdt.annotation.Nullable;
18 import org.opendaylight.genius.datastoreutils.listeners.DataTreeEventCallbackRegistrar;
19 import org.opendaylight.genius.itm.commons.OvsdbTepInfo;
20 import org.opendaylight.genius.itm.confighelpers.OvsdbTepAddWorker;
21 import org.opendaylight.genius.itm.confighelpers.OvsdbTepRemoveWorker;
22 import org.opendaylight.genius.itm.globals.ITMConstants;
23 import org.opendaylight.genius.itm.impl.ItmUtils;
24 import org.opendaylight.genius.mdsalutil.MDSALUtil;
25 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
26 import org.opendaylight.mdsal.binding.api.DataBroker;
27 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
28 import org.opendaylight.serviceutils.tools.listener.AbstractSyncDataTreeChangeListener;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406.ItmConfig;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfoKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.tunnel.end.points.TzMembership;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchExternalIds;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchExternalIdsKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigs;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.OpenvswitchOtherConfigsKey;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
49 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
50 import org.opendaylight.yangtools.yang.common.Uint64;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
55 * This class listens for OvsdbNode creation/removal/update in Network Topology Operational DS.
56 * This is used to handle add/update/remove of TEPs of switches into/from ITM.
59 public class OvsdbNodeListener extends AbstractSyncDataTreeChangeListener<Node> {
61 private static final Logger LOG = LoggerFactory.getLogger(OvsdbNodeListener.class);
63 private final DataBroker dataBroker;
64 private final JobCoordinator jobCoordinator;
65 private final ItmConfig itmConfig;
66 private final DataTreeEventCallbackRegistrar eventCallbacks;
69 public OvsdbNodeListener(DataBroker dataBroker, ItmConfig itmConfig, JobCoordinator jobCoordinator,
70 DataTreeEventCallbackRegistrar eventCallbacks,
71 final IdManagerService idManagerService) {
72 super(dataBroker, LogicalDatastoreType.OPERATIONAL,
73 InstanceIdentifier.create(NetworkTopology.class).child(Topology.class).child(Node.class));
74 this.dataBroker = dataBroker;
75 this.jobCoordinator = jobCoordinator;
76 this.itmConfig = itmConfig;
77 this.eventCallbacks = eventCallbacks;
81 public void add(@NonNull InstanceIdentifier<Node> instanceIdentifier, @NonNull Node ovsdbNodeNew) {
82 String bridgeName = null;
84 OvsdbNodeAugmentation ovsdbNewNodeAugmentation = null;
86 LOG.trace("OvsdbNodeListener called for Ovsdb Node ({}) Add.", ovsdbNodeNew.getNodeId().getValue());
88 // check for OVS bridge node
89 OvsdbBridgeAugmentation ovsdbNewBridgeAugmentation = ovsdbNodeNew
90 .augmentation(OvsdbBridgeAugmentation.class);
92 if (ovsdbNewBridgeAugmentation != null) {
93 processBridgeUpdate(ovsdbNewBridgeAugmentation, true);
98 public void remove(@NonNull InstanceIdentifier<Node> instanceIdentifier, @NonNull Node removedDataObject) {
99 LOG.trace("OvsdbNodeListener called for Ovsdb Node {} Remove.", removedDataObject);
100 processBridgeUpdate(removedDataObject, false);
104 public void update(@NonNull InstanceIdentifier<Node> instanceIdentifier, @NonNull Node originalOvsdbNode,
105 @NonNull Node updatedOvsdbNode) {
106 String newLocalIp = null;
107 String oldLocalIp = null;
108 String tzName = null;
109 String oldTzName = null;
110 String oldDpnBridgeName = null;
111 String newDpnBridgeName = null;
112 boolean newOfTunnel = false;
113 boolean isTepInfoUpdated = false;
114 boolean isTepInfoDeleted = false;
115 boolean isLocalIpAdded = false;
116 boolean isLocalIpRemoved = false;
117 boolean isLocalIpUpdated = false;
118 boolean isTzChanged = false;
119 boolean isDpnBrChanged = false;
121 LOG.trace("OvsdbNodeListener called for Ovsdb Node ({}) Update.", originalOvsdbNode.getNodeId().getValue());
123 // If this is a bridge update, see if dpid was added. If so, need to
124 // addTep, as TEP would not be added in node add case above
125 if (isBridgeDpIdAdded(originalOvsdbNode, updatedOvsdbNode)) {
126 processBridgeUpdate(updatedOvsdbNode, true);
130 // get OVSDB TEP info from old ovsdb node
131 OvsdbTepInfo newTepInfoObj = getOvsdbTepInfo(
132 updatedOvsdbNode.augmentation(OvsdbNodeAugmentation.class));
134 // get OVSDB TEP info from new ovsdb node
135 OvsdbTepInfo oldTepInfoObj = getOvsdbTepInfo(
136 originalOvsdbNode.augmentation(OvsdbNodeAugmentation.class));
138 if (oldTepInfoObj == null && newTepInfoObj == null) {
139 LOG.trace("Tep Info is not received in old and new Ovsdb Nodes.");
143 if (oldTepInfoObj != null && newTepInfoObj == null) {
144 isTepInfoDeleted = true;
145 LOG.trace("Tep Info is deleted from Ovsdb node: {}", originalOvsdbNode.getNodeId().getValue());
148 // store TEP info required parameters
149 if (newTepInfoObj != null) {
150 tzName = newTepInfoObj.getTzName();
151 newLocalIp = newTepInfoObj.getLocalIp();
152 newDpnBridgeName = newTepInfoObj.getBrName();
153 newOfTunnel = newTepInfoObj.getOfTunnel();
156 if (oldTepInfoObj != null) {
157 oldLocalIp = oldTepInfoObj.getLocalIp();
158 oldDpnBridgeName = oldTepInfoObj.getBrName();
159 oldTzName = oldTepInfoObj.getTzName();
162 // handle case when TEP parameters are not configured from switch side
163 if (newLocalIp == null && oldLocalIp == null) {
164 LOG.trace("TEP info Local IP parameters are not specified in old and new Ovsdb Nodes.");
168 if (!isTepInfoDeleted) {
169 isLocalIpRemoved = isLocalIpRemoved(oldLocalIp, newLocalIp);
170 isLocalIpAdded = isLocalIpAdded(oldLocalIp, newLocalIp);
171 isLocalIpUpdated = isLocalIpUpdated(oldLocalIp, newLocalIp);
173 if (isLocalIpAdded || isLocalIpRemoved || isLocalIpUpdated) {
174 isTepInfoUpdated = true;
176 if (isTzUpdated(oldTzName, tzName)) {
177 isTepInfoUpdated = true;
178 if (oldLocalIp != null && newLocalIp != null) {
180 LOG.trace("tzname is changed from {} to {} for Local IP: {}", oldTzName, tzName, newLocalIp);
183 if (isDpnUpdated(oldDpnBridgeName, newDpnBridgeName)) {
184 isTepInfoUpdated = true;
185 if (oldLocalIp != null && newLocalIp != null) {
186 isDpnBrChanged = true;
187 LOG.trace("dpn-br-name is changed from {} to {} for Local IP: {}", oldDpnBridgeName,
188 newDpnBridgeName, newLocalIp);
192 if (!isTepInfoUpdated) {
193 LOG.trace("Old TEP (local-ip: {}, tz-name: {}) and New TEP (local-ip: {}, tz-name: {}). "
194 + "No updates in the TEP Info parameters. Nothing to do.", oldLocalIp, oldTzName,
200 LOG.trace("TepInfo state change flags (isTepInfoUpdated: {}, isTepInfoDeleted: {}, isLocalIpRemoved: {},"
201 + "isLocalIpAdded: {}, isLocalIpUpdated: {}, isTzChanged:{}, isDpnBrChanged: {})",
202 isTepInfoUpdated, isTepInfoDeleted, isLocalIpRemoved, isLocalIpAdded, isLocalIpUpdated,
203 isTzChanged, isDpnBrChanged);
205 String jobKey = oldLocalIp;
206 // handle TEP-remove in remove case, tep-ip update case, TZ change case, Bridge change case
207 if (isTepInfoDeleted || isLocalIpRemoved || isTzChanged || isDpnBrChanged || isLocalIpUpdated) {
208 // TBD: Move this time taking operations into DataStoreJobCoordinator
209 String strOldDpnId = ItmUtils.getBridgeDpid(originalOvsdbNode, oldDpnBridgeName, dataBroker);
210 if (strOldDpnId == null || strOldDpnId.isEmpty()) {
211 LOG.error("TEP {} cannot be deleted. DPID for bridge {} is NULL.", oldLocalIp, oldDpnBridgeName);
214 addOrRemoveTep(oldTzName, strOldDpnId, jobKey, oldLocalIp, oldDpnBridgeName, false, false);
216 // handle TEP-add in add case, tep-ip update case, TZ change case, Bridge change case
217 if (isLocalIpAdded || isTzChanged || isDpnBrChanged || isLocalIpUpdated) {
218 // TBD: Move this time taking operations into DataStoreJobCoordinator
219 String strNewDpnId = ItmUtils.getBridgeDpid(updatedOvsdbNode, newDpnBridgeName, dataBroker);
220 if (strNewDpnId == null || strNewDpnId.isEmpty()) {
221 LOG.error("TEP {} cannot be added. DPID for bridge {} is NULL.", newLocalIp, newDpnBridgeName);
225 * Special handling for TEP movement from one TZ to another TZ
226 * Register for DpnTepsInfo remove event to make sure TEP remove is happened through ITM internal logic,
227 * then after perform TEP addition into updated TZ
230 IpAddress tepIpAddress = IpAddressBuilder.getDefaultInstance(newLocalIp);
231 Uint64 dpnId = MDSALUtil.getDpnId(strNewDpnId);
232 String tos = itmConfig.getDefaultTunnelTos();
233 Class<? extends TunnelTypeBase> tunnelType = TunnelTypeVxlan.class;
234 List<TzMembership> zones = ItmUtils.createTransportZoneMembership(oldTzName);
236 String portName = itmConfig.getPortname() == null ? ITMConstants.DUMMY_PORT : itmConfig.getPortname();
237 int vlanId = itmConfig.getVlanId() != null ? itmConfig.getVlanId().toJava()
238 : ITMConstants.DUMMY_VLANID;
240 TunnelEndPoints tunnelEndPoints = ItmUtils.createDummyTunnelEndPoints(dpnId, tepIpAddress, newOfTunnel,
241 tos, zones, tunnelType, portName, vlanId);
242 String finalTzName = tzName;
243 String finalJobKey = jobKey;
244 String finalLocalIp = newLocalIp;
245 String finalDpnBridgeName = newDpnBridgeName;
246 boolean finalOfTunnel = newOfTunnel;
248 InstanceIdentifier<TunnelEndPoints> tunnelEndPointsIdentifier =
249 InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class,
250 new DPNTEPsInfoKey(dpnId)).child(TunnelEndPoints.class, tunnelEndPoints.key()).build();
251 eventCallbacks.onRemove(LogicalDatastoreType.CONFIGURATION, tunnelEndPointsIdentifier, (unused) -> {
252 LOG.info("TZ movement case: callback event for a deletion of {} from DpnTepsInfo.", dpnId);
253 addOrRemoveTep(finalTzName, strNewDpnId, finalJobKey, finalLocalIp,
254 finalDpnBridgeName, finalOfTunnel, true);
255 return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
256 }, Duration.ofMillis(5000), (id) -> {
257 LOG.info("TZ movement case: callback event timed-out for a deletion of {} from DpnTepsInfo.",
259 addOrRemoveTep(finalTzName, strNewDpnId, finalJobKey, finalLocalIp,
260 finalDpnBridgeName, finalOfTunnel, true);
263 jobKey = isLocalIpUpdated ? oldLocalIp : newLocalIp;
264 addOrRemoveTep(tzName, strNewDpnId, jobKey, newLocalIp, newDpnBridgeName, newOfTunnel, true);
269 private void addOrRemoveTep(String tzName, String strDpnId, String jobKey, String localIp, String bridgeName,
270 boolean newOfTunnel, boolean isTepAdd) {
271 // check if defTzEnabled flag is false in config file,
272 // if flag is OFF, then no need to add TEP into ITM config DS.
273 if (tzName == null || tzName.equals(ITMConstants.DEFAULT_TRANSPORT_ZONE)) {
274 boolean defTzEnabled = itmConfig.isDefTzEnabled();
277 LOG.info("TEP ({}) cannot be added into {} when def-tz-enabled flag is false.", localIp,
278 ITMConstants.DEFAULT_TRANSPORT_ZONE);
280 LOG.info("TEP ({}) cannot be removed from {} when def-tz-enabled flag is false.", localIp,
281 ITMConstants.DEFAULT_TRANSPORT_ZONE);
285 tzName = ITMConstants.DEFAULT_TRANSPORT_ZONE;
290 LOG.trace("Update case: Adding TEP-IP: {}, TZ name: {}, Bridge Name: {}, Bridge DPID: {}, of-tunnel: {}",
291 localIp, tzName, bridgeName, strDpnId, newOfTunnel);
293 // Enqueue 'add TEP into new TZ' operation into DataStoreJobCoordinator
294 jobCoordinator.enqueueJob(jobKey,
295 new OvsdbTepAddWorker(localIp, strDpnId, tzName, newOfTunnel, dataBroker));
298 LOG.trace("Update case: Removing TEP-IP: {}, TZ name: {}, Bridge Name: {}, Bridge DPID: {}", localIp,
299 tzName, bridgeName, strDpnId);
301 // Enqueue 'remove TEP from TZ' operation into DataStoreJobCoordinator
302 jobCoordinator.enqueueJob(jobKey, new OvsdbTepRemoveWorker(localIp, strDpnId, tzName, dataBroker));
306 private boolean isLocalIpRemoved(String oldTepIp, String newTepIp) {
307 return oldTepIp != null && newTepIp == null;
310 private boolean isLocalIpAdded(String oldTepIp, String newTepIp) {
311 return oldTepIp == null && newTepIp != null;
314 private boolean isLocalIpUpdated(String oldTepIp, String newTepIp) {
315 return oldTepIp != null && newTepIp != null && !oldTepIp.equals(newTepIp);
318 private boolean isTzUpdated(String oldTzName, String tzName) {
319 return oldTzName == null && tzName != null || oldTzName != null && tzName == null
320 || oldTzName != null && !oldTzName.equals(tzName);
323 private boolean isDpnUpdated(String oldDpnBridgeName, String dpnBridgeName) {
324 return oldDpnBridgeName == null && dpnBridgeName != null || oldDpnBridgeName != null && dpnBridgeName == null
325 || oldDpnBridgeName != null && !oldDpnBridgeName.equals(dpnBridgeName);
328 private boolean isBridgeDpIdAdded(Node ovsdbNodeOld, Node ovsdbNodeNew) {
329 String oldBridgeName = null;
330 String oldDpId = null;
331 String newDpId = null;
333 OvsdbBridgeAugmentation ovsdbNewBridgeAugmentation =
334 ovsdbNodeNew.augmentation(OvsdbBridgeAugmentation.class);
335 if (ovsdbNewBridgeAugmentation != null) {
336 // Read DPID from OVSDBBridgeAugmentation
337 newDpId = ItmUtils.getStrDatapathId(ovsdbNewBridgeAugmentation);
340 OvsdbBridgeAugmentation ovsdbOldBridgeAugmentation =
341 ovsdbNodeOld.augmentation(OvsdbBridgeAugmentation.class);
342 if (ovsdbOldBridgeAugmentation != null) {
343 oldBridgeName = ovsdbNewBridgeAugmentation.getBridgeName().getValue();
344 // Read DPID from OVSDBBridgeAugmentation
345 oldDpId = ItmUtils.getStrDatapathId(ovsdbOldBridgeAugmentation);
347 if (oldDpId == null && newDpId != null) {
348 LOG.trace("DpId changed to {} for bridge {}", newDpId, oldBridgeName);
354 private OvsdbTepInfo getOvsdbTepInfo(OvsdbNodeAugmentation ovsdbNodeAugmentation) {
355 if (ovsdbNodeAugmentation == null) {
359 @Nullable Map<OpenvswitchOtherConfigsKey, OpenvswitchOtherConfigs> ovsdbNodeOtherConfigsList =
360 ovsdbNodeAugmentation.getOpenvswitchOtherConfigs();
361 if (ovsdbNodeOtherConfigsList == null) {
362 //Local IP is not configured
363 LOG.debug("OtherConfigs list does not exist in the OVSDB Node Augmentation.");
367 OvsdbTepInfo ovsdbTepInfoObj = new OvsdbTepInfo();
369 for (OpenvswitchOtherConfigs otherConfigs : ovsdbNodeOtherConfigsList.values()) {
370 if (ITMConstants.OTH_CFG_TEP_PARAM_KEY_LOCAL_IP.equals(otherConfigs.getOtherConfigKey())) {
371 String tepIp = otherConfigs.getOtherConfigValue();
372 ovsdbTepInfoObj.setLocalIp(tepIp);
376 @Nullable Map<OpenvswitchExternalIdsKey, OpenvswitchExternalIds> ovsdbNodeExternalIdsList =
377 ovsdbNodeAugmentation.getOpenvswitchExternalIds();
378 if (ovsdbNodeExternalIdsList == null) {
379 LOG.debug("ExternalIds list does not exist in the OVSDB Node Augmentation.");
381 for (OpenvswitchExternalIds externalId : ovsdbNodeExternalIdsList.values()) {
382 switch (externalId.getExternalIdKey()) {
383 case ITMConstants.EXT_ID_TEP_PARAM_KEY_TZNAME:
384 ovsdbTepInfoObj.setTzName(externalId.getExternalIdValue());
386 case ITMConstants.EXT_ID_TEP_PARAM_KEY_BR_NAME:
387 ovsdbTepInfoObj.setBrName(externalId.getExternalIdValue());
389 case ITMConstants.EXT_ID_TEP_PARAM_KEY_OF_TUNNEL:
390 ovsdbTepInfoObj.setOfTunnel(Boolean.parseBoolean(externalId.getExternalIdValue()));
397 return ovsdbTepInfoObj;
400 private void processBridgeUpdate(Node ovsdbNodeNew, boolean isBridgeAdd) {
401 OvsdbBridgeAugmentation ovsdbNewBridgeAugmentation =
402 ovsdbNodeNew.augmentation(OvsdbBridgeAugmentation.class);
403 if (ovsdbNewBridgeAugmentation != null) {
404 processBridgeUpdate(ovsdbNewBridgeAugmentation, isBridgeAdd);
408 private void processBridgeUpdate(OvsdbBridgeAugmentation ovsdbNewBridgeAugmentation, boolean isBridgeAdd) {
409 String bridgeName = null;
410 String strDpnId = null;
411 OvsdbNodeAugmentation ovsdbNewNodeAugmentation = null;
413 if (ovsdbNewBridgeAugmentation != null) {
414 bridgeName = ovsdbNewBridgeAugmentation.getBridgeName().getValue();
416 // Read DPID from OVSDBBridgeAugmentation
417 strDpnId = ItmUtils.getStrDatapathId(ovsdbNewBridgeAugmentation);
418 if (strDpnId == null || strDpnId.isEmpty()) {
419 LOG.trace("OvsdbBridgeAugmentation processBridgeUpdate: DPID for bridge {} is NULL.", bridgeName);
423 // TBD: Move this time taking operations into DataStoreJobCoordinator
424 Node ovsdbNodeFromBridge = ItmUtils.getOvsdbNode(ovsdbNewBridgeAugmentation, dataBroker);
425 // check for OVSDB node. NOTE: it can be null during bridge removal notification
426 // when switch is disconnected
427 if (ovsdbNodeFromBridge != null) {
428 ovsdbNewNodeAugmentation = ovsdbNodeFromBridge.augmentation(OvsdbNodeAugmentation.class);
430 LOG.warn("processBridgeUpdate: bridge {} removal case when Switch is disconnected."
431 + "Hence, Ovsdb Node could not be fetched from Oper DS.", bridgeName);
436 if (ovsdbNewNodeAugmentation != null) {
437 OvsdbTepInfo ovsdbTepInfo = getOvsdbTepInfo(ovsdbNewNodeAugmentation);
439 if (ovsdbTepInfo == null) {
440 LOG.trace("processBridgeUpdate: No Tep Info");
443 // store TEP info required parameters
444 String newLocalIp = ovsdbTepInfo.getLocalIp();
445 String tzName = ovsdbTepInfo.getTzName();
446 String newBridgeName = ovsdbTepInfo.getBrName();
447 boolean ofTunnel = ovsdbTepInfo.getOfTunnel();
449 // check if Local IP is configured or not
450 if (newLocalIp != null && !newLocalIp.isEmpty()) {
451 // if bridge received is the one configured for TEPs from OVS side or
452 // if it is br-int, then add TEP into Config DS
453 if (newBridgeName.equals(bridgeName)) {
454 LOG.trace("processBridgeUpdate for bridge {} that is configured with Local IP.", bridgeName);
455 String jobKey = newLocalIp;
456 // add or remove tep based on bridge (br-int) is added or removed
457 addOrRemoveTep(tzName, strDpnId, jobKey, newLocalIp, newBridgeName, ofTunnel, isBridgeAdd);
459 LOG.trace("processBridgeUpdate invoked for bridge {}, nothing to do.", bridgeName);
462 LOG.trace("processBridgeUpdate for bridge {} without Local IP set for ovs node. Nothing to do.",