Hyunsun Moon
Committed by Gerrit Code Review

CORD-223 Changed to use ovsdb driver to create tunnel interface and bridge

Change-Id: Ibd8ab0555bab3bcc9200958fd55e0bc67b0ea383
...@@ -23,17 +23,27 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -23,17 +23,27 @@ import org.apache.felix.scr.annotations.Deactivate;
23 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.apache.felix.scr.annotations.Service; 25 import org.apache.felix.scr.annotations.Service;
26 +import org.onlab.util.ItemNotFoundException;
26 import org.onlab.util.KryoNamespace; 27 import org.onlab.util.KryoNamespace;
27 import org.onosproject.cluster.ClusterService; 28 import org.onosproject.cluster.ClusterService;
28 import org.onosproject.core.ApplicationId; 29 import org.onosproject.core.ApplicationId;
29 import org.onosproject.core.CoreService; 30 import org.onosproject.core.CoreService;
31 +import org.onosproject.net.DefaultAnnotations;
30 import org.onosproject.net.Device; 32 import org.onosproject.net.Device;
31 import org.onosproject.net.DeviceId; 33 import org.onosproject.net.DeviceId;
32 import org.onosproject.net.Host; 34 import org.onosproject.net.Host;
35 +import org.onosproject.net.behaviour.BridgeConfig;
36 +import org.onosproject.net.behaviour.BridgeName;
33 import org.onosproject.net.behaviour.ControllerInfo; 37 import org.onosproject.net.behaviour.ControllerInfo;
38 +import org.onosproject.net.behaviour.DefaultTunnelDescription;
39 +import org.onosproject.net.behaviour.TunnelConfig;
40 +import org.onosproject.net.behaviour.TunnelDescription;
41 +import org.onosproject.net.behaviour.TunnelName;
34 import org.onosproject.net.device.DeviceEvent; 42 import org.onosproject.net.device.DeviceEvent;
35 import org.onosproject.net.device.DeviceListener; 43 import org.onosproject.net.device.DeviceListener;
36 import org.onosproject.net.device.DeviceService; 44 import org.onosproject.net.device.DeviceService;
45 +import org.onosproject.net.driver.DriverHandler;
46 +import org.onosproject.net.driver.DriverService;
37 import org.onosproject.net.host.HostEvent; 47 import org.onosproject.net.host.HostEvent;
38 import org.onosproject.net.host.HostListener; 48 import org.onosproject.net.host.HostListener;
39 import org.onosproject.net.host.HostService; 49 import org.onosproject.net.host.HostService;
...@@ -58,6 +68,7 @@ import java.util.concurrent.Executors; ...@@ -58,6 +68,7 @@ import java.util.concurrent.Executors;
58 import static com.google.common.base.Preconditions.checkNotNull; 68 import static com.google.common.base.Preconditions.checkNotNull;
59 import static org.onlab.util.Tools.groupedThreads; 69 import static org.onlab.util.Tools.groupedThreads;
60 import static org.onosproject.net.Device.Type.SWITCH; 70 import static org.onosproject.net.Device.Type.SWITCH;
71 +import static org.onosproject.net.behaviour.TunnelDescription.Type.VXLAN;
61 import static org.slf4j.LoggerFactory.getLogger; 72 import static org.slf4j.LoggerFactory.getLogger;
62 73
63 /** 74 /**
...@@ -79,7 +90,6 @@ public class CordVtn implements CordVtnService { ...@@ -79,7 +90,6 @@ public class CordVtn implements CordVtnService {
79 private static final Map<String, String> DEFAULT_TUNNEL_OPTIONS = new HashMap<String, String>() { 90 private static final Map<String, String> DEFAULT_TUNNEL_OPTIONS = new HashMap<String, String>() {
80 { 91 {
81 put("key", "flow"); 92 put("key", "flow");
82 - put("local_ip", "flow");
83 put("remote_ip", "flow"); 93 put("remote_ip", "flow");
84 } 94 }
85 }; 95 };
...@@ -99,6 +109,9 @@ public class CordVtn implements CordVtnService { ...@@ -99,6 +109,9 @@ public class CordVtn implements CordVtnService {
99 protected HostService hostService; 109 protected HostService hostService;
100 110
101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 111 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
112 + protected DriverService driverService;
113 +
114 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
102 protected OvsdbController controller; 115 protected OvsdbController controller;
103 116
104 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 117 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
...@@ -213,8 +226,8 @@ public class CordVtn implements CordVtnService { ...@@ -213,8 +226,8 @@ public class CordVtn implements CordVtnService {
213 if (deviceService.getDevice(ovsdb.intBrId()) == null || 226 if (deviceService.getDevice(ovsdb.intBrId()) == null ||
214 !deviceService.isAvailable(ovsdb.intBrId())) { 227 !deviceService.isAvailable(ovsdb.intBrId())) {
215 createIntegrationBridge(ovsdb); 228 createIntegrationBridge(ovsdb);
216 - } else if (!checkVxlanPort(ovsdb)) { 229 + } else if (!checkVxlanInterface(ovsdb)) {
217 - createVxlanPort(ovsdb); 230 + createVxlanInterface(ovsdb);
218 } 231 }
219 } 232 }
220 233
...@@ -272,26 +285,41 @@ public class CordVtn implements CordVtnService { ...@@ -272,26 +285,41 @@ public class CordVtn implements CordVtnService {
272 }); 285 });
273 String dpid = ovsdb.intBrId().toString().substring(DPID_BEGIN); 286 String dpid = ovsdb.intBrId().toString().substring(DPID_BEGIN);
274 287
275 - // TODO change to use bridge config 288 + try {
276 - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); 289 + DriverHandler handler = driverService.createHandler(ovsdb.deviceId());
277 - ovsdbClient.createBridge(DEFAULT_BRIDGE_NAME, dpid, controllers); 290 + BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
291 + bridgeConfig.addBridge(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), dpid, controllers);
292 + } catch (ItemNotFoundException e) {
293 + log.warn("Failed to create integration bridge on {}", ovsdb.deviceId());
294 + }
278 } 295 }
279 296
280 - private void createVxlanPort(OvsdbNode ovsdb) { 297 + private void createVxlanInterface(OvsdbNode ovsdb) {
281 - // TODO change to use tunnel config and tunnel description 298 + DefaultAnnotations.Builder optionBuilder = DefaultAnnotations.builder();
282 - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb); 299 + for (String key : DEFAULT_TUNNEL_OPTIONS.keySet()) {
283 - ovsdbClient.createTunnel(DEFAULT_BRIDGE_NAME, DEFAULT_TUNNEL, 300 + optionBuilder.set(key, DEFAULT_TUNNEL_OPTIONS.get(key));
284 - DEFAULT_TUNNEL, DEFAULT_TUNNEL_OPTIONS); 301 + }
302 + TunnelDescription description =
303 + new DefaultTunnelDescription(null, null, VXLAN,
304 + TunnelName.tunnelName(DEFAULT_TUNNEL),
305 + optionBuilder.build());
306 + try {
307 + DriverHandler handler = driverService.createHandler(ovsdb.deviceId());
308 + TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
309 + tunnelConfig.createTunnelInterface(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), description);
310 + } catch (ItemNotFoundException e) {
311 + log.warn("Failed to create VXLAN interface on {}", ovsdb.deviceId());
312 + }
285 } 313 }
286 314
287 - private boolean checkVxlanPort(OvsdbNode ovsdb) { 315 + private boolean checkVxlanInterface(OvsdbNode ovsdb) {
288 - // TODO change to use tunnel config
289 - OvsdbClientService ovsdbClient = getOvsdbClient(ovsdb);
290 try { 316 try {
291 - ovsdbClient.getPorts().stream() 317 + DriverHandler handler = driverService.createHandler(ovsdb.deviceId());
292 - .filter(p -> p.portName().value().equals(DEFAULT_TUNNEL)) 318 + BridgeConfig bridgeConfig = handler.behaviour(BridgeConfig.class);
293 - .findFirst().get(); 319 + bridgeConfig.getPorts().stream()
294 - } catch (NoSuchElementException e) { 320 + .filter(p -> p.annotations().value("portName").equals(DEFAULT_TUNNEL))
321 + .findAny().get();
322 + } catch (ItemNotFoundException | NoSuchElementException e) {
295 return false; 323 return false;
296 } 324 }
297 return true; 325 return true;
...@@ -374,8 +402,8 @@ public class CordVtn implements CordVtnService { ...@@ -374,8 +402,8 @@ public class CordVtn implements CordVtnService {
374 return; 402 return;
375 } 403 }
376 404
377 - if (!checkVxlanPort(ovsdb)) { 405 + if (!checkVxlanInterface(ovsdb)) {
378 - createVxlanPort(ovsdb); 406 + createVxlanInterface(ovsdb);
379 } 407 }
380 } 408 }
381 409
......
...@@ -110,7 +110,7 @@ public class CordVtnConfigManager { ...@@ -110,7 +110,7 @@ public class CordVtnConfigManager {
110 break; 110 break;
111 case CONFIG_UPDATED: 111 case CONFIG_UPDATED:
112 log.info("Network configuration updated"); 112 log.info("Network configuration updated");
113 - // TODO handle update event 113 + readConfiguration();
114 break; 114 break;
115 default: 115 default:
116 break; 116 break;
......