2 * Copyright (c) 2014 Intel Corp. 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
9 package org.opendaylight.ovsdb.southbound.transactions.md;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Iterator;
14 import java.util.List;
18 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
20 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
21 import org.opendaylight.ovsdb.lib.message.TableUpdates;
22 import org.opendaylight.ovsdb.lib.notation.Column;
23 import org.opendaylight.ovsdb.lib.notation.UUID;
24 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
25 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
26 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
27 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
28 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
29 import org.opendaylight.ovsdb.schema.openvswitch.Port;
30 import org.opendaylight.ovsdb.southbound.OvsdbClientKey;
31 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIds;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.external.ids.attributes.ExternalIdsBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Options;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.OptionsKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.Trunks;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.port._interface.attributes.TrunksBuilder;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
49 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
51 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
52 import org.slf4j.Logger;
53 import org.slf4j.LoggerFactory;
55 import com.google.common.base.Optional;
57 public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
58 private static final Logger LOG = LoggerFactory.getLogger(OvsdbPortUpdateCommand.class);
60 public OvsdbPortUpdateCommand(OvsdbClientKey key, TableUpdates updates,
61 DatabaseSchema dbSchema) {
62 super(key, updates, dbSchema);
66 public void execute(ReadWriteTransaction transaction) {
67 String bridgeName = null;
68 Collection<Port> portUpdatedRows = TyperUtils.extractRowsUpdated(
69 Port.class, getUpdates(), getDbSchema()).values();
70 Collection<Bridge> bridgeUpdatedRows = TyperUtils.extractRowsUpdated(
71 Bridge.class, getUpdates(), getDbSchema()).values();
72 for (Bridge bridge : bridgeUpdatedRows) {
73 Iterator<UUID> bridgePorts = bridge.getPortsColumn().getData()
75 while (bridgePorts.hasNext()) {
76 UUID portUUID = bridgePorts.next();
77 for (Port port : portUpdatedRows) {
78 if (portUUID.equals(port.getUuid())) {
79 Collection<Long> vlanId = port.getTagColumn().getData();
80 Set<Long> portTrunks = port.getTrunksColumn().getData();
81 bridgeName = bridge.getName();
82 NodeId bridgeId = SouthboundMapper.createManagedNodeId(
83 getKey(), new OvsdbBridgeName(bridgeName));
84 final InstanceIdentifier<Node> nodePath = SouthboundMapper
85 .createInstanceIdentifier(bridgeId);
86 Optional<Node> node = Optional.absent();
88 node = transaction.read(
89 LogicalDatastoreType.OPERATIONAL, nodePath)
91 } catch (final ReadFailedException e) {
92 LOG.warn("Read Operational/DS for Node fail! {}",
95 if (node.isPresent()) {
96 NodeBuilder nodeBuilder = new NodeBuilder();
97 nodeBuilder.setNodeId(bridgeId);
99 OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder
100 = new OvsdbTerminationPointAugmentationBuilder();
101 List<TerminationPoint> tpList = new ArrayList<TerminationPoint>();
102 TerminationPointBuilder entry = new TerminationPointBuilder();
103 TpId tpId = SouthboundMapper
104 .createTerminationPointId(getKey(),
105 new OvsdbBridgeName(bridgeName),
108 ovsdbTerminationPointBuilder
109 .setName(port.getName());
110 ovsdbTerminationPointBuilder.setPortUuid(new Uuid(
111 port.getUuid().toString()));
112 if (vlanId.size() > 0) {
113 Iterator<Long> itr = vlanId.iterator();
114 // There are no loops here, just get the first element.
115 int id = itr.next().intValue();
116 ovsdbTerminationPointBuilder.setVlanTag(new VlanId(id));
118 List<Trunks> modelTrunks = new ArrayList<Trunks>();
119 for (Long trunk: portTrunks) {
121 modelTrunks.add(new TrunksBuilder().setTrunk(new VlanId(trunk.intValue())).build());
124 ovsdbTerminationPointBuilder.setTrunks(modelTrunks);
125 Column<GenericTableSchema, Set<UUID>> iface = port.getInterfacesColumn();
126 Set<UUID> ifUuid = iface.getData();
127 Collection<Interface> ifUpdateRows = TyperUtils.extractRowsUpdated(
128 Interface.class, getUpdates(), getDbSchema()).values();
129 for (UUID ifIter : ifUuid) {
130 for (Interface interfIter : ifUpdateRows) {
131 Column<GenericTableSchema, String> typeColumn = interfIter.getTypeColumn();
132 String type = typeColumn.getData();
133 if ((interfIter.getUuid()).equals(ifIter)) {
134 ovsdbTerminationPointBuilder.setInterfaceUuid(
135 new Uuid(interfIter.getUuid().toString()));
136 ovsdbTerminationPointBuilder.setInterfaceType(
137 SouthboundMapper.createInterfaceType(type));
138 Set<Long> ofPorts = interfIter.getOpenFlowPortColumn().getData();
139 if (ofPorts != null && !ofPorts.isEmpty()) {
140 Iterator<Long> ofPortsIter = ofPorts.iterator();
141 long ofPort = ofPortsIter.next();
143 ovsdbTerminationPointBuilder
146 LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
147 bridge.getName(), interfIter.getName(),ofPort);
150 Set<Long> ofPortRequests = interfIter
151 .getOpenFlowPortRequestColumn().getData();
152 if (ofPortRequests != null && !ofPortRequests.isEmpty()) {
153 Iterator<Long> ofPortRequestsIter = ofPortRequests.iterator();
154 int ofPort = ofPortRequestsIter.next().intValue();
156 ovsdbTerminationPointBuilder
157 .setOfportRequest(ofPort);
159 LOG.debug("Received negative value for ofPort from ovsdb for {} {} {}",
160 bridge.getName(), interfIter.getName(),ofPort);
164 Map<String, String> externalIds = interfIter.getExternalIdsColumn().getData();
165 if (externalIds != null && !externalIds.isEmpty()) {
166 Set<String> externalIdKeys = externalIds.keySet();
167 ArrayList<ExternalIds> externalIdsList = new ArrayList<ExternalIds>();
168 String externalIdValue;
169 for (String externalIdKey : externalIdKeys) {
170 externalIdValue = externalIds.get(externalIdKey);
171 if (externalIdKey != null && externalIdValue != null) {
172 externalIdsList.add(new ExternalIdsBuilder()
173 .setExternalIdKey(externalIdKey)
174 .setExternalIdValue(externalIdValue).build());
177 ovsdbTerminationPointBuilder.setExternalIds(externalIdsList);
180 Map<String, String> optionsMap = interfIter.getOptionsColumn().getData();
181 if (optionsMap != null && !optionsMap.isEmpty()) {
182 List<Options> options = new ArrayList<Options>();
183 String optionsValueString;
184 OptionsKey optionsKey;
185 for (String optionsKeyString : optionsMap.keySet()) {
186 optionsValueString = optionsMap.get(optionsKeyString);
187 if (optionsKeyString != null && optionsValueString != null) {
188 optionsKey = new OptionsKey(optionsKeyString);
189 options.add(new OptionsBuilder()
191 .setValue(optionsValueString).build());
194 ovsdbTerminationPointBuilder.setOptions(options);
201 entry.addAugmentation(
202 OvsdbTerminationPointAugmentation.class,
203 ovsdbTerminationPointBuilder.build());
205 tpList.add(entry.build());
206 nodeBuilder.setTerminationPoint(tpList);
207 nodeBuilder.addAugmentation(
208 OvsdbBridgeAugmentation.class,
209 node.get().getAugmentation(
210 OvsdbBridgeAugmentation.class));
211 transaction.merge(LogicalDatastoreType.OPERATIONAL,
212 nodePath, nodeBuilder.build());