2 * Copyright (c) 2015 Brocade Communications Systems, Inc. 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.ovsdb.southbound.ovsdb.transact;
10 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
12 import java.util.HashMap;
13 import java.util.HashSet;
14 import java.util.List;
16 import java.util.Map.Entry;
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
20 import org.opendaylight.ovsdb.lib.notation.UUID;
21 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
22 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
23 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
24 import org.opendaylight.ovsdb.schema.openvswitch.Port;
25 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbPortInterfaceAttributes.VlanMode;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceExternalIds;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.InterfaceOtherConfigs;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortExternalIds;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.PortOtherConfigs;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
36 import org.opendaylight.yangtools.yang.binding.DataObject;
37 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 import com.google.common.collect.ImmutableMap;
42 import com.google.common.collect.Sets;
44 public class TerminationPointUpdateCommand extends AbstractTransactCommand {
46 private static final Logger LOG = LoggerFactory.getLogger(TerminationPointUpdateCommand.class);
48 public TerminationPointUpdateCommand(BridgeOperationalState state,
49 AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes) {
50 super(state, changes);
54 public void execute(TransactionBuilder transaction) {
55 LOG.trace("TerminationPointUpdateCommand called");
56 Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> created =
57 TransactUtils.extractCreated(getChanges(),OvsdbTerminationPointAugmentation.class);
58 for (Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>,
59 OvsdbTerminationPointAugmentation> terminationPointEntry : created.entrySet()) {
60 updateTerminationPoint(transaction, terminationPointEntry.getKey(), terminationPointEntry.getValue());
62 Map<InstanceIdentifier<OvsdbTerminationPointAugmentation>, OvsdbTerminationPointAugmentation> updated =
63 TransactUtils.extractUpdated(getChanges(), OvsdbTerminationPointAugmentation.class);
64 for (Entry<InstanceIdentifier<OvsdbTerminationPointAugmentation>,
65 OvsdbTerminationPointAugmentation> terminationPointEntry : updated.entrySet()) {
66 updateTerminationPoint(transaction, terminationPointEntry.getKey(),
67 terminationPointEntry.getValue());
71 public void updateTerminationPoint(TransactionBuilder transaction,
72 InstanceIdentifier<OvsdbTerminationPointAugmentation> iid,
73 OvsdbTerminationPointAugmentation terminationPoint) {
74 if (terminationPoint instanceof OvsdbTerminationPointAugmentation) {
75 LOG.debug("Received request to update termination point {}",
76 terminationPoint.getName());
79 Interface ovsInterface =
80 TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(), Interface.class);
81 updateInterface(terminationPoint, ovsInterface);
82 Interface extraInterface = TyperUtils.getTypedRowWrapper(
83 transaction.getDatabaseSchema(), Interface.class);
84 extraInterface.setName("");
85 transaction.add(op.update(ovsInterface)
86 .where(extraInterface.getNameColumn().getSchema().opEqual(terminationPoint.getName()))
89 TerminationPointCreateCommand.stampInstanceIdentifier(transaction,
90 iid.firstIdentifierOf(TerminationPoint.class), terminationPoint.getName());
93 Port port = TyperUtils.getTypedRowWrapper(
94 transaction.getDatabaseSchema(), Port.class);
95 updatePort(terminationPoint,port);
96 Port extraPort = TyperUtils.getTypedRowWrapper(
97 transaction.getDatabaseSchema(), Port.class);
98 extraPort.setName("");
99 transaction.add(op.update(port)
100 .where(extraPort.getNameColumn().getSchema().opEqual(terminationPoint.getName()))
105 private void updateInterface(
106 final OvsdbTerminationPointAugmentation terminationPoint,
107 final Interface ovsInterface) {
108 updateOfPort(terminationPoint, ovsInterface);
109 updateOfPortRequest(terminationPoint, ovsInterface);
110 updateInterfaceOptions(terminationPoint, ovsInterface);
111 updateInterfaceOtherConfig(terminationPoint, ovsInterface);
112 updateInterfaceExternalIds(terminationPoint, ovsInterface);
115 private void updatePort(
116 final OvsdbTerminationPointAugmentation terminationPoint,
119 updatePortOtherConfig(terminationPoint, port);
120 updatePortVlanTag(terminationPoint, port);
121 updatePortVlanTrunk(terminationPoint, port);
122 updatePortVlanMode(terminationPoint, port);
123 updatePortExternalIds(terminationPoint, port);
124 updatePortQos(terminationPoint, port);
127 private void updatePortQos(
128 final OvsdbTerminationPointAugmentation terminationPoint,
131 Set<UUID> uuidSet = Sets.newHashSet();
132 Uuid qosUuid = terminationPoint.getQos();
133 if (qosUuid != null) {
134 uuidSet.add(new UUID(qosUuid.getValue()));
136 port.setQos(uuidSet);
140 private void updateOfPort(
141 final OvsdbTerminationPointAugmentation terminationPoint,
142 final Interface ovsInterface) {
144 Long ofPort = terminationPoint.getOfport();
145 if (ofPort != null) {
146 ovsInterface.setOpenFlowPort(Sets.newHashSet(ofPort));
150 private void updateOfPortRequest(
151 final OvsdbTerminationPointAugmentation terminationPoint,
152 final Interface ovsInterface) {
154 Integer ofPortRequest = terminationPoint.getOfportRequest();
155 if (ofPortRequest != null) {
156 ovsInterface.setOpenFlowPortRequest(Sets.newHashSet(ofPortRequest.longValue()));
160 private void updateInterfaceOptions(
161 final OvsdbTerminationPointAugmentation terminationPoint,
162 final Interface ovsInterface) {
164 //Configure optional input
165 if (terminationPoint.getOptions() != null) {
166 Map<String, String> optionsMap = new HashMap<>();
167 for (Options option : terminationPoint.getOptions()) {
168 optionsMap.put(option.getOption(), option.getValue());
171 ovsInterface.setOptions(ImmutableMap.copyOf(optionsMap));
172 } catch (NullPointerException e) {
173 LOG.warn("Incomplete OVSDB interface options");
178 private void updateInterfaceExternalIds(
179 final OvsdbTerminationPointAugmentation terminationPoint,
180 final Interface ovsInterface) {
182 List<InterfaceExternalIds> interfaceExternalIds =
183 terminationPoint.getInterfaceExternalIds();
184 if (interfaceExternalIds != null && !interfaceExternalIds.isEmpty()) {
185 Map<String, String> externalIdsMap = new HashMap<>();
186 for (InterfaceExternalIds externalId: interfaceExternalIds) {
187 externalIdsMap.put(externalId.getExternalIdKey(), externalId.getExternalIdValue());
190 ovsInterface.setExternalIds(ImmutableMap.copyOf(externalIdsMap));
191 } catch (NullPointerException e) {
192 LOG.warn("Incomplete OVSDB interface external_ids");
197 private void updateInterfaceOtherConfig(
198 final OvsdbTerminationPointAugmentation terminationPoint,
199 final Interface ovsInterface) {
201 List<InterfaceOtherConfigs> interfaceOtherConfigs =
202 terminationPoint.getInterfaceOtherConfigs();
203 if (interfaceOtherConfigs != null && !interfaceOtherConfigs.isEmpty()) {
204 Map<String, String> otherConfigsMap = new HashMap<>();
205 for (InterfaceOtherConfigs interfaceOtherConfig : interfaceOtherConfigs) {
206 otherConfigsMap.put(interfaceOtherConfig.getOtherConfigKey(),
207 interfaceOtherConfig.getOtherConfigValue());
210 ovsInterface.setOtherConfig(otherConfigsMap);
211 } catch (NullPointerException e) {
212 LOG.warn("Incomplete OVSDB interface other_config", e);
217 private void updatePortExternalIds(
218 final OvsdbTerminationPointAugmentation terminationPoint,
221 List<PortExternalIds> portExternalIds = terminationPoint.getPortExternalIds();
222 if (portExternalIds != null && !portExternalIds.isEmpty()) {
223 Map<String, String> externalIdsMap = new HashMap<>();
224 for (PortExternalIds externalId: portExternalIds) {
225 externalIdsMap.put(externalId.getExternalIdKey(), externalId.getExternalIdValue());
228 port.setExternalIds(ImmutableMap.copyOf(externalIdsMap));
229 } catch (NullPointerException e) {
230 LOG.warn("Incomplete OVSDB port external_ids");
235 private void updatePortVlanTag(
236 final OvsdbTerminationPointAugmentation terminationPoint,
239 if (terminationPoint.getVlanTag() != null) {
240 Set<Long> vlanTag = new HashSet<>();
241 vlanTag.add(terminationPoint.getVlanTag().getValue().longValue());
242 port.setTag(vlanTag);
246 private void updatePortVlanTrunk(
247 final OvsdbTerminationPointAugmentation terminationPoint,
250 if (terminationPoint.getTrunks() != null && terminationPoint.getTrunks().size() > 0) {
251 Set<Long> portTrunks = new HashSet<>();
252 List<Trunks> modelTrunks = terminationPoint.getTrunks();
253 for (Trunks trunk: modelTrunks) {
254 if (trunk.getTrunk() != null) {
255 portTrunks.add(trunk.getTrunk().getValue().longValue());
258 port.setTrunks(portTrunks);
262 private void updatePortVlanMode(
263 final OvsdbTerminationPointAugmentation terminationPoint,
265 if (terminationPoint.getVlanMode() != null) {
266 Set<String> portVlanMode = new HashSet<>();
267 VlanMode modelVlanMode = terminationPoint.getVlanMode();
268 portVlanMode.add(SouthboundConstants.VLANMODES.values()[modelVlanMode.getIntValue() - 1].getMode());
269 port.setVlanMode(portVlanMode);
273 private void updatePortOtherConfig(
274 final OvsdbTerminationPointAugmentation terminationPoint,
275 final Port ovsPort) {
276 List<PortOtherConfigs> portOtherConfigs =
277 terminationPoint.getPortOtherConfigs();
278 if (portOtherConfigs != null && !portOtherConfigs.isEmpty()) {
279 Map<String, String> otherConfigsMap = new HashMap<>();
280 for (PortOtherConfigs portOtherConfig : portOtherConfigs) {
281 otherConfigsMap.put(portOtherConfig.getOtherConfigKey(),
282 portOtherConfig.getOtherConfigValue());
285 ovsPort.setOtherConfig(ImmutableMap.copyOf(otherConfigsMap));
286 } catch (NullPointerException e) {
287 LOG.warn("Incomplete OVSDB port other_config", e);