blob: dcf0c99038605b9ef63b860beac8a36fff639605 [file] [log] [blame]
HelloONOS137e1fb2019-08-20 16:43:52 +09001/*
2 * Copyright 2019-present Open Networking Foundation
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 */
16
17package org.onosproject.drivers.dellrest;
18
19import org.onosproject.net.DeviceId;
20import org.onosproject.net.behaviour.ControllerConfig;
21import org.onosproject.net.behaviour.ControllerInfo;
22import org.onosproject.net.driver.AbstractHandlerBehaviour;
23import org.onosproject.net.driver.DriverHandler;
24import org.onosproject.protocol.rest.RestSBController;
25import org.slf4j.Logger;
26import org.slf4j.LoggerFactory;
27
28import javax.ws.rs.core.MediaType;
29import java.io.InputStream;
30import java.io.StringBufferInputStream;
31import java.util.ArrayList;
32import java.util.List;
33
34import static com.google.common.base.Preconditions.checkNotNull;
35
36public class DellRestOpenFlowControllerConfig extends AbstractHandlerBehaviour
37 implements ControllerConfig {
38
39 private final Logger log = LoggerFactory.getLogger(getClass());
40
41 private static final String TCP = "tcp";
42 private static final String CLI_REQUEST = "/running/dell/_operations/cli";
43 private static final String SET_CONTROLLERS_XML = "<input>" +
44 "<config-commands>" +
45 "openflow of-instance 1\\r\\n" + // for now supports only one instance
46 "shutdown\\r\\n" +
47 "%s" +
48 "of-version 1.3\\r\\n" +
49 "no shutdown" + // TODO: check previous state
50 "</config-commands>" +
51 "</input>";
52 private static final String SET_CONTROLLER = "controller %d %s port %d tcp\\r\\n";
53 private static final String NO_CONTROLLER = "no controller %d\\r\\n";
54 private static final int MAX_CONTROLLERS = 2;
55
56 @Override
57 public List<ControllerInfo> getControllers() {
58 return new ArrayList<>();
59 }
60
61 // Example test with ONOS CLI:
62 // device-setcontrollers rest:10.251.217.143:8008 tcp:1.2.3.4:2222
63
64 // TODO: assumes that of-instance 1 was in "no shutdown" state,
65 // check previous state
66 @Override
67 public void setControllers(List<ControllerInfo> controllers) {
68
69 // Dell supports max 2 controllers per of-instance
70 if (controllers.size() > MAX_CONTROLLERS) {
71 log.warn("Cannot set more than 2 controllers.");
72 }
73
74 DriverHandler handler = handler();
75 RestSBController controller = checkNotNull(handler.get(RestSBController.class));
76 DeviceId deviceId = handler.data().deviceId();
77
78 String controllerCommands = getControllerCommands(controllers).stream()
79 .reduce(String::concat)
80 .orElse("");
81
82 InputStream payload = new StringBufferInputStream(String.format(SET_CONTROLLERS_XML, controllerCommands));
83 String resp = controller.post(deviceId, CLI_REQUEST, payload, MediaType.valueOf("*/*"), String.class);
84 log.info("{}", resp);
85 }
86
87 // Get controller commands for maximum first 2 controllers
88 private List<String> getControllerCommands(List<ControllerInfo> controllers) {
89 List<String> controllerCommands = new ArrayList<>();
90
91 for (int controllerNum = 0; controllerNum < MAX_CONTROLLERS; ++controllerNum) {
92 if (controllers.size() > controllerNum) {
93 ControllerInfo controllerInfo = controllers.get(controllerNum);
94 // Only "tcp" type is supported
95 if (controllerInfo.type().equals(TCP)) {
96 String ip = controllerInfo.ip().toString();
97 int port = controllerInfo.port();
98 controllerCommands.add(String.format(SET_CONTROLLER, controllerNum + 1, ip, port));
99 } else {
100 log.warn("Controller type can only be 'tcp'");
101 controllerCommands.add(String.format(NO_CONTROLLER, controllerNum + 1));
102 }
103 } else {
104 // remove existing controller
105 controllerCommands.add(String.format(NO_CONTROLLER, controllerNum + 1));
106 }
107 }
108
109 return controllerCommands;
110 }
111}