2 * Copyright (c) 2016 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.util.Comparator;
11 import java.util.List;
12 import java.util.stream.Collectors;
13 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindingsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
19 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
22 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
23 import org.slf4j.LoggerFactory;
25 public class TerminationPointCmd extends MergeCommand<TerminationPoint, NodeBuilder, Node> {
27 public TerminationPointCmd() {
28 LOG = LoggerFactory.getLogger(TerminationPointCmd.class);
32 public List<TerminationPoint> getData(Node node) {
34 return node.getTerminationPoint();
40 public void setData(NodeBuilder builder, List<TerminationPoint> data) {
41 builder.setTerminationPoint(data);
45 protected InstanceIdentifier<TerminationPoint> generateId(InstanceIdentifier<Node> id, TerminationPoint node) {
46 return id.child(TerminationPoint.class, node.getKey());
50 public TerminationPoint transform(InstanceIdentifier<Node> nodePath, TerminationPoint src) {
51 HwvtepPhysicalPortAugmentation augmentation = src.getAugmentation(HwvtepPhysicalPortAugmentation.class);
52 if (augmentation == null) {
53 return new TerminationPointBuilder(src).build();
55 String nodeIdVal = nodePath.firstKeyOf(Node.class).getNodeId().getValue();
56 int idx = nodeIdVal.indexOf("/physicalswitch");
58 nodeIdVal = nodeIdVal.substring(0, idx);
59 nodePath = HwvtepHAUtil.convertToInstanceIdentifier(nodeIdVal);
61 final InstanceIdentifier<Node> path = nodePath;
62 TerminationPointBuilder tpBuilder = new TerminationPointBuilder(src);
63 tpBuilder.removeAugmentation(HwvtepPhysicalPortAugmentation.class);
64 HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder =
65 new HwvtepPhysicalPortAugmentationBuilder(augmentation);
67 if (augmentation.getVlanBindings() != null && augmentation.getVlanBindings().size() > 0) {
68 tpAugmentationBuilder.setVlanBindings(augmentation.getVlanBindings().stream().map(
70 VlanBindingsBuilder vlanBindingsBuilder = new VlanBindingsBuilder(vlanBindings);
71 vlanBindingsBuilder.setLogicalSwitchRef(
72 HwvtepHAUtil.convertLogicalSwitchRef(vlanBindings.getLogicalSwitchRef(), path));
73 return vlanBindingsBuilder.build();
74 }).collect(Collectors.toList()));
77 tpBuilder.addAugmentation(HwvtepPhysicalPortAugmentation.class, tpAugmentationBuilder.build());
78 return tpBuilder.build();
82 public String getKey(TerminationPoint data) {
83 return data.getTpId().getValue();
87 public String getDescription() {
88 return "vlanbindings";
92 public boolean areEqual(TerminationPoint updated, TerminationPoint orig) {
93 if (!updated.getKey().equals(orig.getKey())) {
96 HwvtepPhysicalPortAugmentation updatedAugmentation = updated
97 .getAugmentation(HwvtepPhysicalPortAugmentation.class);
98 HwvtepPhysicalPortAugmentation origAugmentation = orig.getAugmentation(HwvtepPhysicalPortAugmentation.class);
100 List<VlanBindings> up = updatedAugmentation.getVlanBindings();
101 List<VlanBindings> or = origAugmentation.getVlanBindings();
102 if (!areSameSize(up, or)) {
105 List<VlanBindings> added = diffOf(up, or, bindingsComparator);
106 if (added.size() != 0) {
109 List<VlanBindings> removed = diffOf(or, up, bindingsComparator);
110 if (removed.size() != 0) {
116 static BindingsComparator bindingsComparator = new BindingsComparator();
118 static class BindingsComparator implements Comparator<VlanBindings> {
120 public int compare(VlanBindings updated, VlanBindings orig) {
121 if (updated == null && orig == null) {
124 if (updated == null) {
130 if (updated.getKey().equals(orig.getKey())) {
139 public void transformUpdate(List<TerminationPoint> existing,
140 List<TerminationPoint> updated,
141 List<TerminationPoint> orig,
142 InstanceIdentifier<Node> nodePath,
143 LogicalDatastoreType datastoreType,
144 ReadWriteTransaction tx) {
146 if (updated == null) {
147 updated = new ArrayList<>();
150 orig = new ArrayList<>();
152 List<TerminationPoint> added = new ArrayList<>(updated);
154 added = diffOf(added, orig);
155 added = diffOf(added, existing);//do not add the existing data again
156 if (added != null && added.size() > 0) {
157 for (TerminationPoint addedItem : added) {
158 InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, addedItem);
159 TerminationPoint transformedItem = transform(nodePath, addedItem);
160 LOG.trace("adding vlanbindings id {} ", transformedId
161 .firstKeyOf(TerminationPoint.class).getTpId().getValue());
162 tx.put(datastoreType, transformedId, transformedItem, true);
165 for (TerminationPoint origItem : orig) {
166 boolean found = false;
167 for (TerminationPoint newItem : updated) {
168 if (newItem.getKey().equals(origItem.getKey())) {
173 boolean existsInConfig = false;
174 for (TerminationPoint existingItem : existing) {
175 if (existingItem.getKey().equals(origItem.getKey())) {
176 existsInConfig = true;
179 if (existsInConfig) {
180 InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, origItem);
181 LOG.trace("deleting vlanbindings id {} ", transformedId.firstKeyOf(TerminationPoint.class)
182 .getTpId().getValue());
183 tx.delete(datastoreType, transformedId);