525ab09c08429b3569c538ad4cfa6511eaaaa9da
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / ovsdb / transact / TerminationPointUpdateCommand.java
1 /*
2  * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.ovsdb.southbound.ovsdb.transact;
9
10 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
11
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Map.Entry;
17 import java.util.Set;
18
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
20 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
21 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
22 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
23 import org.opendaylight.ovsdb.schema.openvswitch.Port;
24 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbPortInterfaceAttributes.VlanMode;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceOtherConfigs;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortExternalIds;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortOtherConfigs;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
34 import org.opendaylight.yangtools.yang.binding.DataObject;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import com.google.common.collect.ImmutableMap;
40 import com.google.common.collect.Sets;
41
42 public class TerminationPointUpdateCommand extends AbstractTransactCommand {
43
44     private static final Logger LOG = LoggerFactory.getLogger(TerminationPointUpdateCommand.class);
45
46     public TerminationPointUpdateCommand(BridgeOperationalState state,
47             AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
48         super(state, changes);
49     }
50
51     @Override
52     public void execute(TransactionBuilder transaction) {
53         LOG.trace("TerminationPointUpdateCommand called");
54         Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> created =
55             TransactUtils.extractCreated(getChanges(),OvsdbTerminationPointAugmentation.class);
56         for (Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>,
57                  OvsdbTerminationPointAugmentation> terminationPointEntry : created.entrySet()) {
58             updateTerminationPoint(transaction, terminationPointEntry.getKey(), terminationPointEntry.getValue());
59         }
60         Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> updated =
61                 TransactUtils.extractUpdated(getChanges(), OvsdbTerminationPointAugmentation.class);
62         for (Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>,
63                  OvsdbTerminationPointAugmentation> terminationPointEntry : updated.entrySet()) {
64             updateTerminationPoint(transaction, terminationPointEntry.getKey(),
65                     terminationPointEntry.getValue());
66         }
67     }
68
69     public void updateTerminationPoint(TransactionBuilder transaction,
70             InstanceIdentifier<OvsdbTerminationPointAugmentation> iid,
71             OvsdbTerminationPointAugmentation terminationPoint) {
72         if (terminationPoint instanceof OvsdbTerminationPointAugmentation) {
73             LOG.debug("Received request to update termination point {}",
74                     terminationPoint.getName());
75
76             // Update interface
77             Interface ovsInterface =
78                     TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Interface.class);
79             updateInterface(terminationPoint, ovsInterface);
80             Interface extraInterface = TyperUtils.getTypedRowWrapper(
81                     transaction.getDatabaseSchema(), Interface.class);
82             extraInterface.setName("");
83             transaction.add(op.update(ovsInterface)
84                     .where(extraInterface.getNameColumn().getSchema().opEqual(terminationPoint.getName()))
85                     .build());
86
87             TerminationPointCreateCommand.stampInstanceIdentifier(transaction,
88                     iid.firstIdentifierOf(TerminationPoint.class), terminationPoint.getName());
89
90             // Update port
91             Port port = TyperUtils.getTypedRowWrapper(
92                     transaction.getDatabaseSchema(), Port.class);
93             updatePort(terminationPoint,port);
94             Port extraPort = TyperUtils.getTypedRowWrapper(
95                     transaction.getDatabaseSchema(), Port.class);
96             extraPort.setName("");
97             transaction.add(op.update(port)
98                     .where(extraPort.getNameColumn().getSchema().opEqual(terminationPoint.getName()))
99                     .build());
100         }
101     }
102
103     private void updateInterface(
104             final OvsdbTerminationPointAugmentation terminationPoint,
105             final Interface ovsInterface) {
106         updateOfPort(terminationPoint, ovsInterface);
107         updateOfPortRequest(terminationPoint, ovsInterface);
108         updateInterfaceOptions(terminationPoint, ovsInterface);
109         updateInterfaceOtherConfig(terminationPoint, ovsInterface);
110         updateInterfaceExternalIds(terminationPoint, ovsInterface);
111     }
112
113     private void updatePort(
114             final OvsdbTerminationPointAugmentation terminationPoint,
115             final Port port) {
116
117         updatePortOtherConfig(terminationPoint, port);
118         updatePortVlanTag(terminationPoint, port);
119         updatePortVlanTrunk(terminationPoint, port);
120         updatePortVlanMode(terminationPoint, port);
121         updatePortExternalIds(terminationPoint, port);
122     }
123
124     private void updateOfPort(
125             final OvsdbTerminationPointAugmentation terminationPoint,
126             final Interface ovsInterface) {
127
128         Long ofPort = terminationPoint.getOfport();
129         if (ofPort != null) {
130             ovsInterface.setOpenFlowPort(Sets.newHashSet(ofPort));
131         }
132     }
133
134     private void updateOfPortRequest(
135             final OvsdbTerminationPointAugmentation terminationPoint,
136             final Interface ovsInterface) {
137
138         Integer ofPortRequest = terminationPoint.getOfportRequest();
139         if (ofPortRequest != null) {
140             ovsInterface.setOpenFlowPortRequest(Sets.newHashSet(ofPortRequest.longValue()));
141         }
142     }
143
144     private void updateInterfaceOptions(
145             final OvsdbTerminationPointAugmentation terminationPoint,
146             final Interface ovsInterface) {
147
148         //Configure optional input
149         if (terminationPoint.getOptions() != null) {
150             Map<String, String> optionsMap = new HashMap<>();
151             for (Options option : terminationPoint.getOptions()) {
152                 optionsMap.put(option.getOption(), option.getValue());
153             }
154             try {
155                 ovsInterface.setOptions(ImmutableMap.copyOf(optionsMap));
156             } catch (NullPointerException e) {
157                 LOG.warn("Incomplete OVSDB interface options");
158             }
159         }
160     }
161
162     private void updateInterfaceExternalIds(
163             final OvsdbTerminationPointAugmentation terminationPoint,
164             final Interface ovsInterface) {
165
166         List<InterfaceExternalIds> interfaceExternalIds =
167                 terminationPoint.getInterfaceExternalIds();
168         if (interfaceExternalIds != null && !interfaceExternalIds.isEmpty()) {
169             Map<String, String> externalIdsMap = new HashMap<>();
170             for (InterfaceExternalIds externalId: interfaceExternalIds) {
171                 externalIdsMap.put(externalId.getExternalIdKey(), externalId.getExternalIdValue());
172             }
173             try {
174                 ovsInterface.setExternalIds(ImmutableMap.copyOf(externalIdsMap));
175             } catch (NullPointerException e) {
176                 LOG.warn("Incomplete OVSDB interface external_ids");
177             }
178         }
179     }
180
181     private void updateInterfaceOtherConfig(
182             final OvsdbTerminationPointAugmentation terminationPoint,
183             final Interface ovsInterface) {
184
185         List<InterfaceOtherConfigs> interfaceOtherConfigs =
186                 terminationPoint.getInterfaceOtherConfigs();
187         if (interfaceOtherConfigs != null && !interfaceOtherConfigs.isEmpty()) {
188             Map<String, String> otherConfigsMap = new HashMap<>();
189             for (InterfaceOtherConfigs interfaceOtherConfig : interfaceOtherConfigs) {
190                 otherConfigsMap.put(interfaceOtherConfig.getOtherConfigKey(),
191                         interfaceOtherConfig.getOtherConfigValue());
192             }
193             try {
194                 ovsInterface.setOtherConfig(otherConfigsMap);
195             } catch (NullPointerException e) {
196                 LOG.warn("Incomplete OVSDB interface other_config", e);
197             }
198         }
199     }
200
201     private void updatePortExternalIds(
202             final OvsdbTerminationPointAugmentation terminationPoint,
203             final Port port) {
204
205         List<PortExternalIds> portExternalIds = terminationPoint.getPortExternalIds();
206         if (portExternalIds != null && !portExternalIds.isEmpty()) {
207             Map<String, String> externalIdsMap = new HashMap<>();
208             for (PortExternalIds externalId: portExternalIds) {
209                 externalIdsMap.put(externalId.getExternalIdKey(), externalId.getExternalIdValue());
210             }
211             try {
212                 port.setExternalIds(ImmutableMap.copyOf(externalIdsMap));
213             } catch (NullPointerException e) {
214                 LOG.warn("Incomplete OVSDB port external_ids");
215             }
216         }
217     }
218
219     private void updatePortVlanTag(
220             final OvsdbTerminationPointAugmentation terminationPoint,
221             final Port port) {
222
223         if (terminationPoint.getVlanTag() != null) {
224             Set<Long> vlanTag = new HashSet<>();
225             vlanTag.add(terminationPoint.getVlanTag().getValue().longValue());
226             port.setTag(vlanTag);
227         }
228     }
229
230     private void updatePortVlanTrunk(
231             final OvsdbTerminationPointAugmentation terminationPoint,
232             final Port port) {
233
234         if (terminationPoint.getTrunks() != null && terminationPoint.getTrunks().size() > 0) {
235             Set<Long> portTrunks = new HashSet<>();
236             List<Trunks> modelTrunks = terminationPoint.getTrunks();
237             for (Trunks trunk: modelTrunks) {
238                 if (trunk.getTrunk() != null) {
239                     portTrunks.add(trunk.getTrunk().getValue().longValue());
240                 }
241             }
242             port.setTrunks(portTrunks);
243         }
244     }
245
246     private void updatePortVlanMode(
247             final OvsdbTerminationPointAugmentation terminationPoint,
248             final Port port) {
249         if (terminationPoint.getVlanMode() != null) {
250             Set<String> portVlanMode = new HashSet<>();
251             VlanMode modelVlanMode = terminationPoint.getVlanMode();
252             portVlanMode.add(SouthboundConstants.VLANMODES.values()[modelVlanMode.getIntValue() - 1].getMode());
253             port.setVlanMode(portVlanMode);
254         }
255     }
256
257     private void updatePortOtherConfig(
258             final OvsdbTerminationPointAugmentation terminationPoint,
259             final Port ovsPort) {
260         List<PortOtherConfigs> portOtherConfigs =
261                 terminationPoint.getPortOtherConfigs();
262         if (portOtherConfigs != null && !portOtherConfigs.isEmpty()) {
263             Map<String, String> otherConfigsMap = new HashMap<>();
264             for (PortOtherConfigs portOtherConfig : portOtherConfigs) {
265                 otherConfigsMap.put(portOtherConfig.getOtherConfigKey(),
266                         portOtherConfig.getOtherConfigValue());
267             }
268             try {
269                 ovsPort.setOtherConfig(ImmutableMap.copyOf(otherConfigsMap));
270             } catch (NullPointerException e) {
271                 LOG.warn("Incomplete OVSDB port other_config", e);
272             }
273         }
274     }
275
276 }