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