Merge "Add IT for southbound"
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / transactions / md / OvsdbPortUpdateCommand.java
1 /*
2  * Copyright (c) 2014 Intel Corp. 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
9 package org.opendaylight.ovsdb.southbound.transactions.md;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.Iterator;
14 import java.util.List;
15 import java.util.Set;
16
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;
46
47 import com.google.common.base.Optional;
48
49 public class OvsdbPortUpdateCommand extends AbstractTransactionCommand {
50     private static final Logger LOG = LoggerFactory.getLogger(OvsdbPortUpdateCommand.class);
51
52     public OvsdbPortUpdateCommand(OvsdbClientKey key, TableUpdates updates,
53             DatabaseSchema dbSchema) {
54         super(key, updates, dbSchema);
55     }
56
57     @Override
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()
66                     .iterator();
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();
78                         try {
79                             node = transaction.read(
80                                     LogicalDatastoreType.OPERATIONAL, nodePath)
81                                     .checkedGet();
82                         } catch (final ReadFailedException e) {
83                             LOG.warn("Read Operational/DS for Node fail! {}",
84                                     nodePath, e);
85                         }
86                         if (node.isPresent()) {
87                             NodeBuilder nodeBuilder = new NodeBuilder();
88                             nodeBuilder.setNodeId(bridgeId);
89
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),
97                                             port.getName());
98                             entry.setTpId(tpId);
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));
108                                 }
109                             }
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());
128                                         }
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());
135                                         }
136                                         break;
137                                     }
138                                 }
139                             }
140                             entry.addAugmentation(
141                                     OvsdbTerminationPointAugmentation.class,
142                                     ovsdbTerminationPointBuilder.build());
143
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());
152                         }
153                     }
154                 }
155             }
156         }
157     }
158 }