2 * Copyright © 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
8 package org.opendaylight.netvirt.elan.l2gw.ha;
10 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
11 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.OPERATIONAL;
13 import com.google.common.base.Optional;
14 import java.nio.charset.StandardCharsets;
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.Collections;
18 import java.util.HashMap;
19 import java.util.HashSet;
20 import java.util.List;
22 import java.util.concurrent.ExecutionException;
23 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
24 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
27 import org.opendaylight.genius.utils.hwvtep.HwvtepHACache;
28 import org.opendaylight.netvirt.elan.l2gw.ha.commands.SwitchesCmd;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalRef;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitchesKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Managers;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ManagersBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.ManagersKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.managers.ManagerOtherConfigs;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.managers.ManagerOtherConfigsBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.managers.ManagerOtherConfigsKey;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
52 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
53 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
56 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
57 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
58 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
59 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
60 import org.slf4j.Logger;
61 import org.slf4j.LoggerFactory;
63 public final class HwvtepHAUtil {
65 static Logger LOG = LoggerFactory.getLogger(HwvtepHAUtil.class);
67 //TODO reuse HWvtepSouthboundConstants
68 public static final String HA_ENABLED = "ha_enabled";
69 public static final String HWVTEP_ENTITY_TYPE = "hwvtep";
70 public static final String TEP_PREFIX = "vxlan_over_ipv4:";
71 public static final String HA_ID = "ha_id";
72 public static final String HA_CHILDREN = "ha_children";
73 public static final String PHYSICALSWITCH = "/physicalswitch/";
74 public static final TopologyId HWVTEP_TOPOLOGY_ID = new TopologyId(new Uri("hwvtep:1"));
75 public static final String UUID = "uuid";
76 public static final String HWVTEP_URI_PREFIX = "hwvtep";
77 public static final String MANAGER_KEY = "managerKey";
78 public static final String L2GW_JOB_KEY = ":l2gw";
80 static HwvtepHACache hwvtepHACache = HwvtepHACache.getInstance();
82 private HwvtepHAUtil() { }
84 public static HwvtepPhysicalLocatorRef buildLocatorRef(InstanceIdentifier<Node> nodeIid, String tepIp) {
85 InstanceIdentifier<TerminationPoint> tepId = buildTpId(nodeIid, tepIp);
86 return new HwvtepPhysicalLocatorRef(tepId);
89 public static String getNodeIdVal(InstanceIdentifier<?> iid) {
90 return iid.firstKeyOf(Node.class).getNodeId().getValue();
93 public static Uuid getUUid(String key) {
94 return new Uuid(java.util.UUID.nameUUIDFromBytes(key.getBytes(StandardCharsets.UTF_8)).toString());
97 public static InstanceIdentifier<TerminationPoint> buildTpId(InstanceIdentifier<Node> nodeIid,String tepIp) {
98 String tpKeyStr = TEP_PREFIX + tepIp;
99 TerminationPointKey tpKey = new TerminationPointKey(new TpId(tpKeyStr));
100 InstanceIdentifier<TerminationPoint> plIid = nodeIid.child(TerminationPoint.class, tpKey);
104 public static String getTepIpVal(HwvtepPhysicalLocatorRef locatorRef) {
105 InstanceIdentifier<TerminationPoint> tpId = (InstanceIdentifier<TerminationPoint>) locatorRef.getValue();
106 return tpId.firstKeyOf(TerminationPoint.class).getTpId().getValue().substring("vxlan_over_ipv4:".length());
109 public static String getLogicalSwitchSwitchName(HwvtepLogicalSwitchRef logicalSwitchRef) {
110 InstanceIdentifier<LogicalSwitches> id = (InstanceIdentifier<LogicalSwitches>) logicalSwitchRef.getValue();
111 return id.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName().getValue();
114 public static String getNodeIdFromLocatorRef(HwvtepPhysicalLocatorRef locatorRef) {
115 InstanceIdentifier<TerminationPoint> tpId = (InstanceIdentifier<TerminationPoint>) locatorRef.getValue();
116 return tpId.firstKeyOf(Node.class).getNodeId().getValue();
119 public static String getNodeIdFromLogicalSwitches(HwvtepLogicalSwitchRef logicalSwitchRef) {
120 InstanceIdentifier<LogicalSwitches> id = (InstanceIdentifier<LogicalSwitches>) logicalSwitchRef.getValue();
121 return id.firstKeyOf(Node.class).getNodeId().getValue();
124 public static InstanceIdentifier<Node> createInstanceIdentifierFromHAId(String haUUidVal) {
125 String nodeString = HWVTEP_URI_PREFIX + "://"
126 + UUID + "/" + java.util.UUID.nameUUIDFromBytes(haUUidVal.getBytes(StandardCharsets.UTF_8)).toString();
127 NodeId nodeId = new NodeId(new Uri(nodeString));
128 NodeKey nodeKey = new NodeKey(nodeId);
129 TopologyKey topoKey = new TopologyKey(HWVTEP_TOPOLOGY_ID);
130 return InstanceIdentifier.builder(NetworkTopology.class)
131 .child(Topology.class, topoKey)
132 .child(Node.class, nodeKey)
136 public static InstanceIdentifier<Node> convertToInstanceIdentifier(String nodeIdString) {
137 NodeId nodeId = new NodeId(new Uri(nodeIdString));
138 NodeKey nodeKey = new NodeKey(nodeId);
139 TopologyKey topoKey = new TopologyKey(HWVTEP_TOPOLOGY_ID);
140 return InstanceIdentifier.builder(NetworkTopology.class)
141 .child(Topology.class, topoKey)
142 .child(Node.class, nodeKey)
147 * Build other config data for HA node .
149 * @param key The key as in HA child device other config
150 * @param val The value as in HA child device other config
151 * @return return other config object
153 public static ManagerOtherConfigsBuilder getOtherConfigBuilder(String key, String val) {
154 ManagerOtherConfigsBuilder otherConfigsBuilder = new ManagerOtherConfigsBuilder();
155 ManagerOtherConfigsKey otherConfigsKey = new ManagerOtherConfigsKey(key);
156 otherConfigsBuilder.setKey(otherConfigsKey);
157 otherConfigsBuilder.setOtherConfigKey(key);
158 otherConfigsBuilder.setOtherConfigValue(val);
159 return otherConfigsBuilder;
162 public static Node readNode(ReadWriteTransaction tx, LogicalDatastoreType storeType,
163 InstanceIdentifier<Node> nodeId)
164 throws ReadFailedException {
165 Optional<Node> optional = tx.read(storeType, nodeId).checkedGet();
166 if (optional.isPresent()) {
167 return optional.get();
172 public static String convertToGlobalNodeId(String psNodeId) {
173 int idx = psNodeId.indexOf(PHYSICALSWITCH);
175 return psNodeId.substring(0, idx);
181 * Trnaform logical switch to nodepath passed .
183 * @param src {@link HwvtepLogicalSwitchRef} Logical Switch Ref which needs to be transformed
184 * @param nodePath {@link InstanceIdentifier} src needs to be transformed to this path
185 * @return ref {@link HwvtepLogicalSwitchRef} the transforrmed result
187 public static HwvtepLogicalSwitchRef convertLogicalSwitchRef(HwvtepLogicalSwitchRef src,
188 InstanceIdentifier<Node> nodePath) {
189 InstanceIdentifier<LogicalSwitches> srcId = (InstanceIdentifier<LogicalSwitches>)src.getValue();
190 HwvtepNodeName switchName = srcId.firstKeyOf(LogicalSwitches.class).getHwvtepNodeName();
191 InstanceIdentifier<LogicalSwitches> iid = nodePath.augmentation(HwvtepGlobalAugmentation.class)
192 .child(LogicalSwitches.class, new LogicalSwitchesKey(switchName));
193 HwvtepLogicalSwitchRef ref = new HwvtepLogicalSwitchRef(iid);
198 * Trnaform locator reference to nodepath passed .
200 * @param src {@link HwvtepPhysicalLocatorRef} Logical Switch Ref which needs to be transformed
201 * @param nodePath {@link InstanceIdentifier} src needs to be transformed to this path
202 * @return physicalLocatorRef {@link HwvtepPhysicalLocatorRef} the transforrmed result
204 public static HwvtepPhysicalLocatorRef convertLocatorRef(HwvtepPhysicalLocatorRef src,
205 InstanceIdentifier<Node> nodePath) {
206 InstanceIdentifier<TerminationPoint> srcTepPath = (InstanceIdentifier<TerminationPoint>)src.getValue();
207 TpId tpId = srcTepPath.firstKeyOf(TerminationPoint.class).getTpId();
208 InstanceIdentifier<TerminationPoint> tpPath =
209 nodePath.child(TerminationPoint.class, new TerminationPointKey(tpId));
210 HwvtepPhysicalLocatorRef physicalLocatorRef = new HwvtepPhysicalLocatorRef(tpPath);
211 return physicalLocatorRef;
214 public static boolean isEmptyList(List list) {
215 return list == null || list.isEmpty();
218 public static boolean isEmpty(Collection collection) {
219 if (collection == null || collection.isEmpty()) {
225 public static void mergeManagedByNode(Node psNode,
226 PhysicalSwitchAugmentationBuilder builder,
227 InstanceIdentifier<Node> haNodePath,
228 InstanceIdentifier<Node> haPsPath, NodeId haPSNodeId) {
229 PhysicalSwitchAugmentation psAugmentation = psNode.getAugmentation(PhysicalSwitchAugmentation.class);
230 builder.setManagedBy(new HwvtepGlobalRef(haNodePath));
231 builder.setHwvtepNodeName(psAugmentation.getHwvtepNodeName());
232 builder.setHwvtepNodeDescription(psAugmentation.getHwvtepNodeDescription());
233 builder.setTunnelIps(psAugmentation.getTunnelIps());
234 builder.setPhysicalSwitchUuid(getUUid(psAugmentation.getHwvtepNodeName().getValue()));
237 public static Node getOriginal(DataObjectModification<Node> mod) {
239 switch (mod.getModificationType()) {
240 case SUBTREE_MODIFIED:
242 node = mod.getDataBefore();
245 if (mod.getDataBefore() != null) {
246 node = mod.getDataBefore();
255 public static Node getUpdated(DataObjectModification<Node> mod) {
257 switch (mod.getModificationType()) {
258 case SUBTREE_MODIFIED:
259 node = mod.getDataAfter();
262 if (mod.getDataAfter() != null) {
263 node = mod.getDataAfter();
272 public static Node getCreated(DataObjectModification<Node> mod) {
273 if (mod.getModificationType() == DataObjectModification.ModificationType.WRITE
274 && mod.getDataBefore() == null) {
275 return mod.getDataAfter();
280 public static Node getRemoved(DataObjectModification<Node> mod) {
281 if (mod.getModificationType() == DataObjectModification.ModificationType.DELETE) {
282 return mod.getDataBefore();
287 public static InstanceIdentifier<Node> getGlobalNodePathFromPSNode(Node psNode) {
289 || psNode.getAugmentation(PhysicalSwitchAugmentation.class) == null
290 || psNode.getAugmentation(PhysicalSwitchAugmentation.class).getManagedBy() == null) {
293 return (InstanceIdentifier<Node>)psNode
294 .getAugmentation(PhysicalSwitchAugmentation.class).getManagedBy().getValue();
297 public static InstanceIdentifier<Node> convertPsPath(Node psNode, InstanceIdentifier<Node> nodePath) {
298 String psNodeId = psNode.getNodeId().getValue();
299 String psName = psNodeId.substring(psNodeId.indexOf(PHYSICALSWITCH) + PHYSICALSWITCH.length());
300 String haPsNodeIdVal = nodePath.firstKeyOf(Node.class).getNodeId().getValue() + PHYSICALSWITCH + psName;
301 InstanceIdentifier<Node> haPsPath = convertToInstanceIdentifier(haPsNodeIdVal);
305 public static NodeBuilder getNodeBuilderForPath(InstanceIdentifier<Node> haPath) {
306 NodeBuilder nodeBuilder = new NodeBuilder();
307 nodeBuilder.setNodeId(haPath.firstKeyOf(Node.class).getNodeId());
311 public static String getHAIdFromManagerOtherConfig(Node node) {
312 if (node.getAugmentation(HwvtepGlobalAugmentation.class) == null) {
315 HwvtepGlobalAugmentation globalAugmentation = node.getAugmentation(HwvtepGlobalAugmentation.class);
316 if (globalAugmentation != null) {
317 List<Managers> managers = globalAugmentation.getManagers();
318 if (managers != null && managers.size() > 0 && managers.get(0).getManagerOtherConfigs() != null) {
319 for (ManagerOtherConfigs configs : managers.get(0).getManagerOtherConfigs()) {
320 if (configs.getOtherConfigKey().equals(HA_ID)) {
321 return configs.getOtherConfigValue();
330 * Returns ha child node path from ha node of config data tree.
332 * @param haGlobalConfigNodeOptional HA global node
333 * @return ha Child ids
335 public static List<NodeId> getChildNodeIdsFromManagerOtherConfig(Optional<Node> haGlobalConfigNodeOptional) {
336 List<NodeId> childNodeIds = new ArrayList<>();
337 if (!haGlobalConfigNodeOptional.isPresent()) {
340 HwvtepGlobalAugmentation augmentation =
341 haGlobalConfigNodeOptional.get().getAugmentation(HwvtepGlobalAugmentation.class);
342 if (augmentation != null && augmentation.getManagers() != null
343 && augmentation.getManagers().size() > 0) {
344 Managers managers = augmentation.getManagers().get(0);
345 if (null == managers.getManagerOtherConfigs()) {
348 for (ManagerOtherConfigs otherConfigs : managers.getManagerOtherConfigs()) {
349 if (otherConfigs.getOtherConfigKey().equals(HA_CHILDREN)) {
350 String nodeIdsVal = otherConfigs.getOtherConfigValue();
351 if (nodeIdsVal != null) {
352 String[] parts = nodeIdsVal.split(",");
353 for (String part : parts) {
354 childNodeIds.add(new NodeId(part));
365 * Return PS children for passed PS node .
367 * @param psNodId PS node path
368 * @return child Switches
370 public static Set<InstanceIdentifier<Node>> getPSChildrenIdsForHAPSNode(String psNodId) {
371 if (!psNodId.contains(PHYSICALSWITCH)) {
372 return Collections.emptySet();
374 String nodeId = convertToGlobalNodeId(psNodId);
375 InstanceIdentifier<Node> iid = convertToInstanceIdentifier(nodeId);
376 if (hwvtepHACache.isHAParentNode(iid)) {
377 Set<InstanceIdentifier<Node>> childSwitchIds = new HashSet<>();
378 Set<InstanceIdentifier<Node>> childGlobalIds = hwvtepHACache.getChildrenForHANode(iid);
379 final String append = psNodId.substring(psNodId.indexOf(PHYSICALSWITCH));
380 for (InstanceIdentifier<Node> childId : childGlobalIds) {
381 String childIdVal = childId.firstKeyOf(Node.class).getNodeId().getValue();
382 childSwitchIds.add(convertToInstanceIdentifier(childIdVal + append));
384 return childSwitchIds;
386 return Collections.EMPTY_SET;
389 public static HwvtepGlobalAugmentation getGlobalAugmentationOfNode(Node node) {
390 HwvtepGlobalAugmentation result = null;
392 result = node.getAugmentation(HwvtepGlobalAugmentation.class);
394 if (result == null) {
395 result = new HwvtepGlobalAugmentationBuilder().build();
400 public static PhysicalSwitchAugmentation getPhysicalSwitchAugmentationOfNode(Node psNode) {
401 PhysicalSwitchAugmentation result = null;
402 if (psNode != null) {
403 result = psNode.getAugmentation(PhysicalSwitchAugmentation.class);
405 if (result == null) {
406 result = new PhysicalSwitchAugmentationBuilder().build();
412 * Transform child managers (Source) to HA managers using HA node path.
414 * @param childNode Child Node
415 * @param haGlobalCfg HA global config node
416 * @return Transformed managers
418 public static List<Managers> buildManagersForHANode(Node childNode, Optional<Node> haGlobalCfg) {
420 Set<NodeId> nodeIds = new HashSet<>();
421 nodeIds.add(childNode.getNodeId());
422 List<NodeId> childNodeIds = getChildNodeIdsFromManagerOtherConfig(haGlobalCfg);
423 nodeIds.addAll(childNodeIds);
425 ManagersBuilder builder1 = new ManagersBuilder();
427 builder1.setKey(new ManagersKey(new Uri(MANAGER_KEY)));
428 List<ManagerOtherConfigs> otherConfigses = new ArrayList<>();
429 StringBuffer stringBuffer = new StringBuffer();
430 for (NodeId nodeId : nodeIds) {
431 stringBuffer.append(nodeId.getValue());
432 stringBuffer.append(",");
435 String children = stringBuffer.substring(0, stringBuffer.toString().length() - 1);
437 otherConfigses.add(getOtherConfigBuilder(HA_CHILDREN, children).build());
438 builder1.setManagerOtherConfigs(otherConfigses);
439 List<Managers> managers = new ArrayList<>();
440 managers.add(builder1.build());
445 * Transform child switch (Source) to HA swicthes using HA node path.
447 * @param childNode HA child node
448 * @param haNodePath HA node path
449 * @param haNode Ha node object
450 * @return Transformed switches
452 public static List<Switches> buildSwitchesForHANode(Node childNode,
453 InstanceIdentifier<Node> haNodePath,
454 Optional<Node> haNode) {
455 List<Switches> psList = new ArrayList<>();
456 boolean switchesAlreadyPresent = false;
457 if (haNode.isPresent()) {
458 Node node = haNode.get();
459 HwvtepGlobalAugmentation augmentation = node.getAugmentation(HwvtepGlobalAugmentation.class);
460 if (augmentation != null) {
461 if (augmentation.getSwitches() != null) {
462 if (augmentation.getSwitches().size() > 0) {
463 switchesAlreadyPresent = true;
468 if (!switchesAlreadyPresent) {
469 HwvtepGlobalAugmentation augmentation = childNode.getAugmentation(HwvtepGlobalAugmentation.class);
470 if (augmentation != null && augmentation.getSwitches() != null) {
471 List<Switches> src = augmentation.getSwitches();
472 if (src != null && src.size() > 0) {
473 psList.add(new SwitchesCmd().transform(haNodePath, src.get(0)));
481 * Build HA Global node from child nodes in config data tress.
483 * @param tx Transaction
484 * @param childNode Child Node object
485 * @param haNodePath Ha node path
486 * @param haGlobalCfg HA global node object
488 public static void buildGlobalConfigForHANode(ReadWriteTransaction tx,
490 InstanceIdentifier<Node> haNodePath,
491 Optional<Node> haGlobalCfg) {
493 NodeBuilder nodeBuilder = new NodeBuilder();
494 HwvtepGlobalAugmentationBuilder hwvtepGlobalBuilder = new HwvtepGlobalAugmentationBuilder();
495 hwvtepGlobalBuilder.setSwitches(buildSwitchesForHANode(childNode, haNodePath, haGlobalCfg));
496 hwvtepGlobalBuilder.setManagers(buildManagersForHANode(childNode, haGlobalCfg));
498 nodeBuilder.setNodeId(haNodePath.firstKeyOf(Node.class).getNodeId());
499 nodeBuilder.addAugmentation(HwvtepGlobalAugmentation.class, hwvtepGlobalBuilder.build());
500 Node configHANode = nodeBuilder.build();
501 tx.merge(CONFIGURATION, haNodePath, configHANode,Boolean.TRUE);
504 public static void deleteNodeIfPresent(ReadWriteTransaction tx,
505 LogicalDatastoreType logicalDatastoreType,
506 InstanceIdentifier<?> iid) throws ReadFailedException {
507 if (tx.read(logicalDatastoreType, iid).checkedGet().isPresent()) {
508 LOG.info("Deleting child node {}", getNodeIdVal(iid));
509 tx.delete(logicalDatastoreType, iid);
514 * Delete PS data of HA node of Config Data tree.
516 * @param key Node object
517 * @param haNode Ha Node from which to be deleted
518 * @param tx Transaction
519 * @throws ReadFailedException Exception thrown if read fails
520 * @throws ExecutionException Exception thrown if Execution fail
521 * @throws InterruptedException Thread interrupted Exception
523 public static void deletePSNodesOfNode(InstanceIdentifier<Node> key,
525 ReadWriteTransaction tx)
526 throws InterruptedException, ExecutionException, ReadFailedException {
527 //read from switches attribute and clean up them
528 HwvtepGlobalAugmentation globalAugmentation = haNode.getAugmentation(HwvtepGlobalAugmentation.class);
529 if (globalAugmentation == null) {
532 HashMap<InstanceIdentifier<Node>,Boolean> deleted = new HashMap<>();
533 List<Switches> switches = globalAugmentation.getSwitches();
534 if (switches != null) {
535 for (Switches switche : switches) {
536 InstanceIdentifier<Node> psId = (InstanceIdentifier<Node>)switche.getSwitchRef().getValue();
537 deleteNodeIfPresent(tx, CONFIGURATION, psId);
538 deleted.put(psId, Boolean.TRUE);
541 //also read from managed by attribute of switches and cleanup them as a back up if the above cleanup fails
542 Optional<Topology> topologyOptional = tx
543 .read(CONFIGURATION, key.firstIdentifierOf(Topology.class)).checkedGet();
544 String deletedNodeId = key.firstKeyOf(Node.class).getNodeId().getValue();
545 if (topologyOptional.isPresent()) {
546 Topology topology = topologyOptional.get();
547 if (topology.getNode() != null) {
548 for (Node psNode : topology.getNode()) {
549 PhysicalSwitchAugmentation ps = psNode.getAugmentation(PhysicalSwitchAugmentation.class);
551 InstanceIdentifier<Node> iid = (InstanceIdentifier<Node>)ps.getManagedBy().getValue();
552 String nodeIdVal = iid.firstKeyOf(Node.class).getNodeId().getValue();
553 if (deletedNodeId.equals(nodeIdVal)) {
554 InstanceIdentifier<Node> psNodeId =
555 convertToInstanceIdentifier(psNode.getNodeId().getValue());
556 if (deleted.containsKey(psNodeId)) {
557 deleteNodeIfPresent(tx, CONFIGURATION, psNodeId);
567 * Delete switches from Node in Operational Data Tree .
569 * @param haPath HA node path from whih switches will be deleted
570 * @param tx Transaction object
571 * @throws ReadFailedException Exception thrown if read fails
572 * @throws ExecutionException Exception thrown if Execution fail
573 * @throws InterruptedException Thread interrupted Exception
575 public static void deleteSwitchesManagedByNode(InstanceIdentifier<Node> haPath,
576 ReadWriteTransaction tx)
577 throws InterruptedException, ExecutionException, ReadFailedException {
579 Optional<Node> nodeOptional = tx.read(OPERATIONAL, haPath).checkedGet();
580 if (!nodeOptional.isPresent()) {
583 Node node = nodeOptional.get();
584 HwvtepGlobalAugmentation globalAugmentation = node.getAugmentation(HwvtepGlobalAugmentation.class);
585 if (globalAugmentation == null) {
588 List<Switches> switches = globalAugmentation.getSwitches();
589 if (switches != null) {
590 for (Switches switche : switches) {
591 InstanceIdentifier<Node> id = (InstanceIdentifier<Node>)switche.getSwitchRef().getValue();
592 deleteNodeIfPresent(tx, OPERATIONAL, id);
598 * Returns true/false if all the childrens are deleted from Operational Data store.
600 * @param children IID for the child node to read from OP data tree
601 * @param tx Transaction
602 * @return true/false boolean
603 * @throws ReadFailedException Exception thrown if read fails
605 public static boolean areAllChildDeleted(Set<InstanceIdentifier<Node>> children,
606 ReadWriteTransaction tx) throws ReadFailedException {
607 for (InstanceIdentifier<Node> childId : children) {
608 if (tx.read(OPERATIONAL, childId).checkedGet().isPresent()) {