blob: 5656664cab7f72a744f759d2eea19cf1bd6deeb6 [file] [log] [blame]
Sho SHIMIZU33c968a2015-08-26 11:37:13 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
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
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070020import org.onlab.packet.IpAddress;
Hyunsun Moonaab8c672015-10-27 19:42:12 -070021import org.onosproject.net.DefaultAnnotations;
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070022import org.onosproject.net.DeviceId;
23import org.onosproject.net.PortNumber;
24import org.onosproject.net.behaviour.BridgeConfig;
25import org.onosproject.net.behaviour.BridgeDescription;
26import org.onosproject.net.behaviour.BridgeName;
Hyunsun Moonaab8c672015-10-27 19:42:12 -070027import org.onosproject.net.behaviour.ControllerInfo;
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070028import org.onosproject.net.behaviour.DefaultBridgeDescription;
29import org.onosproject.net.device.DefaultPortDescription;
30import org.onosproject.net.device.PortDescription;
31import org.onosproject.net.driver.AbstractHandlerBehaviour;
32import org.onosproject.net.driver.DriverHandler;
33import org.onosproject.ovsdb.controller.OvsdbBridge;
34import org.onosproject.ovsdb.controller.OvsdbClientService;
35import org.onosproject.ovsdb.controller.OvsdbController;
36import org.onosproject.ovsdb.controller.OvsdbNodeId;
37import org.onosproject.ovsdb.controller.OvsdbPort;
38
Andrea Campanella238d96e2016-01-20 11:52:02 -080039import java.util.ArrayList;
40import java.util.Collection;
jaegonkim38e32722017-01-19 00:12:12 +090041import java.util.Collections;
Andrea Campanella238d96e2016-01-20 11:52:02 -080042import java.util.List;
43import java.util.Set;
44import java.util.stream.Collectors;
45
Andrea Campanella65ece152016-01-21 13:33:43 -080046
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070047/**
48 * The implementation of BridageConfig.
49 */
50public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
51 implements BridgeConfig {
52
Hyunsun Moon1251e192016-06-07 16:57:05 -070053 @Deprecated
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070054 @Override
55 public void addBridge(BridgeName bridgeName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -070056 BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
57 .name(bridgeName.name())
58 .build();
59
60 addBridge(bridgeDesc);
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070061 }
62
Hyunsun Moon1251e192016-06-07 16:57:05 -070063 @Deprecated
Sho SHIMIZU33c968a2015-08-26 11:37:13 -070064 @Override
lishuai6c56f5e2015-11-17 16:38:19 +080065 public void addBridge(BridgeName bridgeName, String dpid, String exPortName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -070066 BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
67 .name(bridgeName.name())
68 .failMode(BridgeDescription.FailMode.SECURE)
69 .datapathId(dpid)
70 .disableInBand()
71 .enableLocalController()
72 .build();
73
74 addBridge(bridgeDesc);
75
76 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +090077 if (client == null) {
78 return;
79 }
Hyunsun Moon1251e192016-06-07 16:57:05 -070080 client.createPort(bridgeName.name(), exPortName);
81 }
82
83 @Deprecated
84 @Override
85 public boolean addBridge(BridgeName bridgeName, String dpid, List<ControllerInfo> controllers) {
86 BridgeDescription bridgeDesc = DefaultBridgeDescription.builder()
87 .name(bridgeName.name())
88 .failMode(BridgeDescription.FailMode.SECURE)
89 .datapathId(dpid)
90 .disableInBand()
91 .controllers(controllers)
92 .build();
93
94 return addBridge(bridgeDesc);
lishuai6c56f5e2015-11-17 16:38:19 +080095 }
96
97 @Override
Hyunsun Moon1251e192016-06-07 16:57:05 -070098 public boolean addBridge(BridgeDescription bridgeDesc) {
99 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900100 if (client == null) {
101 return false;
102 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700103 OvsdbBridge.Builder bridgeBuilder = OvsdbBridge.builder(bridgeDesc);
104 if (bridgeDesc.enableLocalController()) {
105 bridgeBuilder.controller(client.localController());
106 }
107 return client.createBridge(bridgeBuilder.build());
Hyunsun Moonaab8c672015-10-27 19:42:12 -0700108 }
109
110 @Override
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700111 public void deleteBridge(BridgeName bridgeName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700112 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900113 if (client == null) {
114 return;
115 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700116 client.dropBridge(bridgeName.name());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700117 }
118
119 @Override
120 public Collection<BridgeDescription> getBridges() {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700121 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900122 if (client == null) {
123 return Collections.emptyList();
124 }
125
Hyunsun Moon1251e192016-06-07 16:57:05 -0700126 Set<OvsdbBridge> bridges = client.getBridges();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700127
128 return bridges.stream()
Hyunsun Moon1251e192016-06-07 16:57:05 -0700129 .map(bridge -> DefaultBridgeDescription.builder()
130 .name(bridge.name())
131 .datapathId(bridge.datapathId().get())
132 .build())
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700133 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700134 }
135
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700136 @Override
Hyunsun Moon52b93362016-01-19 11:53:57 -0800137 public void addPort(BridgeName bridgeName, String portName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700138 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900139 if (client == null) {
140 return;
141 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700142 client.createPort(bridgeName.name(), portName);
Hyunsun Moon52b93362016-01-19 11:53:57 -0800143 }
144
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700145 @Override
Andrea Campanella65ece152016-01-21 13:33:43 -0800146 public void deletePort(BridgeName bridgeName, String portName) {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700147 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900148 if (client == null) {
149 return;
150 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700151 client.dropPort(bridgeName.name(), portName);
Andrea Campanella65ece152016-01-21 13:33:43 -0800152 }
153
154 @Override
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700155 public Collection<PortDescription> getPorts() {
Hyunsun Moon1251e192016-06-07 16:57:05 -0700156 OvsdbClientService client = getOvsdbClientService(handler());
jaegonkim38e32722017-01-19 00:12:12 +0900157 if (client == null) {
158 return Collections.emptyList();
159 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700160 Set<OvsdbPort> ports = client.getPorts();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700161
162 return ports.stream()
163 .map(x -> new DefaultPortDescription(
164 PortNumber.portNumber(x.portNumber().value()),
Hyunsun Moonaab8c672015-10-27 19:42:12 -0700165 true,
166 DefaultAnnotations.builder()
167 .set("portName", x.portName().value())
168 .build()))
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700169 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700170 }
171
jiangrui866c2f22015-10-28 18:58:34 +0800172 // OvsdbNodeId(IP) is used in the adaptor while DeviceId(ovsdb:IP)
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700173 // is used in the core. So DeviceId need be changed to OvsdbNodeId.
174 private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {
jiangrui866c2f22015-10-28 18:58:34 +0800175 String[] splits = deviceId.toString().split(":");
176 if (splits == null || splits.length < 1) {
177 return null;
178 }
Hyunsun Moondbab8de2015-10-28 16:45:04 -0700179 IpAddress ipAddress = IpAddress.valueOf(splits[1]);
jiangrui866c2f22015-10-28 18:58:34 +0800180 return new OvsdbNodeId(ipAddress, 0);
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700181 }
182
183 // Used for getting OvsdbClientService.
184 private OvsdbClientService getOvsdbClientService(DriverHandler handler) {
185 OvsdbController ovsController = handler.get(OvsdbController.class);
186 DeviceId deviceId = handler.data().deviceId();
187 OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);
188 return ovsController.getOvsdbClient(nodeId);
189 }
190
191 @Override
192 public Set<PortNumber> getPortNumbers() {
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700193 DriverHandler handler = handler();
Hyunsun Moon1251e192016-06-07 16:57:05 -0700194 OvsdbClientService client = getOvsdbClientService(handler);
jaegonkim38e32722017-01-19 00:12:12 +0900195 if (client == null) {
196 return Collections.emptySet();
197 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700198 Set<OvsdbPort> ports = client.getPorts();
Sho SHIMIZU3be9fbe2015-08-26 14:36:21 -0700199
200 return ports.stream()
201 .map(x -> PortNumber.portNumber(
202 x.portNumber().value(),
203 x.portName().value()
204 )
205 )
206 .collect(Collectors.toSet());
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700207 }
CNluciusa66c3972015-09-06 20:31:29 +0800208
209 @Override
210 public List<PortNumber> getLocalPorts(Iterable<String> ifaceIds) {
211 List<PortNumber> ports = new ArrayList<>();
212 DriverHandler handler = handler();
Hyunsun Moon1251e192016-06-07 16:57:05 -0700213 OvsdbClientService client = getOvsdbClientService(handler);
jaegonkim38e32722017-01-19 00:12:12 +0900214 if (client == null) {
215 return Collections.emptyList();
216 }
Hyunsun Moon1251e192016-06-07 16:57:05 -0700217 Set<OvsdbPort> ovsdbSet = client.getLocalPorts(ifaceIds);
CNluciusa66c3972015-09-06 20:31:29 +0800218 ovsdbSet.forEach(o -> {
219 PortNumber port = PortNumber.portNumber(o.portNumber().value(),
220 o.portName().value());
221 ports.add(port);
222 });
223 return ports;
224 }
Sho SHIMIZU33c968a2015-08-26 11:37:13 -0700225}