db1cf06eacb746f0e36c34adaee4de6ebd063246
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / ha / commands / TerminationPointCmd.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.netvirt.elan.l2gw.ha.commands;
9
10 import java.io.Serializable;
11 import java.util.Comparator;
12 import java.util.List;
13 import java.util.stream.Collectors;
14 import javax.annotation.Nullable;
15 import org.opendaylight.netvirt.elan.l2gw.ha.HwvtepHAUtil;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentationBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindings;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical.port.attributes.VlanBindingsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
21 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
24 import org.opendaylight.yangtools.yang.binding.Identifier;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26
27 public class TerminationPointCmd extends MergeCommand<TerminationPoint, NodeBuilder, Node> {
28
29     public TerminationPointCmd() {
30     }
31
32     @Override
33     @Nullable
34     public List<TerminationPoint> getData(Node node) {
35         if (node != null) {
36             return node.getTerminationPoint();
37         }
38         return null;
39     }
40
41     @Override
42     public void setData(NodeBuilder builder, List<TerminationPoint> data) {
43         builder.setTerminationPoint(data);
44     }
45
46     @Override
47     public InstanceIdentifier<TerminationPoint> generateId(InstanceIdentifier<Node> id, TerminationPoint node) {
48         return id.child(TerminationPoint.class, node.key());
49     }
50
51     @Override
52     public TerminationPoint transform(InstanceIdentifier<Node> nodePath, TerminationPoint src) {
53         HwvtepPhysicalPortAugmentation augmentation = src.augmentation(HwvtepPhysicalPortAugmentation.class);
54         if (augmentation == null) {
55             return new TerminationPointBuilder(src).build();
56         }
57         String nodeIdVal = nodePath.firstKeyOf(Node.class).getNodeId().getValue();
58         int idx = nodeIdVal.indexOf("/physicalswitch");
59         if (idx > 0) {
60             nodeIdVal = nodeIdVal.substring(0, idx);
61             nodePath = HwvtepHAUtil.convertToInstanceIdentifier(nodeIdVal);
62         }
63         final InstanceIdentifier<Node> path = nodePath;
64         TerminationPointBuilder tpBuilder = new TerminationPointBuilder(src);
65         tpBuilder.removeAugmentation(HwvtepPhysicalPortAugmentation.class);
66         HwvtepPhysicalPortAugmentationBuilder tpAugmentationBuilder =
67                 new HwvtepPhysicalPortAugmentationBuilder(augmentation);
68
69         if (augmentation.getVlanBindings() != null && augmentation.getVlanBindings().size() > 0) {
70             tpAugmentationBuilder.setVlanBindings(augmentation.getVlanBindings().stream().map(
71                 vlanBindings -> {
72                     VlanBindingsBuilder vlanBindingsBuilder = new VlanBindingsBuilder(vlanBindings);
73                     vlanBindingsBuilder.setLogicalSwitchRef(
74                             HwvtepHAUtil.convertLogicalSwitchRef(vlanBindings.getLogicalSwitchRef(), path));
75                     return vlanBindingsBuilder.build();
76                 }).collect(Collectors.toList()));
77         }
78
79         tpBuilder.addAugmentation(HwvtepPhysicalPortAugmentation.class, tpAugmentationBuilder.build());
80         return tpBuilder.build();
81     }
82
83     @Override
84     public Identifier getKey(TerminationPoint data) {
85         return data.key();
86     }
87
88     @Override
89     public String getDescription() {
90         return "vlanbindings";
91     }
92
93     @Override
94     public TerminationPoint withoutUuid(TerminationPoint data) {
95         return data;
96     }
97
98     @Override
99     public boolean areEqual(TerminationPoint updated, TerminationPoint orig) {
100         if (!updated.key().equals(orig.key())) {
101             return false;
102         }
103         HwvtepPhysicalPortAugmentation updatedAugmentation = updated
104                 .augmentation(HwvtepPhysicalPortAugmentation.class);
105         HwvtepPhysicalPortAugmentation origAugmentation = orig.augmentation(HwvtepPhysicalPortAugmentation.class);
106
107         List<VlanBindings> up = updatedAugmentation != null ? updatedAugmentation.getVlanBindings() : null;
108         List<VlanBindings> or = origAugmentation != null ? origAugmentation.getVlanBindings() : null;
109         if (!areSameSize(up, or)) {
110             return false;
111         }
112         List<VlanBindings> added = diffOf(up, or, bindingsComparator);
113         if (added.size() != 0) {
114             return false;
115         }
116         List<VlanBindings> removed = diffOf(or, up, bindingsComparator);
117         if (removed.size() != 0) {
118             return false;
119         }
120         return true;
121     }
122
123     static BindingsComparator bindingsComparator = new BindingsComparator();
124
125     static class BindingsComparator implements Comparator<VlanBindings>, Serializable {
126         private static final long serialVersionUID = 1L;
127
128         @Override
129         public int compare(VlanBindings updated, VlanBindings orig) {
130             if (updated == null && orig == null) {
131                 return 0;
132             }
133             if (updated == null) {
134                 return 1;
135             }
136             if (orig == null) {
137                 return 1;
138             }
139             if (updated.key().equals(orig.key())) {
140                 return 0;
141             }
142             updated.key();
143             return 1;
144         }
145     }
146 /*
147     @Override
148     public void transformUpdate(List<TerminationPoint> existing,
149                                 List<TerminationPoint> updated,
150                                 List<TerminationPoint> orig,
151                                 InstanceIdentifier<Node> nodePath,
152                                 LogicalDatastoreType datastoreType,
153                                 ReadWriteTransaction tx) {
154
155         if (updated == null) {
156             updated = new ArrayList<>();
157         }
158         if (orig == null) {
159             orig = new ArrayList<>();
160         }
161         List<TerminationPoint> added   = new ArrayList<>(updated);
162
163         added = diffOf(added, orig);
164         added = diffOf(added, existing);//do not add the existing data again
165         if (added != null && added.size() > 0) {
166             for (TerminationPoint addedItem : added) {
167                 InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, addedItem);
168                 TerminationPoint transformedItem = transform(nodePath, addedItem);
169                 LOG.trace("adding vlanbindings id {} ", transformedId
170                                     .firstKeyOf(TerminationPoint.class).getTpId().getValue());
171                 tx.put(datastoreType, transformedId, transformedItem, true);
172             }
173         }
174         for (TerminationPoint origItem : orig) {
175             boolean found = false;
176             for (TerminationPoint newItem : updated) {
177                 if (newItem.key().equals(origItem.key())) {
178                     found = true;
179                 }
180             }
181             if (!found) {
182                 boolean existsInConfig = false;
183                 for (TerminationPoint existingItem : existing) {
184                     if (existingItem.key().equals(origItem.key())) {
185                         existsInConfig = true;
186                     }
187                 }
188                 if (existsInConfig) {
189                     InstanceIdentifier<TerminationPoint> transformedId = generateId(nodePath, origItem);
190                     LOG.trace("deleting vlanbindings id {} ", transformedId.firstKeyOf(TerminationPoint.class)
191                                                                                 .getTpId().getValue());
192                     tx.delete(datastoreType, transformedId);
193                 }
194             }
195         }
196     }
197 */
198
199 }