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;
17 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
20 import org.opendaylight.ovsdb.lib.message.TableUpdates;
21 import org.opendaylight.ovsdb.lib.notation.Column;
22 import org.opendaylight.ovsdb.lib.notation.UUID;
23 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
24 import org.opendaylight.ovsdb.lib.schema.GenericTableSchema;
25 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
26 import org.opendaylight.ovsdb.schema.openvswitch.Bridge;
27 import org.opendaylight.ovsdb.schema.openvswitch.Interface;
28 import org.opendaylight.ovsdb.schema.openvswitch.Port;
29 import org.opendaylight.ovsdb.southbound.OvsdbClientKey;
30 import org.opendaylight.ovsdb.southbound.SouthboundMapper;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeName;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
42 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;
43 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
47 import com.google.common.base.Optional;
49 public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
50 private static final Logger LOG = LoggerFactory.getLogger(OvsdbPortUpdateCommand.class);
52 public OvsdbPortUpdateCommand(OvsdbClientKey key, TableUpdates updates,
53 DatabaseSchema dbSchema) {
54 super(key, updates, dbSchema);
58 public void execute(ReadWriteTransaction transaction) {
59 String bridgeName = null;
60 Collection<Port> portUpdatedRows = TyperUtils.extractRowsUpdated(
61 Port.class, getUpdates(), getDbSchema()).values();
62 Collection<Bridge> bridgeUpdatedRows = TyperUtils.extractRowsUpdated(
63 Bridge.class, getUpdates(), getDbSchema()).values();
64 for (Bridge bridge : bridgeUpdatedRows) {
65 Iterator<UUID> bridgePorts = bridge.getPortsColumn().getData()
67 while (bridgePorts.hasNext()) {
68 UUID portUUID = bridgePorts.next();
69 for (Port port : portUpdatedRows) {
70 if (portUUID.equals(port.getUuid())) {
71 Collection<Long> vlanId = port.getTagColumn().getData();
72 bridgeName = bridge.getName();
73 NodeId bridgeId = SouthboundMapper.createManagedNodeId(
74 getKey(), new OvsdbBridgeName(bridgeName));
75 final InstanceIdentifier<Node> nodePath = SouthboundMapper
76 .createInstanceIdentifier(bridgeId);
77 Optional<Node> node = Optional.absent();
79 node = transaction.read(
80 LogicalDatastoreType.OPERATIONAL, nodePath)
82 } catch (final ReadFailedException e) {
83 LOG.warn("Read Operational/DS for Node fail! {}",
86 if (node.isPresent()) {
87 NodeBuilder nodeBuilder = new NodeBuilder();
88 nodeBuilder.setNodeId(bridgeId);
90 OvsdbTerminationPointAugmentationBuilder ovsdbTerminationPointBuilder
91 = new OvsdbTerminationPointAugmentationBuilder();
92 List<TerminationPoint> tpList = new ArrayList<TerminationPoint>();
93 TerminationPointBuilder entry = new TerminationPointBuilder();
94 TpId tpId = SouthboundMapper
95 .createTerminationPointId(getKey(),
96 new OvsdbBridgeName(bridgeName),
99 ovsdbTerminationPointBuilder
100 .setName(port.getName());
101 ovsdbTerminationPointBuilder.setPortUuid(new Uuid(
102 port.getUuid().toString()));
103 if (vlanId.size() > 0) {
104 Iterator<Long> itr = vlanId.iterator();
105 if (itr.next() != null) {
106 int id = itr.next().intValue();
107 ovsdbTerminationPointBuilder.setVlanTag(new VlanId(id));
110 Column<GenericTableSchema, Set<UUID>> iface = port.getInterfacesColumn();
111 Set<UUID> ifUuid = iface.getData();
112 Collection<Interface> ifUpdateRows = TyperUtils.extractRowsUpdated(
113 Interface.class, getUpdates(), getDbSchema()).values();
114 for (UUID ifIter : ifUuid) {
115 for (Interface interfIter : ifUpdateRows) {
116 Column<GenericTableSchema, String> typeColumn = interfIter.getTypeColumn();
117 String type = typeColumn.getData();
118 if ((interfIter.getUuid()).equals(ifIter)) {
119 ovsdbTerminationPointBuilder.setInterfaceUuid(
120 new Uuid(interfIter.getUuid().toString()));
121 ovsdbTerminationPointBuilder.setInterfaceType(
122 SouthboundMapper.createInterfaceType(type));
123 Set<Long> ofPorts = interfIter.getOpenFlowPortColumn().getData();
124 if (ofPorts != null && !ofPorts.isEmpty()) {
125 Iterator<Long> ofPortsIter = ofPorts.iterator();
126 ovsdbTerminationPointBuilder
127 .setOfport(ofPortsIter.next().intValue());
129 Set<Long> ofPortRequests = interfIter
130 .getOpenFlowPortRequestColumn().getData();
131 if (ofPortRequests != null && !ofPortRequests.isEmpty()) {
132 Iterator<Long> ofPortRequestsIter = ofPortRequests.iterator();
133 ovsdbTerminationPointBuilder
134 .setOfportRequest(ofPortRequestsIter.next().intValue());
140 entry.addAugmentation(
141 OvsdbTerminationPointAugmentation.class,
142 ovsdbTerminationPointBuilder.build());
144 tpList.add(entry.build());
145 nodeBuilder.setTerminationPoint(tpList);
146 nodeBuilder.addAugmentation(
147 OvsdbBridgeAugmentation.class,
148 node.get().getAugmentation(
149 OvsdbBridgeAugmentation.class));
150 transaction.merge(LogicalDatastoreType.OPERATIONAL,
151 nodePath, nodeBuilder.build());