blob: 0d3bf36cd3d0d2c02db4d6180b655d3b97aeaec1 [file] [log] [blame]
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.ovsdb.controller.driver;
17
18import io.netty.channel.Channel;
lishuai6c56f5e2015-11-17 16:38:19 +080019
Ray Milkeyb1250322017-06-05 17:18:17 -070020import java.net.InetSocketAddress;
21import java.util.ArrayList;
22import java.util.HashMap;
23import java.util.HashSet;
24import java.util.Iterator;
25import java.util.List;
26import java.util.Map;
27import java.util.Objects;
28import java.util.Optional;
29import java.util.Set;
30import java.util.concurrent.ConcurrentMap;
31import java.util.concurrent.ExecutionException;
32import java.util.concurrent.TimeUnit;
33import java.util.concurrent.TimeoutException;
34import java.util.concurrent.atomic.AtomicReference;
Saritha1583a6f2017-06-16 14:42:58 +053035import java.util.function.Consumer;
36import java.util.Collections;
Ray Milkeyb1250322017-06-05 17:18:17 -070037import java.util.stream.Collectors;
38
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070039import org.onlab.packet.IpAddress;
andreaed976a42015-10-05 14:38:25 -070040import org.onosproject.net.DeviceId;
Frank Wange11a98d2016-10-26 17:04:03 +080041import org.onosproject.net.PortNumber;
andreaed976a42015-10-05 14:38:25 -070042import org.onosproject.net.behaviour.ControllerInfo;
Pier Ventref5d72362016-07-17 12:02:14 +020043import org.onosproject.net.behaviour.MirroringName;
Ray Milkeyb1250322017-06-05 17:18:17 -070044import org.onosproject.net.behaviour.MirroringStatistics;
Frank Wange11a98d2016-10-26 17:04:03 +080045import org.onosproject.net.behaviour.QosId;
tanbangchengc944c282017-11-12 20:42:59 +080046import org.onosproject.net.behaviour.QueueDescription;
Frank Wange11a98d2016-10-26 17:04:03 +080047import org.onosproject.net.behaviour.QueueId;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070048import org.onosproject.ovsdb.controller.OvsdbBridge;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070049import org.onosproject.ovsdb.controller.OvsdbClientService;
Hyunsun Moondd14e8e2016-06-09 16:17:32 -070050import org.onosproject.ovsdb.controller.OvsdbInterface;
Pier Ventref5d72362016-07-17 12:02:14 +020051import org.onosproject.ovsdb.controller.OvsdbMirror;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070052import org.onosproject.ovsdb.controller.OvsdbNodeId;
53import org.onosproject.ovsdb.controller.OvsdbPort;
54import org.onosproject.ovsdb.controller.OvsdbPortName;
55import org.onosproject.ovsdb.controller.OvsdbPortNumber;
Frank Wange11a98d2016-10-26 17:04:03 +080056import org.onosproject.ovsdb.controller.OvsdbQos;
57import org.onosproject.ovsdb.controller.OvsdbQueue;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070058import org.onosproject.ovsdb.controller.OvsdbRowStore;
59import org.onosproject.ovsdb.controller.OvsdbStore;
60import org.onosproject.ovsdb.controller.OvsdbTableStore;
Saritha1583a6f2017-06-16 14:42:58 +053061import org.onosproject.ovsdb.rfc.exception.ColumnSchemaNotFoundException;
62import org.onosproject.ovsdb.rfc.exception.VersionMismatchException;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070063import org.onosproject.ovsdb.rfc.jsonrpc.Callback;
64import org.onosproject.ovsdb.rfc.message.OperationResult;
65import org.onosproject.ovsdb.rfc.message.TableUpdates;
Frank Wange11a98d2016-10-26 17:04:03 +080066import org.onosproject.ovsdb.rfc.notation.Column;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070067import org.onosproject.ovsdb.rfc.notation.Condition;
68import org.onosproject.ovsdb.rfc.notation.Mutation;
CNluciusa66c3972015-09-06 20:31:29 +080069import org.onosproject.ovsdb.rfc.notation.OvsdbMap;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070070import org.onosproject.ovsdb.rfc.notation.OvsdbSet;
71import org.onosproject.ovsdb.rfc.notation.Row;
Jonathan Hart51539b82015-10-29 09:53:04 -070072import org.onosproject.ovsdb.rfc.notation.Uuid;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070073import org.onosproject.ovsdb.rfc.operations.Delete;
74import org.onosproject.ovsdb.rfc.operations.Insert;
75import org.onosproject.ovsdb.rfc.operations.Mutate;
76import org.onosproject.ovsdb.rfc.operations.Operation;
77import org.onosproject.ovsdb.rfc.operations.Update;
78import org.onosproject.ovsdb.rfc.schema.ColumnSchema;
79import org.onosproject.ovsdb.rfc.schema.DatabaseSchema;
80import org.onosproject.ovsdb.rfc.schema.TableSchema;
81import org.onosproject.ovsdb.rfc.table.Bridge;
82import org.onosproject.ovsdb.rfc.table.Controller;
83import org.onosproject.ovsdb.rfc.table.Interface;
Pier Ventref5d72362016-07-17 12:02:14 +020084import org.onosproject.ovsdb.rfc.table.Mirror;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070085import org.onosproject.ovsdb.rfc.table.OvsdbTable;
86import org.onosproject.ovsdb.rfc.table.Port;
Frank Wange11a98d2016-10-26 17:04:03 +080087import org.onosproject.ovsdb.rfc.table.Qos;
88import org.onosproject.ovsdb.rfc.table.Queue;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -070089import org.onosproject.ovsdb.rfc.table.TableGenerator;
90import org.onosproject.ovsdb.rfc.utils.ConditionUtil;
91import org.onosproject.ovsdb.rfc.utils.FromJsonUtil;
92import org.onosproject.ovsdb.rfc.utils.JsonRpcWriterUtil;
93import org.onosproject.ovsdb.rfc.utils.MutationUtil;
94import org.slf4j.Logger;
95import org.slf4j.LoggerFactory;
96
Ray Milkeyb1250322017-06-05 17:18:17 -070097import com.fasterxml.jackson.databind.JsonNode;
98import com.google.common.base.Function;
99import com.google.common.collect.ImmutableList;
100import com.google.common.collect.ImmutableSet;
101import com.google.common.collect.Lists;
102import com.google.common.collect.Maps;
103import com.google.common.collect.Sets;
104import com.google.common.util.concurrent.Futures;
105import com.google.common.util.concurrent.ListenableFuture;
106import com.google.common.util.concurrent.SettableFuture;
Pier Ventref5d72362016-07-17 12:02:14 +0200107
Ray Milkeyb1250322017-06-05 17:18:17 -0700108import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGE;
109import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGES;
110import static org.onosproject.ovsdb.controller.OvsdbConstant.CONTROLLER;
111import static org.onosproject.ovsdb.controller.OvsdbConstant.DATABASENAME;
112import static org.onosproject.ovsdb.controller.OvsdbConstant.EXTERNAL_ID;
113import static org.onosproject.ovsdb.controller.OvsdbConstant.EXTERNAL_ID_INTERFACE_ID;
114import static org.onosproject.ovsdb.controller.OvsdbConstant.INTERFACE;
115import static org.onosproject.ovsdb.controller.OvsdbConstant.INTERFACES;
116import static org.onosproject.ovsdb.controller.OvsdbConstant.MIRROR;
117import static org.onosproject.ovsdb.controller.OvsdbConstant.MIRRORS;
118import static org.onosproject.ovsdb.controller.OvsdbConstant.OFPORT;
119import static org.onosproject.ovsdb.controller.OvsdbConstant.PORT;
120import static org.onosproject.ovsdb.controller.OvsdbConstant.PORTS;
121import static org.onosproject.ovsdb.controller.OvsdbConstant.PORT_QOS;
122import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS;
123import static org.onosproject.ovsdb.controller.OvsdbConstant.QOS_EXTERNAL_ID_KEY;
124import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUE;
125import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUES;
126import static org.onosproject.ovsdb.controller.OvsdbConstant.QUEUE_EXTERNAL_ID_KEY;
127import static org.onosproject.ovsdb.controller.OvsdbConstant.TYPEVXLAN;
128import static org.onosproject.ovsdb.controller.OvsdbConstant.UUID;
Saritha8a0c36a2017-07-04 15:01:35 +0530129import static org.onosproject.ovsdb.controller.OvsdbConstant.BRIDGE_CONTROLLER;
Saritha1583a6f2017-06-16 14:42:58 +0530130import static org.onosproject.ovsdb.controller.OvsdbConstant.OFPORT_ERROR;
Hyunsun Moon1251e192016-06-07 16:57:05 -0700131
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700132/**
133 * An representation of an ovsdb client.
134 */
Hyunsun Moon1251e192016-06-07 16:57:05 -0700135public class DefaultOvsdbClient implements OvsdbProviderService, OvsdbClientService {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700136
jaegonkim01d7c912017-01-22 22:03:38 +0900137 private static final int TRANSACTCONFIG_TIMEOUT = 3; //sec
Saritha1583a6f2017-06-16 14:42:58 +0530138 private static final int OFPORT_ERROR_COMPARISON = 0;
jaegonkim01d7c912017-01-22 22:03:38 +0900139
Hyunsun Moon1251e192016-06-07 16:57:05 -0700140 private final Logger log = LoggerFactory.getLogger(DefaultOvsdbClient.class);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700141
142 private Channel channel;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700143 private OvsdbAgent agent;
144 private boolean connected;
145 private OvsdbNodeId nodeId;
146 private Callback monitorCallBack;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700147 private OvsdbStore ovsdbStore = new OvsdbStore();
148
149 private final Map<String, String> requestMethod = Maps.newHashMap();
Hyunsun Moon1251e192016-06-07 16:57:05 -0700150 private final Map<String, SettableFuture<? extends Object>> requestResult = Maps.newHashMap();
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700151 private final Map<String, DatabaseSchema> schema = Maps.newHashMap();
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700152
Pier Ventref5d72362016-07-17 12:02:14 +0200153
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700154 /**
155 * Creates an OvsdbClient.
156 *
157 * @param nodeId ovsdb node id
158 */
159 public DefaultOvsdbClient(OvsdbNodeId nodeId) {
160 this.nodeId = nodeId;
161 }
162
163 @Override
164 public OvsdbNodeId nodeId() {
165 return nodeId;
166 }
167
168 @Override
169 public void setAgent(OvsdbAgent agent) {
170 if (this.agent == null) {
171 this.agent = agent;
172 }
173 }
174
175 @Override
176 public void setChannel(Channel channel) {
177 this.channel = channel;
178 }
179
180 @Override
181 public void setConnection(boolean connected) {
182 this.connected = connected;
183 }
184
185 @Override
186 public boolean isConnected() {
187 return this.connected;
188 }
189
190 @Override
191 public void nodeAdded() {
192 this.agent.addConnectedNode(nodeId, this);
193 }
194
195 @Override
196 public void nodeRemoved() {
197 this.agent.removeConnectedNode(nodeId);
198 channel.disconnect();
199 }
200
201 /**
202 * Gets the ovsdb table store.
203 *
204 * @param dbName the ovsdb database name
205 * @return ovsTableStore, empty if table store is find
206 */
207 private OvsdbTableStore getTableStore(String dbName) {
208 if (ovsdbStore == null) {
209 return null;
210 }
211 return ovsdbStore.getOvsdbTableStore(dbName);
212 }
213
214 /**
215 * Gets the ovsdb row store.
216 *
andreaed976a42015-10-05 14:38:25 -0700217 * @param dbName the ovsdb database name
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700218 * @param tableName the ovsdb table name
Hyunsun Moon6125c612015-10-15 10:54:44 -0700219 * @return ovsRowStore, empty store if no rows exist in the table
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700220 */
221 private OvsdbRowStore getRowStore(String dbName, String tableName) {
222 OvsdbTableStore tableStore = getTableStore(dbName);
223 if (tableStore == null) {
224 return null;
225 }
Hyunsun Moon6125c612015-10-15 10:54:44 -0700226
227 OvsdbRowStore rowStore = tableStore.getRows(tableName);
228 if (rowStore == null) {
229 rowStore = new OvsdbRowStore();
230 }
231 return rowStore;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700232 }
233
234 /**
235 * Gets the ovsdb row.
236 *
andreaed976a42015-10-05 14:38:25 -0700237 * @param dbName the ovsdb database name
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700238 * @param tableName the ovsdb table name
andreaed976a42015-10-05 14:38:25 -0700239 * @param uuid the key of the row
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700240 * @return row, empty if row is find
241 */
242 @Override
243 public Row getRow(String dbName, String tableName, String uuid) {
244 OvsdbTableStore tableStore = getTableStore(dbName);
245 if (tableStore == null) {
246 return null;
247 }
248 OvsdbRowStore rowStore = tableStore.getRows(tableName);
249 if (rowStore == null) {
250 return null;
251 }
252 return rowStore.getRow(uuid);
253 }
254
255 @Override
256 public void removeRow(String dbName, String tableName, String uuid) {
257 OvsdbTableStore tableStore = getTableStore(dbName);
258 if (tableStore == null) {
259 return;
260 }
261 OvsdbRowStore rowStore = tableStore.getRows(tableName);
262 if (rowStore == null) {
263 return;
264 }
265 rowStore.deleteRow(uuid);
266 }
267
268 @Override
269 public void updateOvsdbStore(String dbName, String tableName, String uuid,
270 Row row) {
271 OvsdbTableStore tableStore = ovsdbStore.getOvsdbTableStore(dbName);
272 if (tableStore == null) {
273 tableStore = new OvsdbTableStore();
274 }
275 OvsdbRowStore rowStore = tableStore.getRows(tableName);
276 if (rowStore == null) {
277 rowStore = new OvsdbRowStore();
278 }
279 rowStore.insertRow(uuid, row);
280 tableStore.createOrUpdateTable(tableName, rowStore);
281 ovsdbStore.createOrUpdateOvsdbStore(dbName, tableStore);
282 }
283
Pier Ventref5d72362016-07-17 12:02:14 +0200284 /**
285 * Gets the Mirror uuid.
286 *
287 * @param mirrorName mirror name
288 * @return mirror uuid, empty if no uuid is found
289 */
290 @Override
291 public String getMirrorUuid(String mirrorName) {
292 DatabaseSchema dbSchema = schema.get(DATABASENAME);
293 OvsdbRowStore rowStore = getRowStore(DATABASENAME, MIRROR);
294 if (rowStore == null) {
295 log.warn("The mirror uuid is null");
296 return null;
297 }
298
299 ConcurrentMap<String, Row> mirrorTableRows = rowStore.getRowStore();
300 if (mirrorTableRows == null) {
301 log.warn("The mirror uuid is null");
302 return null;
303 }
304
305 for (String uuid : mirrorTableRows.keySet()) {
306 Mirror mirror = (Mirror) TableGenerator
307 .getTable(dbSchema, mirrorTableRows.get(uuid), OvsdbTable.MIRROR);
308 String name = mirror.getName();
309 if (name.contains(mirrorName)) {
310 return uuid;
311 }
312 }
313 log.warn("Mirroring not found");
314 return null;
315 }
316
317 /**
318 * Gets mirrors of the device.
319 *
320 * @param deviceId target device id
321 * @return set of mirroring; empty if no mirror is found
322 */
323 @Override
324 public Set<MirroringStatistics> getMirroringStatistics(DeviceId deviceId) {
325 Uuid bridgeUuid = getBridgeUuid(deviceId);
326 if (bridgeUuid == null) {
327 log.warn("Couldn't find bridge {} in {}", deviceId, nodeId.getIpAddress());
328 return null;
329 }
330
331 List<MirroringStatistics> mirrorings = getMirrorings(bridgeUuid);
332 if (mirrorings == null) {
333 log.warn("Couldn't find mirrors in {}", nodeId.getIpAddress());
334 return null;
335 }
336 return ImmutableSet.copyOf(mirrorings);
337 }
338
339 /**
340 * Helper method which retrieves mirrorings statistics using bridge uuid.
341 *
342 * @param bridgeUuid the uuid of the bridge
343 * @return the list of the mirrorings statistics.
344 */
345 private List<MirroringStatistics> getMirrorings(Uuid bridgeUuid) {
346 DatabaseSchema dbSchema = schema.get(DATABASENAME);
347 if (dbSchema == null) {
348 log.warn("Unable to retrieve dbSchema {}", DATABASENAME);
349 return null;
350 }
351 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
352 if (rowStore == null) {
353 log.warn("Unable to retrieve rowStore {} of {}", BRIDGE, DATABASENAME);
354 return null;
355 }
356
357 Row bridgeRow = rowStore.getRow(bridgeUuid.value());
358 Bridge bridge = (Bridge) TableGenerator.
359 getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
360
361 Set<Uuid> mirroringsUuids = (Set<Uuid>) ((OvsdbSet) bridge
362 .getMirrorsColumn().data()).set();
363
364 OvsdbRowStore mirrorRowStore = getRowStore(DATABASENAME, MIRROR);
365 if (mirrorRowStore == null) {
366 log.warn("Unable to retrieve rowStore {} of {}", MIRROR, DATABASENAME);
367 return null;
368 }
369
370 List<MirroringStatistics> mirroringStatistics = new ArrayList<>();
371 ConcurrentMap<String, Row> mirrorTableRows = mirrorRowStore.getRowStore();
372 mirrorTableRows.forEach((key, row) -> {
373 if (!mirroringsUuids.contains(Uuid.uuid(key))) {
374 return;
375 }
376 Mirror mirror = (Mirror) TableGenerator
377 .getTable(dbSchema, row, OvsdbTable.MIRROR);
378 mirroringStatistics.add(MirroringStatistics.mirroringStatistics(mirror.getName(),
379 (Map<String, Integer>) ((OvsdbMap) mirror
380 .getStatisticsColumn().data()).map()));
381 });
382 return ImmutableList.copyOf(mirroringStatistics);
383 }
384
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700385 @Override
386 public String getPortUuid(String portName, String bridgeUuid) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700387 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700388
Hyunsun Moon1251e192016-06-07 16:57:05 -0700389 Row bridgeRow = getRow(DATABASENAME, BRIDGE, bridgeUuid);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700390 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow,
391 OvsdbTable.BRIDGE);
392 if (bridge != null) {
393 OvsdbSet setPorts = (OvsdbSet) bridge.getPortsColumn().data();
394 @SuppressWarnings("unchecked")
Jonathan Hart51539b82015-10-29 09:53:04 -0700395 Set<Uuid> ports = setPorts.set();
Jon Hallcbd1b392017-01-18 20:15:44 -0800396 if (ports == null || ports.isEmpty()) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700397 log.warn("The port uuid is null");
398 return null;
399 }
400
Jonathan Hart51539b82015-10-29 09:53:04 -0700401 for (Uuid uuid : ports) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700402 Row portRow = getRow(DATABASENAME, PORT, uuid.value());
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700403 Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
404 OvsdbTable.PORT);
405 if (port != null && portName.equalsIgnoreCase(port.getName())) {
406 return uuid.value();
407 }
408 }
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700409 }
410 return null;
411 }
412
413 @Override
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700414 public String getBridgeUuid(String bridgeName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700415 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Hyunsun Moon1251e192016-06-07 16:57:05 -0700416 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700417 if (rowStore == null) {
418 log.debug("The bridge uuid is null");
419 return null;
420 }
421
422 ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
423 if (bridgeTableRows == null) {
424 log.debug("The bridge uuid is null");
425 return null;
426 }
427
428 for (String uuid : bridgeTableRows.keySet()) {
429 Bridge bridge = (Bridge) TableGenerator
Hyunsun Moon1251e192016-06-07 16:57:05 -0700430 .getTable(dbSchema, bridgeTableRows.get(uuid), OvsdbTable.BRIDGE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700431 if (bridge.getName().equals(bridgeName)) {
432 return uuid;
433 }
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700434 }
435 return null;
436 }
437
Hyunsun Moondd14e8e2016-06-09 16:17:32 -0700438 private String getOvsUuid(String dbName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700439 OvsdbRowStore rowStore = getRowStore(DATABASENAME, DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700440 if (rowStore == null) {
441 log.debug("The bridge uuid is null");
442 return null;
443 }
444 ConcurrentMap<String, Row> ovsTableRows = rowStore.getRowStore();
445 if (ovsTableRows != null) {
446 for (String uuid : ovsTableRows.keySet()) {
447 Row row = ovsTableRows.get(uuid);
448 String tableName = row.tableName();
449 if (tableName.equals(dbName)) {
450 return uuid;
451 }
452 }
453 }
454 return null;
455 }
456
457 @Override
458 public void createPort(String bridgeName, String portName) {
459 String bridgeUuid = getBridgeUuid(bridgeName);
460 if (bridgeUuid == null) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700461 log.error("Can't find bridge {} in {}", bridgeName, nodeId.getIpAddress());
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700462 return;
463 }
464
Hyunsun Moon1251e192016-06-07 16:57:05 -0700465 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700466 String portUuid = getPortUuid(portName, bridgeUuid);
Hyunsun Moon1251e192016-06-07 16:57:05 -0700467 Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700468 port.setName(portName);
469 if (portUuid == null) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700470 insertConfig(PORT, UUID, BRIDGE, PORTS, bridgeUuid, port.getRow());
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700471 }
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700472 }
473
474 @Override
475 public void dropPort(String bridgeName, String portName) {
476 String bridgeUuid = getBridgeUuid(bridgeName);
477 if (bridgeUuid == null) {
478 log.error("Could not find Bridge {} in {}", bridgeName, nodeId);
479 return;
480 }
481
482 String portUuid = getPortUuid(portName, bridgeUuid);
483 if (portUuid != null) {
484 log.info("Port {} delete", portName);
Frank Wange11a98d2016-10-26 17:04:03 +0800485 deleteConfig(PORT, UUID, portUuid, BRIDGE, PORTS, Uuid.uuid(portUuid));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700486 }
487 }
488
lishuai6c56f5e2015-11-17 16:38:19 +0800489 @Override
Hyunsun Moon1251e192016-06-07 16:57:05 -0700490 public boolean createBridge(OvsdbBridge ovsdbBridge) {
491 DatabaseSchema dbSchema = schema.get(DATABASENAME);
492 String ovsUuid = getOvsUuid(DATABASENAME);
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700493
494 if (dbSchema == null || ovsUuid == null) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700495 log.error("Can't find database Open_vSwitch");
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700496 return false;
497 }
498
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700499 Bridge bridge = (Bridge) TableGenerator.createTable(dbSchema, OvsdbTable.BRIDGE);
Hyunsun Moon1251e192016-06-07 16:57:05 -0700500 bridge.setOtherConfig(ovsdbBridge.otherConfigs());
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700501
Hyunsun Moon1251e192016-06-07 16:57:05 -0700502 if (ovsdbBridge.failMode().isPresent()) {
503 String failMode = ovsdbBridge.failMode().get().name().toLowerCase();
504 bridge.setFailMode(Sets.newHashSet(failMode));
Bob zhoue9795fd2016-05-12 20:18:45 +0800505 }
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700506
jaegonkim80bee532017-05-15 15:16:38 +0900507 if (ovsdbBridge.datapathType().isPresent()) {
508 String datapathType = ovsdbBridge.datapathType().get();
509 bridge.setDatapathType(datapathType);
510 }
511
Hyunsun Moon1251e192016-06-07 16:57:05 -0700512 String bridgeUuid = getBridgeUuid(ovsdbBridge.name());
Hyunsun Moon98025542016-03-08 04:36:02 -0800513 if (bridgeUuid == null) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700514 bridge.setName(ovsdbBridge.name());
515 bridgeUuid = insertConfig(
516 BRIDGE, UUID, DATABASENAME, BRIDGES,
517 ovsUuid, bridge.getRow());
Hyunsun Moon98025542016-03-08 04:36:02 -0800518 } else {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700519 // update the bridge if it's already existing
520 updateConfig(BRIDGE, UUID, bridgeUuid, bridge.getRow());
Hyunsun Moon98025542016-03-08 04:36:02 -0800521 }
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700522
Hyunsun Moon1251e192016-06-07 16:57:05 -0700523 if (bridgeUuid == null) {
524 log.warn("Failed to create bridge {} on {}", ovsdbBridge.name(), nodeId);
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700525 return false;
526 }
527
Hyunsun Moon1251e192016-06-07 16:57:05 -0700528 createPort(ovsdbBridge.name(), ovsdbBridge.name());
529 setControllersWithUuid(Uuid.uuid(bridgeUuid), ovsdbBridge.controllers());
530
531 log.info("Created bridge {}", ovsdbBridge.name());
Hyunsun Moon646d8c42015-10-08 20:32:44 -0700532 return true;
533 }
534
Hyunsun Moon1251e192016-06-07 16:57:05 -0700535 @Override
536 public ControllerInfo localController() {
537 IpAddress ipAddress = IpAddress.valueOf(((InetSocketAddress)
538 channel.localAddress()).getAddress());
539 return new ControllerInfo(ipAddress, OFPORT, "tcp");
andreaed976a42015-10-05 14:38:25 -0700540 }
541
Hyunsun Moondd14e8e2016-06-09 16:17:32 -0700542 private void setControllersWithUuid(Uuid bridgeUuid, List<ControllerInfo> controllers) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700543 DatabaseSchema dbSchema = schema.get(DATABASENAME);
andreaed976a42015-10-05 14:38:25 -0700544 if (dbSchema == null) {
545 log.debug("There is no schema");
546 return;
547 }
548 List<Controller> oldControllers = getControllers(bridgeUuid);
549 if (oldControllers == null) {
550 log.warn("There are no controllers");
551 return;
552 }
553
Jonathan Hart51539b82015-10-29 09:53:04 -0700554 Set<Uuid> newControllerUuids = new HashSet<>();
andreaed976a42015-10-05 14:38:25 -0700555
556 Set<ControllerInfo> newControllers = new HashSet<>(controllers);
557 List<Controller> removeControllers = new ArrayList<>();
558 oldControllers.forEach(controller -> {
559 ControllerInfo controllerInfo = new ControllerInfo((String) controller.getTargetColumn().data());
560 if (newControllers.contains(controllerInfo)) {
561 newControllers.remove(controllerInfo);
562 newControllerUuids.add(controller.getRow().uuid());
563 } else {
564 removeControllers.add(controller);
565 }
566 });
Hyunsun Moon1251e192016-06-07 16:57:05 -0700567 OvsdbRowStore controllerRowStore = getRowStore(DATABASENAME, CONTROLLER);
andreaed976a42015-10-05 14:38:25 -0700568 if (controllerRowStore == null) {
569 log.debug("There is no controller table");
570 return;
571 }
572
Hyunsun Moon1251e192016-06-07 16:57:05 -0700573 removeControllers.forEach(c -> deleteConfig(CONTROLLER, UUID, c.getRow().uuid().value(),
Saritha8a0c36a2017-07-04 15:01:35 +0530574 BRIDGE, BRIDGE_CONTROLLER, c.getRow().uuid()));
andreaed976a42015-10-05 14:38:25 -0700575 newControllers.stream().map(c -> {
576 Controller controller = (Controller) TableGenerator
577 .createTable(dbSchema, OvsdbTable.CONTROLLER);
578 controller.setTarget(c.target());
579 return controller;
580 }).forEach(c -> {
Saritha8a0c36a2017-07-04 15:01:35 +0530581 String uuid = insertConfig(CONTROLLER, UUID, BRIDGE, BRIDGE_CONTROLLER, bridgeUuid.value(),
andreaed976a42015-10-05 14:38:25 -0700582 c.getRow());
Jonathan Hart51539b82015-10-29 09:53:04 -0700583 newControllerUuids.add(Uuid.uuid(uuid));
andreaed976a42015-10-05 14:38:25 -0700584
585 });
586
Hyunsun Moon1251e192016-06-07 16:57:05 -0700587 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
andreaed976a42015-10-05 14:38:25 -0700588 if (rowStore == null) {
589 log.debug("There is no bridge table");
590 return;
591 }
592
593 Row bridgeRow = rowStore.getRow(bridgeUuid.value());
594 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
595 bridge.setController(OvsdbSet.ovsdbSet(newControllerUuids));
Hyunsun Moon1251e192016-06-07 16:57:05 -0700596 updateConfig(BRIDGE, UUID, bridgeUuid.value(), bridge.getRow());
andreaed976a42015-10-05 14:38:25 -0700597 }
598
andreaed976a42015-10-05 14:38:25 -0700599 @Override
600 public void setControllersWithDeviceId(DeviceId deviceId, List<ControllerInfo> controllers) {
Jonathan Hart51539b82015-10-29 09:53:04 -0700601 setControllersWithUuid(getBridgeUuid(deviceId), controllers);
andreaed976a42015-10-05 14:38:25 -0700602 }
603
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700604 @Override
605 public void dropBridge(String bridgeName) {
Jonathan Hart51539b82015-10-29 09:53:04 -0700606 String bridgeUuid = getBridgeUuid(bridgeName);
607 if (bridgeUuid == null) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -0700608 log.warn("Could not find bridge in node", nodeId.getIpAddress());
609 return;
610 }
Frank Wange11a98d2016-10-26 17:04:03 +0800611 deleteConfig(BRIDGE, UUID, bridgeUuid, DATABASENAME, BRIDGES, Uuid.uuid(bridgeUuid));
Hyunsun Moondd14e8e2016-06-09 16:17:32 -0700612 }
613
Frank Wange11a98d2016-10-26 17:04:03 +0800614 @Override
615 public void applyQos(PortNumber portNumber, String qosName) {
616 DatabaseSchema dbSchema = schema.get(DATABASENAME);
617 OvsdbRowStore portRowStore = getRowStore(DATABASENAME, PORT);
618 if (portRowStore == null) {
619 log.debug("The port uuid is null");
620 return;
621 }
622 OvsdbRowStore qosRowStore = getRowStore(DATABASENAME, QOS);
623 if (qosRowStore == null) {
624 log.debug("The qos uuid is null");
625 return;
626 }
627
628 // Due to Qos Table doesn't have a unique identifier except uuid, unlike
629 // Bridge or Port Table has a name column,in order to make the api more
630 // general, put qos name in external_ids column of Qos Table if this qos
631 // created by onos.
632 ConcurrentMap<String, Row> qosTableRows = qosRowStore.getRowStore();
633 ConcurrentMap<String, Row> portTableRows = portRowStore.getRowStore();
634 Row qosRow = qosTableRows.values().stream().filter(r -> {
635 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
636 return qosName.equals(ovsdbMap.map().get(QOS_EXTERNAL_ID_KEY));
637 }).findFirst().orElse(null);
638
639 Row portRow = portTableRows.values().stream()
640 .filter(r -> r.getColumn("name").data().equals(portNumber.name()))
641 .findFirst().orElse(null);
642 if (portRow != null && qosRow != null) {
643 String qosId = qosRow.uuid().value();
644 Uuid portUuid = portRow.uuid();
645 Map<String, Column> columns = new HashMap<>();
646 Row newPortRow = new Row(PORT, portUuid, columns);
647 Port newport = new Port(dbSchema, newPortRow);
648 columns.put(Port.PortColumn.QOS.columnName(), newport.getQosColumn());
649 newport.setQos(Uuid.uuid(qosId));
650 updateConfig(PORT, UUID, portUuid.value(), newport.getRow());
651 }
652 }
653
654 @Override
655 public void removeQos(PortNumber portNumber) {
656 DatabaseSchema dbSchema = schema.get(DATABASENAME);
657 OvsdbRowStore rowStore = getRowStore(DATABASENAME, PORT);
658 if (rowStore == null) {
659 log.debug("The qos uuid is null");
660 return;
661 }
662
663 ConcurrentMap<String, Row> ovsTableRows = rowStore.getRowStore();
664 Row portRow = ovsTableRows.values().stream()
665 .filter(r -> r.getColumn("name").data().equals(portNumber.name()))
666 .findFirst().orElse(null);
667 if (portRow == null) {
668 log.warn("Couldn't find port {} in ovsdb port table.", portNumber.name());
669 return;
670 }
671
672 OvsdbSet ovsdbSet = ((OvsdbSet) portRow.getColumn(PORT_QOS).data());
673 @SuppressWarnings("unchecked")
674 Set<Uuid> qosIdSet = ovsdbSet.set();
675 if (qosIdSet == null || qosIdSet.isEmpty()) {
676 return;
677 }
678 Uuid qosUuid = (Uuid) qosIdSet.toArray()[0];
679 Condition condition = ConditionUtil.isEqual(UUID, portRow.uuid());
680 List<Condition> conditions = Lists.newArrayList(condition);
681 Mutation mutation = MutationUtil.delete(PORT_QOS, qosUuid);
682 List<Mutation> mutations = Lists.newArrayList(mutation);
683
684 ArrayList<Operation> operations = Lists.newArrayList();
685 Mutate mutate = new Mutate(dbSchema.getTableSchema(PORT), conditions, mutations);
686 operations.add(mutate);
687 transactConfig(DATABASENAME, operations);
688 }
689
690 @Override
691 public boolean createQos(OvsdbQos ovsdbQos) {
692 DatabaseSchema dbSchema = schema.get(DATABASENAME);
693 Qos qos = (Qos) TableGenerator.createTable(dbSchema, OvsdbTable.QOS);
694 OvsdbRowStore rowStore = getRowStore(DATABASENAME, QOS);
695 if (rowStore == null) {
696 log.debug("The qos uuid is null");
697 return false;
698 }
699
700 ArrayList<Operation> operations = Lists.newArrayList();
701 Set<String> types = Sets.newHashSet();
702 Map<Long, Uuid> queues = Maps.newHashMap();
703
704 types.add(ovsdbQos.qosType());
705 qos.setOtherConfig(ovsdbQos.otherConfigs());
706 qos.setExternalIds(ovsdbQos.externalIds());
707 qos.setType(types);
708 if (ovsdbQos.qosQueues().isPresent()) {
709 for (Map.Entry<Long, String> entry : ovsdbQos.qosQueues().get().entrySet()) {
710 OvsdbRowStore queueRowStore = getRowStore(DATABASENAME, QUEUE);
711 if (queueRowStore != null) {
712 ConcurrentMap<String, Row> queueTableRows = queueRowStore.getRowStore();
713 Row queueRow = queueTableRows.values().stream().filter(r -> {
714 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
715 return entry.getValue().equals(ovsdbMap.map().get(QUEUE_EXTERNAL_ID_KEY));
716 }).findFirst().orElse(null);
717 if (queueRow != null) {
718 queues.put(entry.getKey(), queueRow.uuid());
719 }
720 }
721 }
722 qos.setQueues(queues);
723 }
724
725 Insert qosInsert = new Insert(dbSchema.getTableSchema(QOS), QOS, qos.getRow());
726 operations.add(qosInsert);
727 try {
728 transactConfig(DATABASENAME, operations).get();
729 } catch (InterruptedException | ExecutionException e) {
730 return false;
731 }
732 return true;
733 }
734
735 @Override
736 public void dropQos(QosId qosId) {
737 OvsdbRowStore rowStore = getRowStore(DATABASENAME, QOS);
738 if (rowStore != null) {
739 ConcurrentMap<String, Row> qosTableRows = rowStore.getRowStore();
740 Row qosRow = qosTableRows.values().stream().filter(r -> {
741 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
742 return qosId.name().equals(ovsdbMap.map().get(QOS_EXTERNAL_ID_KEY));
743 }).findFirst().orElse(null);
744 if (qosRow != null) {
745 deleteConfig(QOS, UUID, qosRow.uuid().value(), PORT, PORT_QOS, qosRow.uuid());
746 }
747 }
748 }
749 @Override
750 public OvsdbQos getQos(QosId qosId) {
751 Set<OvsdbQos> ovsdbQoses = getQoses();
752 return ovsdbQoses.stream().filter(r ->
753 qosId.name().equals(r.externalIds().get(QOS_EXTERNAL_ID_KEY))).
754 findFirst().orElse(null);
755 }
756
757 @Override
758 public Set<OvsdbQos> getQoses() {
759 Set<OvsdbQos> ovsdbQoses = new HashSet<>();
760 OvsdbRowStore rowStore = getRowStore(DATABASENAME, QOS);
761 if (rowStore == null) {
762 log.debug("The qos uuid is null");
763 return ovsdbQoses;
764 }
765 ConcurrentMap<String, Row> rows = rowStore.getRowStore();
766 for (String uuid : rows.keySet()) {
767 Row row = getRow(DATABASENAME, QOS, uuid);
768 OvsdbQos ovsdbQos = getOvsdbQos(row);
769 if (ovsdbQos != null) {
770 ovsdbQoses.add(ovsdbQos);
771 }
772 }
773 return ovsdbQoses;
774 }
775
776 @Override
tanbangchengc944c282017-11-12 20:42:59 +0800777 public void bindQueues(QosId qosId, Map<Long, QueueDescription> queues) {
778 DatabaseSchema dbSchema = schema.get(DATABASENAME);
779 OvsdbRowStore qosRowStore = getRowStore(DATABASENAME, QOS);
780 if (qosRowStore == null) {
781 log.debug("The qos uuid is null");
782 return;
783 }
784 OvsdbRowStore queueRowStore = getRowStore(DATABASENAME, QUEUE);
785 if (queueRowStore == null) {
786 log.debug("The queue uuid is null");
787 return;
788 }
789
790 ConcurrentMap<String, Row> qosTableRows = qosRowStore.getRowStore();
791 ConcurrentMap<String, Row> queueTableRows = queueRowStore.getRowStore();
792
793 Row qosRow = qosTableRows.values().stream().filter(r -> {
794 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
795 return qosId.name().equals(ovsdbMap.map().get(QOS_EXTERNAL_ID_KEY));
796 }).findFirst().orElse(null);
797
798 if (qosRow == null) {
799 log.warn("Can't find QoS {}", qosId);
800 return;
801 }
802
803 Uuid qosUuid = qosRow.uuid();
804
805 Map<Long, Uuid> newQueues = new HashMap<Long, Uuid>();
806 for (Map.Entry<Long, QueueDescription> entry : queues.entrySet()) {
807 Row queueRow = queueTableRows.values().stream().filter(r -> {
808 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
809 return entry.getValue().queueId().name().equals(ovsdbMap.map().get(QUEUE_EXTERNAL_ID_KEY));
810 }).findFirst().orElse(null);
811 if (queueRow != null) {
812 newQueues.put(entry.getKey(), queueRow.uuid());
813 }
814 }
815
816 // update the qos table
817 ArrayList<Operation> operations = Lists.newArrayList();
818 Condition condition = ConditionUtil.isEqual(UUID, qosUuid);
819 Mutation mutation = MutationUtil.insert(QUEUES, newQueues);
820 List<Condition> conditions = Collections.singletonList(condition);
821 List<Mutation> mutations = Collections.singletonList(mutation);
822 operations.add(new Mutate(dbSchema.getTableSchema(QOS), conditions, mutations));
823
824 transactConfig(DATABASENAME, operations);
825 }
826
827
828 @SuppressWarnings("unchecked")
829 @Override
830 public void unbindQueues(QosId qosId, List<Long> queueKeys) {
831 DatabaseSchema dbSchema = schema.get(DATABASENAME);
832 OvsdbRowStore qosRowStore = getRowStore(DATABASENAME, QOS);
833 if (qosRowStore == null) {
834 return;
835 }
836
837 ConcurrentMap<String, Row> qosTableRows = qosRowStore.getRowStore();
838
839 Row qosRow = qosTableRows.values().stream().filter(r -> {
840 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
841 return qosId.name().equals(ovsdbMap.map().get(QOS_EXTERNAL_ID_KEY));
842 }).findFirst().orElse(null);
843
844 if (qosRow == null) {
845 log.warn("Can't find QoS {}", qosId);
846 return;
847 }
848
849 Map<Long, Uuid> deleteQueuesMap = new HashMap<>();
850 Map<Integer, Uuid> queuesMap = ((OvsdbMap) qosRow.getColumn(QUEUES).data()).map();
851
852 queueKeys.forEach(key -> {
853 if (queuesMap.containsKey(key.intValue())) {
854 deleteQueuesMap.put(key, queuesMap.get(key.intValue()));
855 }
856 });
857
858 if (deleteQueuesMap.size() != 0) {
859 TableSchema parentTableSchema = dbSchema
860 .getTableSchema(QOS);
861 ColumnSchema parentColumnSchema = parentTableSchema
862 .getColumnSchema(QUEUES);
863
864 Mutation mutation = MutationUtil.delete(parentColumnSchema.name(), OvsdbMap.ovsdbMap(deleteQueuesMap));
865 List<Mutation> mutations = Collections.singletonList(mutation);
866
867 Condition condition = ConditionUtil.isEqual(UUID, qosRow.uuid());
868 List<Condition> conditionList = Collections.singletonList(condition);
869 List<Operation> operations = Collections.singletonList(
870 new Mutate(parentTableSchema, conditionList, mutations));
871
872 transactConfig(DATABASENAME, operations);
873 }
874 }
875
876
877 @Override
Frank Wange11a98d2016-10-26 17:04:03 +0800878 public boolean createQueue(OvsdbQueue ovsdbQueue) {
879 DatabaseSchema dbSchema = schema.get(DATABASENAME);
880 Queue queue = (Queue) TableGenerator.createTable(dbSchema, OvsdbTable.QUEUE);
881 ArrayList<Operation> operations = Lists.newArrayList();
882 OvsdbRowStore rowStore = getRowStore(DATABASENAME, QUEUE);
883 if (rowStore == null) {
884 log.debug("The queue uuid is null");
885 return false;
886 }
887
888 if (ovsdbQueue.dscp().isPresent()) {
889 queue.setDscp(ImmutableSet.of(ovsdbQueue.dscp().get()));
890 }
891 queue.setOtherConfig(ovsdbQueue.otherConfigs());
892 queue.setExternalIds(ovsdbQueue.externalIds());
893 Insert queueInsert = new Insert(dbSchema.getTableSchema(QUEUE), QUEUE, queue.getRow());
894 operations.add(queueInsert);
895
896 try {
897 transactConfig(DATABASENAME, operations).get();
898 } catch (InterruptedException | ExecutionException e) {
899 log.error("createQueue transactConfig get exception !");
900 }
901 return true;
902 }
903
904 @Override
905 public void dropQueue(QueueId queueId) {
906 OvsdbRowStore queueRowStore = getRowStore(DATABASENAME, QUEUE);
907 if (queueRowStore == null) {
908 return;
909 }
910
911 ConcurrentMap<String, Row> queueTableRows = queueRowStore.getRowStore();
912 Row queueRow = queueTableRows.values().stream().filter(r -> {
913 OvsdbMap ovsdbMap = (OvsdbMap) (r.getColumn(EXTERNAL_ID).data());
914 return queueId.name().equals(ovsdbMap.map().get(QUEUE_EXTERNAL_ID_KEY));
915 }).findFirst().orElse(null);
916 if (queueRow == null) {
917 return;
918 }
919
920 String queueUuid = queueRow.uuid().value();
921 OvsdbRowStore qosRowStore = getRowStore(DATABASENAME, QOS);
922 if (qosRowStore != null) {
923 Map<Long, Uuid> queueMap = new HashMap<>();
924 ConcurrentMap<String, Row> qosTableRows = qosRowStore.getRowStore();
925 qosTableRows.values().stream().filter(r -> {
926 Map<Integer, Uuid> ovsdbMap = ((OvsdbMap) r.getColumn(QUEUES).data()).map();
927 Set<Integer> keySet = ovsdbMap.keySet();
928 for (Integer keyId : keySet) {
929 if (ovsdbMap.get(keyId).equals(Uuid.uuid(queueUuid))) {
930 queueMap.put(keyId.longValue(), Uuid.uuid(queueUuid));
931 return true;
932 }
933 }
934 return false;
935 }).findFirst().orElse(null);
936 deleteConfig(QUEUE, UUID, queueUuid, QOS, QUEUES, OvsdbMap.ovsdbMap(queueMap));
937 } else {
938 deleteConfig(QUEUE, UUID, queueUuid, null, null, null);
939 }
940 }
941 @Override
942 public OvsdbQueue getQueue(QueueId queueId) {
943 Set<OvsdbQueue> ovsdbQueues = getQueues();
944 return ovsdbQueues.stream().filter(r ->
945 queueId.name().equals(r.externalIds().get(QUEUE_EXTERNAL_ID_KEY))).
946 findFirst().orElse(null);
947 }
948
949 @Override
950 public Set<OvsdbQueue> getQueues() {
951 Set<OvsdbQueue> ovsdbqueues = new HashSet<>();
952 OvsdbRowStore rowStore = getRowStore(DATABASENAME, QUEUE);
953 if (rowStore == null) {
954 log.debug("The queue uuid is null");
955 return ovsdbqueues;
956 }
957 ConcurrentMap<String, Row> rows = rowStore.getRowStore();
958 for (String uuid : rows.keySet()) {
959 Row row = getRow(DATABASENAME, QUEUE, uuid);
960 OvsdbQueue ovsdbQueue = getOvsdbQueue(row);
961 if (ovsdbQueue != null) {
962 ovsdbqueues.add(ovsdbQueue);
963 }
964 }
965 return ovsdbqueues;
966 }
Pier Ventref5d72362016-07-17 12:02:14 +0200967 /**
968 * Creates a mirror port. Mirrors the traffic
969 * that goes to selectDstPort or comes from
970 * selectSrcPort or packets containing selectVlan
971 * to mirrorPort or to all ports that trunk mirrorVlan.
972 *
973 * @param mirror the OVSDB mirror description
974 * @return true if mirror creation is successful, false otherwise
975 */
976 @Override
977 public boolean createMirror(String bridgeName, OvsdbMirror mirror) {
978
979 /**
980 * Retrieves bridge's uuid. It is necessary to update
981 * Bridge table.
982 */
983 String bridgeUuid = getBridgeUuid(bridgeName);
984 if (bridgeUuid == null) {
985 log.warn("Couldn't find bridge {} in {}", bridgeName, nodeId.getIpAddress());
986 return false;
987 }
988
989 OvsdbMirror.Builder mirrorBuilder = OvsdbMirror.builder();
990
991 mirrorBuilder.mirroringName(mirror.mirroringName());
992 mirrorBuilder.selectAll(mirror.selectAll());
993
994 /**
995 * Retrieves the uuid of the monitored dst ports.
996 */
997 mirrorBuilder.monitorDstPorts(mirror.monitorDstPorts().parallelStream()
998 .map(dstPort -> {
999 String dstPortUuid = getPortUuid(dstPort.value(), bridgeUuid);
1000 if (dstPortUuid != null) {
1001 return Uuid.uuid(dstPortUuid);
1002 }
1003 log.warn("Couldn't find port {} in {}",
1004 dstPort.value(), nodeId.getIpAddress());
1005 return null;
1006 })
1007 .filter(Objects::nonNull)
1008 .collect(Collectors.toSet())
1009 );
1010
1011 /**
1012 * Retrieves the uuid of the monitored src ports.
1013 */
1014 mirrorBuilder.monitorSrcPorts(mirror.monitorSrcPorts().parallelStream()
1015 .map(srcPort -> {
1016 String srcPortUuid = getPortUuid(srcPort.value(), bridgeUuid);
1017 if (srcPortUuid != null) {
1018 return Uuid.uuid(srcPortUuid);
1019 }
1020 log.warn("Couldn't find port {} in {}",
1021 srcPort.value(), nodeId.getIpAddress());
1022 return null;
1023 }).filter(Objects::nonNull)
1024 .collect(Collectors.toSet())
1025 );
1026
1027 mirrorBuilder.monitorVlans(mirror.monitorVlans());
1028 mirrorBuilder.mirrorPort(mirror.mirrorPort());
1029 mirrorBuilder.mirrorVlan(mirror.mirrorVlan());
1030 mirrorBuilder.externalIds(mirror.externalIds());
1031 mirror = mirrorBuilder.build();
1032
Jon Hallcbd1b392017-01-18 20:15:44 -08001033 if (mirror.monitorDstPorts().isEmpty() &&
1034 mirror.monitorSrcPorts().isEmpty() &&
1035 mirror.monitorVlans().isEmpty()) {
Pier Ventref5d72362016-07-17 12:02:14 +02001036 log.warn("Invalid monitoring data");
1037 return false;
1038 }
1039
1040 DatabaseSchema dbSchema = schema.get(DATABASENAME);
1041
1042 Mirror mirrorEntry = (Mirror) TableGenerator.createTable(dbSchema, OvsdbTable.MIRROR);
1043 mirrorEntry.setName(mirror.mirroringName());
1044 mirrorEntry.setSelectDstPort(mirror.monitorDstPorts());
1045 mirrorEntry.setSelectSrcPort(mirror.monitorSrcPorts());
1046 mirrorEntry.setSelectVlan(mirror.monitorVlans());
1047 mirrorEntry.setExternalIds(mirror.externalIds());
1048
1049 /**
1050 * If mirror port, retrieves the uuid of the mirror port.
1051 */
1052 if (mirror.mirrorPort() != null) {
1053
1054 String outputPortUuid = getPortUuid(mirror.mirrorPort().value(), bridgeUuid);
1055 if (outputPortUuid == null) {
1056 log.warn("Couldn't find port {} in {}", mirror.mirrorPort().value(), nodeId.getIpAddress());
1057 return false;
1058 }
1059
1060 mirrorEntry.setOutputPort(Uuid.uuid(outputPortUuid));
1061
1062 } else if (mirror.mirrorVlan() != null) {
1063
1064 mirrorEntry.setOutputVlan(mirror.mirrorVlan());
1065
1066 } else {
1067 log.warn("Invalid mirror, no mirror port and no mirror vlan");
1068 return false;
1069 }
1070
1071 ArrayList<Operation> operations = Lists.newArrayList();
1072 Insert mirrorInsert = new Insert(dbSchema.getTableSchema("Mirror"), "Mirror", mirrorEntry.getRow());
1073 operations.add(mirrorInsert);
1074
1075 // update the bridge table
1076 Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(bridgeUuid));
1077 Mutation mutation = MutationUtil.insert(MIRRORS, Uuid.uuid("Mirror"));
1078 List<Condition> conditions = Lists.newArrayList(condition);
1079 List<Mutation> mutations = Lists.newArrayList(mutation);
1080 operations.add(new Mutate(dbSchema.getTableSchema("Bridge"), conditions, mutations));
1081
1082 transactConfig(DATABASENAME, operations);
1083 log.info("Created mirror {}", mirror.mirroringName());
1084 return true;
1085 }
1086
1087 /**
1088 * Drops the configuration for mirror.
1089 *
Ray Milkeyef794342016-11-09 16:20:29 -08001090 * @param mirroringName name of mirror to drop
Pier Ventref5d72362016-07-17 12:02:14 +02001091 */
1092 @Override
1093 public void dropMirror(MirroringName mirroringName) {
1094 String mirrorUuid = getMirrorUuid(mirroringName.name());
1095 if (mirrorUuid != null) {
1096 log.info("Deleted mirror {}", mirroringName.name());
Frank Wange11a98d2016-10-26 17:04:03 +08001097 deleteConfig(MIRROR, UUID, mirrorUuid, BRIDGE, MIRRORS, Uuid.uuid(mirrorUuid));
Pier Ventref5d72362016-07-17 12:02:14 +02001098 }
1099 log.warn("Unable to delete {}", mirroringName.name());
1100 return;
1101 }
1102
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001103 @Override
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001104 public boolean createInterface(String bridgeName, OvsdbInterface ovsdbIface) {
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001105 String bridgeUuid = getBridgeUuid(bridgeName);
1106 if (bridgeUuid == null) {
1107 log.warn("Couldn't find bridge {} in {}", bridgeName, nodeId.getIpAddress());
1108 return false;
1109 }
1110
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001111 if (getPortUuid(ovsdbIface.name(), bridgeUuid) != null) {
1112 log.warn("Interface {} already exists", ovsdbIface.name());
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001113 // remove existing one and re-create?
1114 return false;
1115 }
1116
1117 ArrayList<Operation> operations = Lists.newArrayList();
Hyunsun Moon1251e192016-06-07 16:57:05 -07001118 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001119
Hyunsun Moon89478662016-06-09 17:52:34 -07001120 // insert a new port with the interface name
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001121 Port port = (Port) TableGenerator.createTable(dbSchema, OvsdbTable.PORT);
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001122 port.setName(ovsdbIface.name());
1123 Insert portInsert = new Insert(dbSchema.getTableSchema(PORT), PORT, port.getRow());
1124 portInsert.getRow().put(INTERFACES, Uuid.uuid(INTERFACE));
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001125 operations.add(portInsert);
1126
Hyunsun Moon89478662016-06-09 17:52:34 -07001127 // update the bridge table with the new port
Hyunsun Moon1251e192016-06-07 16:57:05 -07001128 Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(bridgeUuid));
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001129 Mutation mutation = MutationUtil.insert(PORTS, Uuid.uuid(PORT));
1130 List<Condition> conditions = Lists.newArrayList(condition);
1131 List<Mutation> mutations = Lists.newArrayList(mutation);
1132 operations.add(new Mutate(dbSchema.getTableSchema(BRIDGE), conditions, mutations));
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001133
Hyunsun Moon89478662016-06-09 17:52:34 -07001134 // insert an interface
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001135 Interface intf = (Interface) TableGenerator.createTable(dbSchema, OvsdbTable.INTERFACE);
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001136 intf.setName(ovsdbIface.name());
jaegonkim256f2c12017-05-26 00:03:42 +09001137
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001138 intf.setType(ovsdbIface.typeToString());
jaegonkim256f2c12017-05-26 00:03:42 +09001139
1140 if (ovsdbIface.mtu().isPresent()) {
1141 Set<Long> mtuSet = Sets.newConcurrentHashSet();
1142 mtuSet.add(ovsdbIface.mtu().get());
1143 intf.setMtu(mtuSet);
1144 intf.setMtuRequest(mtuSet);
1145 }
1146
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001147 intf.setOptions(ovsdbIface.options());
1148 Insert intfInsert = new Insert(dbSchema.getTableSchema(INTERFACE), INTERFACE, intf.getRow());
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001149 operations.add(intfInsert);
1150
Hyunsun Moon1251e192016-06-07 16:57:05 -07001151 transactConfig(DATABASENAME, operations);
Hyunsun Moon89478662016-06-09 17:52:34 -07001152 log.info("Created interface {}", ovsdbIface);
Hyunsun Moon646d8c42015-10-08 20:32:44 -07001153 return true;
1154 }
1155
1156 @Override
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001157 public boolean dropInterface(String ifaceName) {
1158 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
1159 if (rowStore == null) {
1160 log.warn("Failed to get BRIDGE table");
1161 return false;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001162 }
1163
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001164 ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
1165 if (bridgeTableRows == null) {
1166 log.warn("Failed to get BRIDGE table rows");
1167 return false;
1168 }
1169
1170 // interface name is unique
1171 Optional<String> bridgeId = bridgeTableRows.keySet().stream()
1172 .filter(uuid -> getPortUuid(ifaceName, uuid) != null)
1173 .findFirst();
1174
1175 if (bridgeId.isPresent()) {
1176 String portId = getPortUuid(ifaceName, bridgeId.get());
Frank Wange11a98d2016-10-26 17:04:03 +08001177 deleteConfig(PORT, UUID, portId, BRIDGE, PORTS, Uuid.uuid(portId));
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001178 return true;
1179 } else {
1180 log.warn("Unable to find the interface with name {}", ifaceName);
1181 return false;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001182 }
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001183 }
1184
1185 /**
1186 * Delete transact config.
1187 *
andreaed976a42015-10-05 14:38:25 -07001188 * @param childTableName child table name
1189 * @param childColumnName child column name
1190 * @param childUuid child row uuid
1191 * @param parentTableName parent table name
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001192 * @param parentColumnName parent column
Frank Wange11a98d2016-10-26 17:04:03 +08001193 * @param referencedValue referenced value
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001194 */
1195 private void deleteConfig(String childTableName, String childColumnName,
andreaed976a42015-10-05 14:38:25 -07001196 String childUuid, String parentTableName,
Frank Wange11a98d2016-10-26 17:04:03 +08001197 String parentColumnName, Object referencedValue) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001198 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001199 TableSchema childTableSchema = dbSchema.getTableSchema(childTableName);
1200
1201 ArrayList<Operation> operations = Lists.newArrayList();
Frank Wange11a98d2016-10-26 17:04:03 +08001202 if (parentTableName != null && parentColumnName != null && referencedValue != null) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001203 TableSchema parentTableSchema = dbSchema
1204 .getTableSchema(parentTableName);
1205 ColumnSchema parentColumnSchema = parentTableSchema
1206 .getColumnSchema(parentColumnName);
1207 List<Mutation> mutations = Lists.newArrayList();
Frank Wange11a98d2016-10-26 17:04:03 +08001208 Mutation mutation = MutationUtil.delete(parentColumnSchema.name(), referencedValue);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001209 mutations.add(mutation);
1210 List<Condition> conditions = Lists.newArrayList();
Frank Wange11a98d2016-10-26 17:04:03 +08001211 Condition condition = ConditionUtil.includes(parentColumnName, referencedValue);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001212 conditions.add(condition);
1213 Mutate op = new Mutate(parentTableSchema, conditions, mutations);
1214 operations.add(op);
1215 }
1216
1217 List<Condition> conditions = Lists.newArrayList();
Jonathan Hart51539b82015-10-29 09:53:04 -07001218 Condition condition = ConditionUtil.isEqual(childColumnName, Uuid.uuid(childUuid));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001219 conditions.add(condition);
1220 Delete del = new Delete(childTableSchema, conditions);
1221 operations.add(del);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001222 transactConfig(DATABASENAME, operations);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001223 }
1224
1225 /**
1226 * Update transact config.
1227 *
andreaed976a42015-10-05 14:38:25 -07001228 * @param tableName table name
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001229 * @param columnName column name
andreaed976a42015-10-05 14:38:25 -07001230 * @param uuid uuid
1231 * @param row the config data
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001232 */
1233 private void updateConfig(String tableName, String columnName, String uuid,
andreaed976a42015-10-05 14:38:25 -07001234 Row row) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001235 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001236 TableSchema tableSchema = dbSchema.getTableSchema(tableName);
1237
1238 List<Condition> conditions = Lists.newArrayList();
Jonathan Hart51539b82015-10-29 09:53:04 -07001239 Condition condition = ConditionUtil.isEqual(columnName, Uuid.uuid(uuid));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001240 conditions.add(condition);
1241
1242 Update update = new Update(tableSchema, row, conditions);
1243
1244 ArrayList<Operation> operations = Lists.newArrayList();
1245 operations.add(update);
1246
Hyunsun Moon1251e192016-06-07 16:57:05 -07001247 transactConfig(DATABASENAME, operations);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001248 }
1249
1250 /**
1251 * Insert transact config.
1252 *
andreaed976a42015-10-05 14:38:25 -07001253 * @param childTableName child table name
1254 * @param childColumnName child column name
1255 * @param parentTableName parent table name
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001256 * @param parentColumnName parent column
andreaed976a42015-10-05 14:38:25 -07001257 * @param parentUuid parent uuid
1258 * @param row the config data
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001259 * @return uuid, empty if no uuid is find
1260 */
1261 private String insertConfig(String childTableName, String childColumnName,
andreaed976a42015-10-05 14:38:25 -07001262 String parentTableName, String parentColumnName,
1263 String parentUuid, Row row) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001264 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001265 TableSchema tableSchema = dbSchema.getTableSchema(childTableName);
1266
Sho SHIMIZUff18f8c2016-03-11 14:43:53 -08001267 Insert insert = new Insert(tableSchema, childTableName, row);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001268
1269 ArrayList<Operation> operations = Lists.newArrayList();
1270 operations.add(insert);
1271
1272 if (parentTableName != null && parentColumnName != null) {
1273 TableSchema parentTableSchema = dbSchema
1274 .getTableSchema(parentTableName);
1275 ColumnSchema parentColumnSchema = parentTableSchema
1276 .getColumnSchema(parentColumnName);
1277
1278 List<Mutation> mutations = Lists.newArrayList();
1279 Mutation mutation = MutationUtil.insert(parentColumnSchema.name(),
Sho SHIMIZUff18f8c2016-03-11 14:43:53 -08001280 Uuid.uuid(childTableName));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001281 mutations.add(mutation);
1282
1283 List<Condition> conditions = Lists.newArrayList();
Hyunsun Moon1251e192016-06-07 16:57:05 -07001284 Condition condition = ConditionUtil.isEqual(UUID, Uuid.uuid(parentUuid));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001285 conditions.add(condition);
1286
1287 Mutate op = new Mutate(parentTableSchema, conditions, mutations);
1288 operations.add(op);
1289 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001290 if (childTableName.equalsIgnoreCase(PORT)) {
1291 log.debug("Handle port insert");
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001292 Insert intfInsert = handlePortInsertTable(row);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001293
1294 if (intfInsert != null) {
1295 operations.add(intfInsert);
1296 }
1297
1298 Insert ins = (Insert) operations.get(0);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001299 ins.getRow().put("interfaces", Uuid.uuid(INTERFACE));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001300 }
1301
1302 List<OperationResult> results;
1303 try {
jaegonkim01d7c912017-01-22 22:03:38 +09001304 results = transactConfig(DATABASENAME, operations)
1305 .get(TRANSACTCONFIG_TIMEOUT, TimeUnit.SECONDS);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001306 return results.get(0).getUuid().value();
jaegonkim01d7c912017-01-22 22:03:38 +09001307 } catch (TimeoutException e) {
1308 log.warn("TimeoutException thrown while to get result");
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001309 } catch (InterruptedException e) {
1310 log.warn("Interrupted while waiting to get result");
1311 Thread.currentThread().interrupt();
1312 } catch (ExecutionException e) {
1313 log.error("Exception thrown while to get result");
1314 }
1315
1316 return null;
1317 }
1318
jaegonkim01d7c912017-01-22 22:03:38 +09001319
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001320 /**
1321 * Handles port insert.
1322 *
andreaed976a42015-10-05 14:38:25 -07001323 * @param portRow row of port
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001324 * @return insert, empty if null
1325 */
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001326 private Insert handlePortInsertTable(Row portRow) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001327 DatabaseSchema dbSchema = schema.get(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001328
Hyunsun Moon1251e192016-06-07 16:57:05 -07001329 TableSchema portTableSchema = dbSchema.getTableSchema(PORT);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001330 ColumnSchema portColumnSchema = portTableSchema.getColumnSchema("name");
1331
1332 String portName = (String) portRow.getColumn(portColumnSchema.name()).data();
Hyunsun Moon1251e192016-06-07 16:57:05 -07001333 Interface inf = (Interface) TableGenerator.createTable(dbSchema, OvsdbTable.INTERFACE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001334 inf.setName(portName);
1335
Hyunsun Moon1251e192016-06-07 16:57:05 -07001336 TableSchema intfTableSchema = dbSchema.getTableSchema(INTERFACE);
1337 return new Insert(intfTableSchema, INTERFACE, inf.getRow());
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001338 }
1339
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001340 @Override
1341 public ListenableFuture<DatabaseSchema> getOvsdbSchema(String dbName) {
1342 if (dbName == null) {
1343 return null;
1344 }
1345 DatabaseSchema databaseSchema = schema.get(dbName);
1346 if (databaseSchema == null) {
1347 List<String> dbNames = new ArrayList<String>();
1348 dbNames.add(dbName);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001349 Function<JsonNode, DatabaseSchema> rowFunction = input -> {
1350 log.debug("Get ovsdb database schema {}", dbName);
1351 DatabaseSchema dbSchema = FromJsonUtil.jsonNodeToDbSchema(dbName, input);
1352 if (dbSchema == null) {
1353 log.debug("Get ovsdb database schema error");
1354 return null;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001355 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001356 schema.put(dbName, dbSchema);
1357 return dbSchema;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001358 };
1359
1360 ListenableFuture<JsonNode> input = getSchema(dbNames);
1361 if (input != null) {
1362 return Futures.transform(input, rowFunction);
1363 }
1364 return null;
1365 } else {
1366 return Futures.immediateFuture(databaseSchema);
1367 }
1368 }
1369
1370 @Override
1371 public ListenableFuture<TableUpdates> monitorTables(String dbName, String id) {
1372 if (dbName == null) {
1373 return null;
1374 }
1375 DatabaseSchema dbSchema = schema.get(dbName);
1376 if (dbSchema != null) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001377 Function<JsonNode, TableUpdates> rowFunction = input -> {
1378 log.debug("Get table updates");
1379 TableUpdates updates = FromJsonUtil.jsonNodeToTableUpdates(input, dbSchema);
1380 if (updates == null) {
1381 log.debug("Get table updates error");
1382 return null;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001383 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001384 return updates;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001385 };
1386 return Futures.transform(monitor(dbSchema, id), rowFunction);
1387 }
1388 return null;
1389 }
1390
Hyunsun Moondd14e8e2016-06-09 16:17:32 -07001391 private ListenableFuture<List<OperationResult>> transactConfig(String dbName,
1392 List<Operation> operations) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001393 if (dbName == null) {
1394 return null;
1395 }
1396 DatabaseSchema dbSchema = schema.get(dbName);
1397 if (dbSchema != null) {
andreaed976a42015-10-05 14:38:25 -07001398 Function<List<JsonNode>, List<OperationResult>> rowFunction = (input -> {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001399 log.debug("Get ovsdb operation result");
1400 List<OperationResult> result = FromJsonUtil.jsonNodeToOperationResult(input, operations);
andreaed976a42015-10-05 14:38:25 -07001401 if (result == null) {
1402 log.debug("The operation result is null");
1403 return null;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001404 }
andreaed976a42015-10-05 14:38:25 -07001405 return result;
1406 });
Hyunsun Moon1251e192016-06-07 16:57:05 -07001407 return Futures.transform(transact(dbSchema, operations), rowFunction);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001408 }
1409 return null;
1410 }
1411
1412 @Override
1413 public ListenableFuture<JsonNode> getSchema(List<String> dbnames) {
1414 String id = java.util.UUID.randomUUID().toString();
1415 String getSchemaString = JsonRpcWriterUtil.getSchemaStr(id, dbnames);
1416
1417 SettableFuture<JsonNode> sf = SettableFuture.create();
1418 requestResult.put(id, sf);
1419 requestMethod.put(id, "getSchema");
1420
1421 channel.writeAndFlush(getSchemaString);
1422 return sf;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001423 }
1424
1425 @Override
1426 public ListenableFuture<List<String>> echo() {
1427 String id = java.util.UUID.randomUUID().toString();
1428 String echoString = JsonRpcWriterUtil.echoStr(id);
1429
1430 SettableFuture<List<String>> sf = SettableFuture.create();
1431 requestResult.put(id, sf);
1432 requestMethod.put(id, "echo");
1433
1434 channel.writeAndFlush(echoString);
1435 return sf;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001436 }
1437
1438 @Override
1439 public ListenableFuture<JsonNode> monitor(DatabaseSchema dbSchema,
1440 String monitorId) {
1441 String id = java.util.UUID.randomUUID().toString();
1442 String monitorString = JsonRpcWriterUtil.monitorStr(id, monitorId,
1443 dbSchema);
1444
1445 SettableFuture<JsonNode> sf = SettableFuture.create();
1446 requestResult.put(id, sf);
1447 requestMethod.put(id, "monitor");
1448
1449 channel.writeAndFlush(monitorString);
1450 return sf;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001451 }
1452
1453 @Override
1454 public ListenableFuture<List<String>> listDbs() {
1455 String id = java.util.UUID.randomUUID().toString();
1456 String listDbsString = JsonRpcWriterUtil.listDbsStr(id);
1457
1458 SettableFuture<List<String>> sf = SettableFuture.create();
1459 requestResult.put(id, sf);
1460 requestMethod.put(id, "listDbs");
1461
1462 channel.writeAndFlush(listDbsString);
1463 return sf;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001464 }
1465
1466 @Override
1467 public ListenableFuture<List<JsonNode>> transact(DatabaseSchema dbSchema,
1468 List<Operation> operations) {
1469 String id = java.util.UUID.randomUUID().toString();
1470 String transactString = JsonRpcWriterUtil.transactStr(id, dbSchema,
1471 operations);
1472
1473 SettableFuture<List<JsonNode>> sf = SettableFuture.create();
1474 requestResult.put(id, sf);
1475 requestMethod.put(id, "transact");
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001476 channel.writeAndFlush(transactString);
1477 return sf;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001478 }
1479
andreaed976a42015-10-05 14:38:25 -07001480 @SuppressWarnings({"rawtypes", "unchecked"})
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001481 @Override
1482 public void processResult(JsonNode response) {
1483 log.debug("Handle result");
1484 String requestId = response.get("id").asText();
1485 SettableFuture sf = requestResult.get(requestId);
1486 if (sf == null) {
1487 log.debug("No such future to process");
1488 return;
1489 }
1490 String methodName = requestMethod.get(requestId);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001491 sf.set(FromJsonUtil.jsonResultParser(response, methodName));
tanbangcheng1afecce2017-11-12 11:41:28 +08001492
1493 requestResult.remove(requestId);
1494 requestMethod.remove(requestId);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001495 }
1496
1497 @Override
1498 public void processRequest(JsonNode requestJson) {
1499 log.debug("Handle request");
1500 if (requestJson.get("method").asText().equalsIgnoreCase("echo")) {
1501 log.debug("handle echo request");
1502
1503 String replyString = FromJsonUtil.getEchoRequestStr(requestJson);
1504 channel.writeAndFlush(replyString);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001505 } else {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001506 FromJsonUtil.jsonCallbackRequestParser(requestJson, monitorCallBack);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001507 }
1508 }
1509
1510 @Override
1511 public void setCallback(Callback monitorCallback) {
1512 this.monitorCallBack = monitorCallback;
1513 }
1514
1515 @Override
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001516 public Set<OvsdbBridge> getBridges() {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001517 Set<OvsdbBridge> ovsdbBridges = new HashSet<>();
1518 OvsdbTableStore tableStore = getTableStore(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001519 if (tableStore == null) {
MaoJianweidac220d2016-07-04 22:37:52 +08001520 return ovsdbBridges;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001521 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001522 OvsdbRowStore rowStore = tableStore.getRows(BRIDGE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001523 if (rowStore == null) {
MaoJianweidac220d2016-07-04 22:37:52 +08001524 return ovsdbBridges;
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001525 }
1526 ConcurrentMap<String, Row> rows = rowStore.getRowStore();
1527 for (String uuid : rows.keySet()) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001528 Row row = getRow(DATABASENAME, BRIDGE, uuid);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001529 OvsdbBridge ovsdbBridge = getOvsdbBridge(row);
1530 if (ovsdbBridge != null) {
1531 ovsdbBridges.add(ovsdbBridge);
1532 }
1533 }
1534 return ovsdbBridges;
1535 }
1536
1537 @Override
andreaed976a42015-10-05 14:38:25 -07001538 public Set<ControllerInfo> getControllers(DeviceId openflowDeviceId) {
Jonathan Hart51539b82015-10-29 09:53:04 -07001539 Uuid bridgeUuid = getBridgeUuid(openflowDeviceId);
andreaed976a42015-10-05 14:38:25 -07001540 if (bridgeUuid == null) {
1541 log.warn("bad bridge Uuid");
1542 return null;
1543 }
1544 List<Controller> controllers = getControllers(bridgeUuid);
1545 if (controllers == null) {
1546 log.warn("bad list of controllers");
1547 return null;
1548 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001549 return controllers.stream().map(controller -> new ControllerInfo(
1550 (String) controller.getTargetColumn()
1551 .data())).collect(Collectors.toSet());
andreaed976a42015-10-05 14:38:25 -07001552 }
1553
Jonathan Hart51539b82015-10-29 09:53:04 -07001554 private List<Controller> getControllers(Uuid bridgeUuid) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001555 DatabaseSchema dbSchema = schema.get(DATABASENAME);
andreaed976a42015-10-05 14:38:25 -07001556 if (dbSchema == null) {
1557 return null;
1558 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001559 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
andreaed976a42015-10-05 14:38:25 -07001560 if (rowStore == null) {
1561 log.debug("There is no bridge table");
1562 return null;
1563 }
1564
1565 Row bridgeRow = rowStore.getRow(bridgeUuid.value());
1566 Bridge bridge = (Bridge) TableGenerator.
1567 getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
1568
1569 //FIXME remove log
1570 log.warn("type of controller column", bridge.getControllerColumn()
1571 .data().getClass());
Jonathan Hart51539b82015-10-29 09:53:04 -07001572 Set<Uuid> controllerUuids = (Set<Uuid>) ((OvsdbSet) bridge
andreaed976a42015-10-05 14:38:25 -07001573 .getControllerColumn().data()).set();
andreaed976a42015-10-05 14:38:25 -07001574
Hyunsun Moon1251e192016-06-07 16:57:05 -07001575 OvsdbRowStore controllerRowStore = getRowStore(DATABASENAME, CONTROLLER);
andreaed976a42015-10-05 14:38:25 -07001576 if (controllerRowStore == null) {
1577 log.debug("There is no controller table");
1578 return null;
1579 }
1580
1581 List<Controller> ovsdbControllers = new ArrayList<>();
1582 ConcurrentMap<String, Row> controllerTableRows = controllerRowStore.getRowStore();
1583 controllerTableRows.forEach((key, row) -> {
Jonathan Hart51539b82015-10-29 09:53:04 -07001584 if (!controllerUuids.contains(Uuid.uuid(key))) {
andreaed976a42015-10-05 14:38:25 -07001585 return;
1586 }
1587 Controller controller = (Controller) TableGenerator
1588 .getTable(dbSchema, row, OvsdbTable.CONTROLLER);
1589 ovsdbControllers.add(controller);
1590 });
1591 return ovsdbControllers;
1592 }
1593
1594
Jonathan Hart51539b82015-10-29 09:53:04 -07001595 private Uuid getBridgeUuid(DeviceId openflowDeviceId) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001596 DatabaseSchema dbSchema = schema.get(DATABASENAME);
andreaed976a42015-10-05 14:38:25 -07001597 if (dbSchema == null) {
1598 return null;
1599 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001600 OvsdbRowStore rowStore = getRowStore(DATABASENAME, BRIDGE);
andreaed976a42015-10-05 14:38:25 -07001601 if (rowStore == null) {
1602 log.debug("There is no bridge table");
1603 return null;
1604 }
1605
1606 ConcurrentMap<String, Row> bridgeTableRows = rowStore.getRowStore();
Jonathan Hart51539b82015-10-29 09:53:04 -07001607 final AtomicReference<Uuid> uuid = new AtomicReference<>();
andreaed976a42015-10-05 14:38:25 -07001608 for (Map.Entry<String, Row> entry : bridgeTableRows.entrySet()) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001609 Bridge bridge = (Bridge) TableGenerator.getTable(
1610 dbSchema,
1611 entry.getValue(),
1612 OvsdbTable.BRIDGE);
1613
1614 if (matchesDpid(bridge, openflowDeviceId)) {
Jonathan Hart51539b82015-10-29 09:53:04 -07001615 uuid.set(Uuid.uuid(entry.getKey()));
andreaed976a42015-10-05 14:38:25 -07001616 break;
1617 }
1618 }
1619 if (uuid.get() == null) {
1620 log.debug("There is no bridge for {}", openflowDeviceId);
1621 }
1622 return uuid.get();
andreaed976a42015-10-05 14:38:25 -07001623 }
1624
1625 private static boolean matchesDpid(Bridge b, DeviceId deviceId) {
1626 String ofDpid = deviceId.toString().replace("of:", "");
1627 Set ofDeviceIds = ((OvsdbSet) b.getDatapathIdColumn().data()).set();
1628 //TODO Set<String>
1629 return ofDeviceIds.contains(ofDpid);
1630 }
1631
1632 @Override
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001633 public Set<OvsdbPort> getPorts() {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001634 Set<OvsdbPort> ovsdbPorts = new HashSet<>();
1635 OvsdbTableStore tableStore = getTableStore(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001636 if (tableStore == null) {
1637 return null;
1638 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001639 OvsdbRowStore rowStore = tableStore.getRows(INTERFACE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001640 if (rowStore == null) {
1641 return null;
1642 }
1643 ConcurrentMap<String, Row> rows = rowStore.getRowStore();
1644 for (String uuid : rows.keySet()) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001645 Row row = getRow(DATABASENAME, INTERFACE, uuid);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001646 OvsdbPort ovsdbPort = getOvsdbPort(row);
1647 if (ovsdbPort != null) {
1648 ovsdbPorts.add(ovsdbPort);
1649 }
1650 }
1651 return ovsdbPorts;
1652 }
1653
1654 @Override
1655 public DatabaseSchema getDatabaseSchema(String dbName) {
1656 return schema.get(dbName);
1657 }
1658
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001659 private OvsdbPort getOvsdbPort(Row row) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001660 DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001661 Interface intf = (Interface) TableGenerator
1662 .getTable(dbSchema, row, OvsdbTable.INTERFACE);
1663 if (intf == null) {
1664 return null;
1665 }
1666 long ofPort = getOfPort(intf);
1667 String portName = intf.getName();
1668 if ((ofPort < 0) || (portName == null)) {
1669 return null;
1670 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001671 return new OvsdbPort(new OvsdbPortNumber(ofPort), new OvsdbPortName(portName));
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001672 }
1673
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001674 private OvsdbBridge getOvsdbBridge(Row row) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001675 DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
1676 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, row, OvsdbTable.BRIDGE);
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001677 if (bridge == null) {
1678 return null;
1679 }
1680
1681 OvsdbSet datapathIdSet = (OvsdbSet) bridge.getDatapathIdColumn().data();
1682 @SuppressWarnings("unchecked")
1683 Set<String> datapathIds = datapathIdSet.set();
Jon Hallcbd1b392017-01-18 20:15:44 -08001684 if (datapathIds == null || datapathIds.isEmpty()) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001685 return null;
1686 }
1687 String datapathId = (String) datapathIds.toArray()[0];
1688 String bridgeName = bridge.getName();
1689 if ((datapathId == null) || (bridgeName == null)) {
1690 return null;
1691 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001692 return OvsdbBridge.builder().name(bridgeName).datapathId(datapathId).build();
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001693 }
1694
Frank Wange11a98d2016-10-26 17:04:03 +08001695 private OvsdbQos getOvsdbQos(Row row) {
1696 DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
1697 Qos qos = (Qos) TableGenerator.getTable(dbSchema, row, OvsdbTable.QOS);
1698 if (qos == null) {
1699 return null;
1700 }
1701
1702 String type = (String) qos.getTypeColumn().data();
1703 Map<String, String> otherConfigs;
1704 Map<String, String> externalIds;
1705 Map<Long, String> queues;
1706
1707 otherConfigs = ((OvsdbMap) qos.getOtherConfigColumn().data()).map();
1708 externalIds = ((OvsdbMap) qos.getExternalIdsColumn().data()).map();
1709 queues = ((OvsdbMap) qos.getQueuesColumn().data()).map();
1710 return OvsdbQos.builder().qosType(type).
1711 queues(queues).otherConfigs(otherConfigs).
1712 externalIds(externalIds).build();
1713 }
1714
1715 private OvsdbQueue getOvsdbQueue(Row row) {
1716 DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
1717 Queue queue = (Queue) TableGenerator.getTable(dbSchema, row, OvsdbTable.QUEUE);
1718 if (queue == null) {
1719 return null;
1720 }
1721
1722 OvsdbSet dscpOvsdbSet = ((OvsdbSet) queue.getDscpColumn().data());
1723 @SuppressWarnings("unchecked")
1724 Set<String> dscpSet = dscpOvsdbSet.set();
1725 Long dscp = null;
1726 if (dscpSet != null && !dscpSet.isEmpty()) {
1727 dscp = Long.valueOf((String) dscpSet.toArray()[0]);
1728 }
1729
1730 Map<String, String> otherConfigs;
1731 Map<String, String> externalIds;
1732
1733 otherConfigs = ((OvsdbMap) queue.getOtherConfigColumn().data()).map();
1734 externalIds = ((OvsdbMap) queue.getExternalIdsColumn().data()).map();
1735 return OvsdbQueue.builder().dscp(dscp).
1736 otherConfigs(otherConfigs).externalIds(externalIds).build();
1737 }
1738
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001739 private long getOfPort(Interface intf) {
1740 OvsdbSet ofPortSet = (OvsdbSet) intf.getOpenFlowPortColumn().data();
1741 @SuppressWarnings("unchecked")
1742 Set<Integer> ofPorts = ofPortSet.set();
Jon Hallcbd1b392017-01-18 20:15:44 -08001743 if (ofPorts == null || ofPorts.isEmpty()) {
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001744 log.debug("The ofport is null in {}", intf.getName());
1745 return -1;
1746 }
1747 // return (long) ofPorts.toArray()[0];
1748 Iterator<Integer> it = ofPorts.iterator();
1749 return Long.parseLong(it.next().toString());
1750 }
CNluciusa66c3972015-09-06 20:31:29 +08001751
1752 @Override
1753 public Set<OvsdbPort> getLocalPorts(Iterable<String> ifaceids) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001754 Set<OvsdbPort> ovsdbPorts = new HashSet<>();
1755 OvsdbTableStore tableStore = getTableStore(DATABASENAME);
CNluciusa66c3972015-09-06 20:31:29 +08001756 if (tableStore == null) {
1757 return null;
1758 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001759 OvsdbRowStore rowStore = tableStore.getRows(INTERFACE);
CNluciusa66c3972015-09-06 20:31:29 +08001760 if (rowStore == null) {
1761 return null;
1762 }
1763 ConcurrentMap<String, Row> rows = rowStore.getRowStore();
1764 for (String uuid : rows.keySet()) {
Hyunsun Moon1251e192016-06-07 16:57:05 -07001765 Row row = getRow(DATABASENAME, INTERFACE, uuid);
1766 DatabaseSchema dbSchema = getDatabaseSchema(DATABASENAME);
CNluciusa66c3972015-09-06 20:31:29 +08001767 Interface intf = (Interface) TableGenerator
1768 .getTable(dbSchema, row, OvsdbTable.INTERFACE);
1769 if (intf == null || getIfaceid(intf) == null) {
1770 continue;
1771 }
1772 String portName = intf.getName();
Hyunsun Moon1251e192016-06-07 16:57:05 -07001773 if (portName == null) {
1774 continue;
1775 }
CNluciusa66c3972015-09-06 20:31:29 +08001776 Set<String> ifaceidSet = Sets.newHashSet(ifaceids);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001777 if (portName.startsWith(TYPEVXLAN) || !ifaceidSet.contains(getIfaceid(intf))) {
CNluciusa66c3972015-09-06 20:31:29 +08001778 continue;
1779 }
1780 long ofPort = getOfPort(intf);
Hyunsun Moon1251e192016-06-07 16:57:05 -07001781 if (ofPort < 0) {
CNluciusa66c3972015-09-06 20:31:29 +08001782 continue;
1783 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001784 ovsdbPorts.add(new OvsdbPort(new OvsdbPortNumber(ofPort),
1785 new OvsdbPortName(portName)));
CNluciusa66c3972015-09-06 20:31:29 +08001786 }
1787 return ovsdbPorts;
1788 }
1789
1790 private String getIfaceid(Interface intf) {
1791 OvsdbMap ovsdbMap = (OvsdbMap) intf.getExternalIdsColumn().data();
1792 @SuppressWarnings("unchecked")
1793 Map<String, String> externalIds = ovsdbMap.map();
1794 if (externalIds.isEmpty()) {
1795 log.warn("The external_ids is null");
1796 return null;
1797 }
Hyunsun Moon1251e192016-06-07 16:57:05 -07001798 String ifaceid = externalIds.get(EXTERNAL_ID_INTERFACE_ID);
CNluciusa66c3972015-09-06 20:31:29 +08001799 if (ifaceid == null) {
1800 log.warn("The ifaceid is null");
1801 return null;
1802 }
1803 return ifaceid;
1804 }
Hyunsun Moon5fb20a52015-09-25 17:02:33 -07001805
1806 @Override
1807 public void disconnect() {
1808 channel.disconnect();
1809 this.agent.removeConnectedNode(nodeId);
1810 }
Saritha1583a6f2017-06-16 14:42:58 +05301811
1812 @Override
1813 public List<OvsdbPortName> getPorts(List<String> portNames, DeviceId deviceId) {
1814 Uuid bridgeUuid = getBridgeUuid(deviceId);
1815 if (bridgeUuid == null) {
1816 log.error("Can't find the bridge for the deviceId {}", deviceId);
1817 return Collections.emptyList();
1818 }
1819 DatabaseSchema dbSchema = schema.get(DATABASENAME);
1820 Row bridgeRow = getRow(DATABASENAME, BRIDGE, bridgeUuid.value());
1821 Bridge bridge = (Bridge) TableGenerator.getTable(dbSchema, bridgeRow, OvsdbTable.BRIDGE);
1822 if (bridge == null) {
1823 return Collections.emptyList();
1824 }
1825 OvsdbSet setPorts = (OvsdbSet) bridge.getPortsColumn().data();
1826 Set<Uuid> portSet = setPorts.set();
1827 if (portSet.isEmpty()) {
1828 return Collections.emptyList();
1829 }
1830
1831 Map<Uuid, Port> portMap = portSet.stream().collect(Collectors.toMap(
1832 java.util.function.Function.identity(), port -> (Port) TableGenerator
1833 .getTable(dbSchema, getRow(DATABASENAME,
1834 PORT, port.value()), OvsdbTable.PORT)));
1835
1836 List<OvsdbPortName> portList = portMap.entrySet().stream().filter(port -> Objects.nonNull(port.getValue())
1837 && portNames.contains(port.getValue().getName())
1838 && Objects.nonNull(getInterfacebyPort(port.getKey().value(), port.getValue().getName())))
1839 .map(port -> new OvsdbPortName(port.getValue().getName())).collect(Collectors.toList());
1840
1841 return Collections.unmodifiableList(portList);
1842 }
1843
1844 @Override
1845 public boolean getPortError(List<OvsdbPortName> portNames, DeviceId bridgeId) {
1846 Uuid bridgeUuid = getBridgeUuid(bridgeId);
1847
1848 List<Interface> interfaceList = portNames.stream().collect(Collectors
1849 .toMap(java.util.function.Function.identity(),
1850 port -> (Interface) getInterfacebyPort(getPortUuid(port.value(),
1851 bridgeUuid.value()), port.value())))
1852 .entrySet().stream().filter(intf -> Objects.nonNull(intf.getValue())
1853 && ((OvsdbSet) intf.getValue().getOpenFlowPortColumn().data()).set()
1854 .stream().findAny().orElse(OFPORT_ERROR_COMPARISON).equals(OFPORT_ERROR))
1855 .map(intf -> intf.getValue()).collect(Collectors.toList());
1856
1857 interfaceList.forEach(intf -> new Consumer<Interface>() {
1858 @Override
1859 public void accept(Interface intf) {
1860 try {
1861 Set<String> setErrors = ((OvsdbSet) intf.getErrorColumn().data()).set();
1862 log.info("Port has errors. ofport value - {}, Interface - {} has error - {} ",
1863 intf.getOpenFlowPortColumn().data(), intf.getName(), setErrors.stream()
1864 .findFirst().get());
1865 } catch (ColumnSchemaNotFoundException | VersionMismatchException e) {
1866 log.debug("Port has errors. ofport value - {}, Interface - {} has error - {} ",
1867 intf.getOpenFlowPortColumn().data(), intf.getName(), e);
1868 }
1869 }
1870 }.accept(intf));
1871
1872 return !interfaceList.isEmpty();
1873 }
1874
1875 private Interface getInterfacebyPort(String portUuid, String portName) {
1876 DatabaseSchema dbSchema = schema.get(DATABASENAME);
1877
1878 Row portRow = getRow(DATABASENAME, PORT, portUuid);
1879 Port port = (Port) TableGenerator.getTable(dbSchema, portRow,
1880 OvsdbTable.PORT);
1881 if (port == null) {
1882 return null;
1883 }
1884
1885 OvsdbSet setInterfaces = (OvsdbSet) port.getInterfacesColumn().data();
1886 Set<Uuid> interfaces = setInterfaces.set();
1887
1888 return interfaces.stream().map(intf -> (Interface) TableGenerator
1889 .getTable(dbSchema, getRow(DATABASENAME,
1890 INTERFACE, intf.value()), OvsdbTable.INTERFACE))
1891 .filter(intf -> Objects.nonNull(intf) && portName.equalsIgnoreCase(intf.getName()))
1892 .findFirst().orElse(null);
1893 }
Sho SHIMIZUe4efe452015-08-26 15:06:55 -07001894}