blob: a5c54745973737f411c2cce3a84cbf63b1ba86b8 [file] [log] [blame]
samuel68a6c622015-07-21 15:14:51 +08001/*
2 * Copyright 2015 Open Networking Laboratory
3 *
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.driver.ovsdb;
17
18import java.util.Collection;
19import java.util.Set;
20
21import org.onlab.packet.IpAddress;
22import 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;
27import org.onosproject.net.behaviour.DefaultBridgeDescription;
28import org.onosproject.net.device.DefaultPortDescription;
29import org.onosproject.net.device.PortDescription;
30import org.onosproject.net.driver.AbstractHandlerBehaviour;
31import org.onosproject.net.driver.DriverHandler;
32import org.onosproject.ovsdb.controller.OvsdbBridge;
33import org.onosproject.ovsdb.controller.OvsdbClientService;
34import org.onosproject.ovsdb.controller.OvsdbController;
35import org.onosproject.ovsdb.controller.OvsdbNodeId;
36import org.onosproject.ovsdb.controller.OvsdbPort;
37
38import com.google.common.collect.Sets;
39
40/**
41 * The implementation of BridageConfig.
42 */
43public class OvsdbBridgeConfig extends AbstractHandlerBehaviour
44 implements BridgeConfig {
45
46 @Override
47 public void addBridge(BridgeName bridgeName) {
48 DriverHandler handler = handler();
49 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
50 ovsdbNode.createBridge(bridgeName.name());
51 }
52
53 @Override
54 public void deleteBridge(BridgeName bridgeName) {
55 DriverHandler handler = handler();
56 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
57 ovsdbNode.dropBridge(bridgeName.name());
58 }
59
60 @Override
61 public Collection<BridgeDescription> getBridges() {
62 DriverHandler handler = handler();
63 DeviceId deviceId = handler.data().deviceId();
64 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
65 Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
66 Collection<BridgeDescription> bridges = Sets.newHashSet();
67 ovsdbSet.forEach(o -> {
68 BridgeName bridgeName = BridgeName.bridgeName(o.bridgeName()
69 .toString());
70 DeviceId ownDeviceId = DeviceId.deviceId(o.datapathId().toString());
71 BridgeDescription description = new DefaultBridgeDescription(
72 bridgeName,
73 deviceId,
74 ownDeviceId);
75 bridges.add(description);
76 });
77 return bridges;
78 }
79
80 @Override
81 public void addPort(PortDescription port) {
82 DriverHandler handler = handler();
83 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
84 Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
85 if (ovsdbSet != null && ovsdbSet.size() > 0) {
86 OvsdbBridge bridge = ovsdbSet.iterator().next();
87 ovsdbNode.createPort(bridge.bridgeName().toString(), port
88 .portNumber().toString());
89 }
90 }
91
92 @Override
93 public void deletePort(PortDescription port) {
94 DriverHandler handler = handler();
95 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
96 Set<OvsdbBridge> ovsdbSet = ovsdbNode.getBridges();
97 if (ovsdbSet != null && ovsdbSet.size() > 0) {
98 OvsdbBridge bridge = ovsdbSet.iterator().next();
99 ovsdbNode.dropPort(bridge.bridgeName().toString(), port
100 .portNumber().toString());
101 }
102 }
103
104 @Override
105 public Collection<PortDescription> getPorts() {
106 DriverHandler handler = handler();
107 OvsdbClientService ovsdbNode = getOvsdbNode(handler);
108 Set<OvsdbPort> ovsdbSet = ovsdbNode.getPorts();
109 Collection<PortDescription> ports = Sets.newHashSet();
110 ovsdbSet.forEach(o -> {
111 PortNumber port = PortNumber.portNumber(o.portNumber().value());
112 PortDescription description = new DefaultPortDescription(port, true);
113 ports.add(description);
114 });
115 return ports;
116 }
117
118 // OvsdbNodeId(IP:port) is used in the adaptor while DeviceId(ovsdb:IP:port)
119 // is used in the core. So DeviceId need be changed to OvsdbNodeId.
120 private OvsdbNodeId changeDeviceIdToNodeId(DeviceId deviceId) {
121 int lastColon = deviceId.toString().lastIndexOf(":");
122 int fistColon = deviceId.toString().indexOf(":");
123 String ip = deviceId.toString().substring(fistColon + 1, lastColon - 1);
124 String port = deviceId.toString().substring(lastColon + 1);
125 IpAddress ipAddress = IpAddress.valueOf(ip);
126 long portL = Long.valueOf(port).longValue();
127 return new OvsdbNodeId(ipAddress, portL);
128 }
129
130 private OvsdbClientService getOvsdbNode(DriverHandler handler) {
131 OvsdbController ovsController = handler.get(OvsdbController.class);
132 DeviceId deviceId = handler.data().deviceId();
133 OvsdbNodeId nodeId = changeDeviceIdToNodeId(deviceId);
134 return ovsController.getOvsdbClient(nodeId);
135 }
136}