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
8 package org.opendaylight.netvirt.elan.l2gw.ha.commands;
10 import java.io.Serializable;
11 import java.util.ArrayList;
12 import java.util.Comparator;
13 import java.util.List;
14 import java.util.stream.Collectors;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindingsBuilder;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
25 import org.opendaylight.yangtools.yang.binding.Identifier;
26 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 public class TerminationPointCmd extends MergeCommand<TerminationPoint, NodeBuilder, Node> {
32 private static final Logger LOG = LoggerFactory.getLogger(TerminationPointCmd.class);
34 public TerminationPointCmd() {
39 public List<TerminationPoint> getData(Node node) {
40 if (node != null && node.nonnullTerminationPoint() != null) {
41 return new ArrayList<TerminationPoint>(node.nonnullTerminationPoint().values());
47 public void setData(NodeBuilder builder, List<TerminationPoint> data) {
48 builder.setTerminationPoint(data);
52 public InstanceIdentifier<TerminationPoint> generateId(InstanceIdentifier<Node> id, TerminationPoint node) {
53 return id.child(TerminationPoint.class, node.key());
57 public TerminationPoint transform(InstanceIdentifier<Node> nodePath, TerminationPoint src) {
58 HwvtepPhysicalPortAugmentation augmentation = src.augmentation(HwvtepPhysicalPortAugmentation.class);
59 if (augmentation == null) {
60 return new TerminationPointBuilder(src).build();
62 String nodeIdVal = nodePath.firstKeyOf(Node.class).getNodeId().getValue();
63 int idx = nodeIdVal.indexOf("/physicalswitch");
65 nodeIdVal = nodeIdVal.substring(0, idx);
66 nodePath = HwvtepHAUtil.convertToInstanceIdentifier(nodeIdVal);
68 final InstanceIdentifier<Node> path = nodePath;
69 TerminationPointBuilder tpBuilder = new TerminationPointBuilder(src);
70 tpBuilder.removeAugmentation(HwvtepPhysicalPortAugmentation.class);
71 HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder =
72 new HwvtepPhysicalPortAugmentationBuilder();
73 tpAugmentationBuilder.setAclBindings(augmentation.getAclBindings());
74 tpAugmentationBuilder.setHwvtepNodeDescription(augmentation.getHwvtepNodeDescription());
75 tpAugmentationBuilder.setHwvtepNodeName(augmentation.getHwvtepNodeName());
76 tpAugmentationBuilder.setPhysicalPortUuid(augmentation.getPhysicalPortUuid());
77 tpAugmentationBuilder.setVlanStats(augmentation.getVlanStats());
78 if (augmentation.getVlanBindings() != null && augmentation.getVlanBindings().size() > 0) {
79 tpAugmentationBuilder.setVlanBindings(augmentation.nonnullVlanBindings().values().stream().map(
81 if (vlanBindings.getLogicalSwitchRef() == null) {
82 LOG.error("Failed to get logical switch ref for vlan binding {} {} ", path, src);
84 VlanBindingsBuilder vlanBindingsBuilder = new VlanBindingsBuilder(vlanBindings);
85 vlanBindingsBuilder.setLogicalSwitchRef(
86 HwvtepHAUtil.convertLogicalSwitchRef(vlanBindings.getLogicalSwitchRef(), path));
87 return vlanBindingsBuilder.build();
88 }).collect(Collectors.toList()));
91 tpBuilder.addAugmentation(tpAugmentationBuilder.build());
92 return tpBuilder.build();
96 public Identifier getKey(TerminationPoint data) {
101 public String getDescription() {
102 return "vlanbindings";
106 public TerminationPoint withoutUuid(TerminationPoint data) {
111 public boolean areEqual(TerminationPoint updated, TerminationPoint orig) {
112 if (!updated.key().equals(orig.key())) {
115 HwvtepPhysicalPortAugmentation updatedAugmentation = updated
116 .augmentation(HwvtepPhysicalPortAugmentation.class);
117 HwvtepPhysicalPortAugmentation origAugmentation = orig.augmentation(HwvtepPhysicalPortAugmentation.class);
119 List<VlanBindings> up = updatedAugmentation != null
120 ? new ArrayList<>(updatedAugmentation.nonnullVlanBindings().values()) : null;
121 List<VlanBindings> or = origAugmentation != null
122 ? new ArrayList<>(origAugmentation.nonnullVlanBindings().values()) : null;
123 if (!areSameSize(up, or)) {
126 List<VlanBindings> added = diffOf(up, or, bindingsComparator);
127 if (added.size() != 0) {
130 List<VlanBindings> removed = diffOf(or, up, bindingsComparator);
131 if (removed.size() != 0) {
137 static BindingsComparator bindingsComparator = new BindingsComparator();
139 static class BindingsComparator implements Comparator<VlanBindings>, Serializable {
140 private static final long serialVersionUID = 1L;
143 public int compare(VlanBindings updated, VlanBindings orig) {
144 if (updated == null && orig == null) {
147 if (updated == null) {
153 if (updated.key().equals(orig.key())) {
162 public void transformUpdate(List<TerminationPoint> existing,
163 List<TerminationPoint> updated,
164 List<TerminationPoint> orig,
165 InstanceIdentifier<Node> nodePath,
166 LogicalDatastoreType datastoreType,
167 ReadWriteTransaction tx) {
169 if (updated == null) {
170 updated = new ArrayList<>();
173 orig = new ArrayList<>();
175 List<TerminationPoint> added = new ArrayList<>(updated);
177 added = diffOf(added, orig);
178 added = diffOf(added, existing);//do not add the existing data again
179 if (added != null && added.size() > 0) {
180 for (TerminationPoint addedItem : added) {
181 InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, addedItem);
182 TerminationPoint transformedItem = transform(nodePath, addedItem);
183 LOG.trace("adding vlanbindings id {} ", transformedId
184 .firstKeyOf(TerminationPoint.class).getTpId().getValue());
185 tx.put(datastoreType, transformedId, transformedItem, true);
188 for (TerminationPoint origItem : orig) {
189 boolean found = false;
190 for (TerminationPoint newItem : updated) {
191 if (newItem.key().equals(origItem.key())) {
196 boolean existsInConfig = false;
197 for (TerminationPoint existingItem : existing) {
198 if (existingItem.key().equals(origItem.key())) {
199 existsInConfig = true;
202 if (existsInConfig) {
203 InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, origItem);
204 LOG.trace("deleting vlanbindings id {} ", transformedId.firstKeyOf(TerminationPoint.class)
205 .getTpId().getValue());
206 tx.delete(datastoreType, transformedId);