blob: cba5c87cddc620c12f7c5cb9b7579c17b16313c3 [file] [log] [blame]
Sho SHIMIZU33c968a2015-08-26 11:37:13 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Sho SHIMIZU33c968a2015-08-26 11:37:13 -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 */
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070016
Andrea Campanella238d96e2016-01-20 11:52:02 -080017package org.onosproject.drivers.ovsdb;
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070018
Andrea Campanella65ece152016-01-21 13:33:43 -080019
Ray Milkey0d47a552017-08-22 10:16:31 -070020import java.util.ArrayList;
21import java.util.Collection;
22import java.util.Collections;
23import java.util.List;
24import java.util.Set;
25import java.util.stream.Collectors;
26
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070027import org.onlab.packet.IpAddress;
Hyunsun Moonaab8c672015-10-27 19:42:12 -070028import org.onosproject.net.DefaultAnnotations;
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070029import org.onosproject.net.DeviceId;
30import org.onosproject.net.PortNumber;
31import org.onosproject.net.behaviour.BridgeConfig;
32import org.onosproject.net.behaviour.BridgeDescription;
33import org.onosproject.net.behaviour.BridgeName;
34import org.onosproject.net.behaviour.DefaultBridgeDescription;
35import org.onosproject.net.device.DefaultPortDescription;
36import org.onosproject.net.device.PortDescription;
37import org.onosproject.net.driver.AbstractHandlerBehaviour;
38import org.onosproject.net.driver.DriverHandler;
39import org.onosproject.ovsdb.controller.OvsdbBridge;
40import org.onosproject.ovsdb.controller.OvsdbClientService;
41import org.onosproject.ovsdb.controller.OvsdbController;
42import org.onosproject.ovsdb.controller.OvsdbNodeId;
43import org.onosproject.ovsdb.controller.OvsdbPort;
44
Andrea Campanella65ece152016-01-21 13:33:43 -080045
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070046/**
47 * The implementation of BridageConfig.
48 */
49public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
50 implements BridgeConfig {
51
lishuai6c56f5e2015-11-17 16:38:19 +080052
53 @Override
Hyunsun Moon1251e192016-06-07 16:57:05 -070054 public boolean addBridge(BridgeDescription bridgeDesc) {
55 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +090056 if (client == null) {
57 return false;
58 }
Hyunsun Moon1251e192016-06-07 16:57:05 -070059 OvsdbBridge.Builder bridgeBuilder = OvsdbBridge.builder(bridgeDesc);
60 if (bridgeDesc.enableLocalController()) {
61 bridgeBuilder.controller(client.localController());
62 }
63 return client.createBridge(bridgeBuilder.build());
Hyunsun Moonaab8c672015-10-27 19:42:12 -070064 }
65
66 @Override
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070067 public void deleteBridge(BridgeName bridgeName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -070068 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +090069 if (client == null) {
70 return;
71 }
Hyunsun Moon1251e192016-06-07 16:57:05 -070072 client.dropBridge(bridgeName.name());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070073 }
74
75 @Override
76 public Collection<BridgeDescription> getBridges() {
Hyunsun Moon1251e192016-06-07 16:57:05 -070077 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +090078 if (client == null) {
79 return Collections.emptyList();
80 }
81
Hyunsun Moon1251e192016-06-07 16:57:05 -070082 Set<OvsdbBridge> bridges = client.getBridges();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -070083
84 return bridges.stream()
Hyunsun Moon1251e192016-06-07 16:57:05 -070085 .map(bridge -> DefaultBridgeDescription.builder()
86 .name(bridge.name())
87 .datapathId(bridge.datapathId().get())
88 .build())
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -070089 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070090 }
91
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070092 @Override
Hyunsun Moon52b93362016-01-19 11:53:57 -080093 public void addPort(BridgeName bridgeName, String portName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -070094 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +090095 if (client == null) {
96 return;
97 }
Hyunsun Moon1251e192016-06-07 16:57:05 -070098 client.createPort(bridgeName.name(), portName);
Hyunsun Moon52b93362016-01-19 11:53:57 -080099 }
100
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700101 @Override
Andrea Campanella65ece152016-01-21 13:33:43 -0800102 public void deletePort(BridgeName bridgeName, String portName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700103 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900104 if (client == null) {
105 return;
106 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700107 client.dropPort(bridgeName.name(), portName);
Andrea Campanella65ece152016-01-21 13:33:43 -0800108 }
109
110 @Override
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700111 public Collection<PortDescription> getPorts() {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700112 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900113 if (client == null) {
114 return Collections.emptyList();
115 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700116 Set<OvsdbPort> ports = client.getPorts();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700117
118 return ports.stream()
Yuta HIGUCHI53e47962018-03-01 23:50:48 -0800119 .map(x -> DefaultPortDescription.builder()
120 .withPortNumber(PortNumber.portNumber(x.portNumber().value()))
121 .isEnabled(true)
122 .annotations(DefaultAnnotations.builder()
123 .set("portName", x.portName().value())
124 .build()).build())
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700125 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700126 }
127
jiangrui866c2f22015-10-28 18:58:34 +0800128 // OvsdbNodeId(IP) is used in the adaptor while DeviceId(ovsdb:IP)
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700129 // is used in the core. So DeviceId need be changed to OvsdbNodeId.
130 private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {
jiangrui866c2f22015-10-28 18:58:34 +0800131 String[] splits = deviceId.toString().split(":");
132 if (splits == null || splits.length < 1) {
133 return null;
134 }
Hyunsun Moondbab8de2015-10-28 16:45:04 -0700135 IpAddress ipAddress = IpAddress.valueOf(splits[1]);
jiangrui866c2f22015-10-28 18:58:34 +0800136 return new OvsdbNodeId(ipAddress, 0);
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700137 }
138
139 // Used for getting OvsdbClientService.
140 private OvsdbClientService getOvsdbClientService(DriverHandler handler) {
141 OvsdbController ovsController = handler.get(OvsdbController.class);
142 DeviceId deviceId = handler.data().deviceId();
143 OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);
144 return ovsController.getOvsdbClient(nodeId);
145 }
146
147 @Override
148 public Set<PortNumber> getPortNumbers() {
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700149 DriverHandler handler = handler();
Hyunsun Moon1251e192016-06-07 16:57:05 -0700150 OvsdbClientService client = getOvsdbClientService(handler);
jaegonkim38e32722017-01-19 00:12:12 +0900151 if (client == null) {
152 return Collections.emptySet();
153 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700154 Set<OvsdbPort> ports = client.getPorts();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700155
156 return ports.stream()
157 .map(x -> PortNumber.portNumber(
158 x.portNumber().value(),
159 x.portName().value()
160 )
161 )
162 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700163 }
CNluciusa66c3972015-09-06 20:31:29 +0800164
165 @Override
166 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
167 List<PortNumber> ports = new ArrayList<>();
168 DriverHandler handler = handler();
Hyunsun Moon1251e192016-06-07 16:57:05 -0700169 OvsdbClientService client = getOvsdbClientService(handler);
jaegonkim38e32722017-01-19 00:12:12 +0900170 if (client == null) {
171 return Collections.emptyList();
172 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700173 Set<OvsdbPort> ovsdbSet = client.getLocalPorts(ifaceIds);
CNluciusa66c3972015-09-06 20:31:29 +0800174 ovsdbSet.forEach(o -> {
175 PortNumber port = PortNumber.portNumber(o.portNumber().value(),
176 o.portName().value());
177 ports.add(port);
178 });
179 return ports;
180 }
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700181}