blob: 0e9f0f21bb216eea2f2a01f8439d336c8d99f1ea [file] [log] [blame]
Palash Kalac99b15a2017-06-14 09:36:56 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Palash Kalac99b15a2017-06-14 09:36:56 +09003 *
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.arista;
18
sdn9952dab2018-06-12 14:52:51 +090019import java.util.ArrayList;
20import java.util.Iterator;
21import java.util.List;
22import java.util.Optional;
23
DongRyeol Cha06041fa2018-06-07 10:23:32 +090024import com.google.common.collect.Lists;
sdn9952dab2018-06-12 14:52:51 +090025import com.google.common.collect.ImmutableList;
26import org.onlab.packet.IpAddress;
Palash Kalac99b15a2017-06-14 09:36:56 +090027import org.onosproject.net.behaviour.ControllerConfig;
28import org.onosproject.net.behaviour.ControllerInfo;
29import org.onosproject.net.driver.AbstractHandlerBehaviour;
Palash Kalac99b15a2017-06-14 09:36:56 +090030import org.slf4j.Logger;
sdn9952dab2018-06-12 14:52:51 +090031import com.fasterxml.jackson.databind.JsonNode;
Palash Kalac99b15a2017-06-14 09:36:56 +090032
Palash Kalac99b15a2017-06-14 09:36:56 +090033import static org.slf4j.LoggerFactory.getLogger;
34
35/**
36 * Sets, gets and removes the openflow controller configuration from a Arista Rest device.
37 */
38public class ControllerConfigAristaImpl extends AbstractHandlerBehaviour implements ControllerConfig {
39
sdn9952dab2018-06-12 14:52:51 +090040 private static final String SHOW_CONTROLLER_CMD = "show openflow";
Palash Kalac99b15a2017-06-14 09:36:56 +090041 private static final String CONFIGURE_TERMINAL = "configure";
42 private static final String OPENFLOW_CMD = "openflow";
sdn9952dab2018-06-12 14:52:51 +090043 private static final String SET_CONTROLLER_CMD = "controller tcp:%s:%d";
44 private static final String NO_SHUTDOWN_CMD = "no shutdown";
45 private static final String SHUTDOWN_CMD = "shutdown";
Palash Kalac99b15a2017-06-14 09:36:56 +090046 private static final String REMOVE_CONTROLLER_CMD = "no controller tcp:%s:%d";
sdn9952dab2018-06-12 14:52:51 +090047 private static final String COPY_RUNNING_CONFIG = "copy running-config startup-config";
HelloONOS4baf78a2019-02-14 18:47:19 +090048 private static final String CONTROLLER_INFO = "controllersInfo";
sdn9952dab2018-06-12 14:52:51 +090049 private static final String CONTROLLER_ADDR = "controllerAddr";
50 private static final String CONTROLLER_IP = "ip";
51 private static final String CONTROLLER_PORT = "port";
52 private static final String PROTOCOL_TCP = "tcp";
53
54
Palash Kalac99b15a2017-06-14 09:36:56 +090055 private static final int MAX_CONTROLLERS = 8;
Palash Kalac99b15a2017-06-14 09:36:56 +090056
57 private final Logger log = getLogger(getClass());
58
59 @Override
60 public List<ControllerInfo> getControllers() {
sdn9952dab2018-06-12 14:52:51 +090061 log.debug("Arista get Controllers");
62
63 List<ControllerInfo> controllers = new ArrayList<>();
64 Optional<JsonNode> res = AristaUtils.retrieveCommandResult(handler(), SHOW_CONTROLLER_CMD);
65 if (res == null) {
HelloONOS4baf78a2019-02-14 18:47:19 +090066 log.warn("There is no connected controller.");
sdn9952dab2018-06-12 14:52:51 +090067 return controllers;
68 }
69
HelloONOS4baf78a2019-02-14 18:47:19 +090070 JsonNode controllerInfo = res.get().findValue(CONTROLLER_INFO);
sdn9952dab2018-06-12 14:52:51 +090071 Iterator<JsonNode> controlleriter = controllerInfo.iterator();
72 while (controlleriter.hasNext()) {
73 JsonNode temp1 = controlleriter.next();
74 if (temp1.has(CONTROLLER_ADDR)) {
75 JsonNode controllerAddr = temp1.get(CONTROLLER_ADDR);
76 if (controllerAddr.has(CONTROLLER_IP) && controllerAddr.has(CONTROLLER_PORT)) {
77 String ip = controllerAddr.get(CONTROLLER_IP).asText();
78 int port = controllerAddr.get(CONTROLLER_PORT).asInt();
79 ControllerInfo info = new ControllerInfo(IpAddress.valueOf(ip), port, PROTOCOL_TCP);
80 controllers.add(info);
81 log.debug("Controller Information {}", info.target());
82 }
83 }
84 }
85
86 return ImmutableList.copyOf(controllers);
Palash Kalac99b15a2017-06-14 09:36:56 +090087 }
88
89 @Override
90 public void setControllers(List<ControllerInfo> controllers) {
sdn9952dab2018-06-12 14:52:51 +090091 log.debug("Arista set Controllers");
92
93 List<String> cmds = new ArrayList<>();
94 cmds.add(CONFIGURE_TERMINAL);
95 cmds.add(OPENFLOW_CMD);
96 //The Arista switch supports up to 8 multi-controllers.
97 controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds
98 .add(String.format(SET_CONTROLLER_CMD, c.ip().toString(), c.port())));
HelloONOS4baf78a2019-02-14 18:47:19 +090099 if (controllers.size() > MAX_CONTROLLERS) {
sdn9952dab2018-06-12 14:52:51 +0900100 log.warn(" {} Arista Switch maximun 8 controllers, not adding {} excessive ones",
HelloONOS4baf78a2019-02-14 18:47:19 +0900101 handler().data().deviceId(), controllers.size() - MAX_CONTROLLERS);
sdn9952dab2018-06-12 14:52:51 +0900102 }
103 cmds.add(NO_SHUTDOWN_CMD);
104 cmds.add(COPY_RUNNING_CONFIG);
105
106 AristaUtils.retrieveCommandResult(handler(), cmds);
Palash Kalac99b15a2017-06-14 09:36:56 +0900107 }
108
sdn9952dab2018-06-12 14:52:51 +0900109
Palash Kalac99b15a2017-06-14 09:36:56 +0900110 @Override
111 public void removeControllers(List<ControllerInfo> controllers) {
sdn9952dab2018-06-12 14:52:51 +0900112 log.debug("Arista remove Controllers");
Palash Kalac99b15a2017-06-14 09:36:56 +0900113
sdn9952dab2018-06-12 14:52:51 +0900114 List<String> cmds = Lists.newArrayList();
Palash Kalac99b15a2017-06-14 09:36:56 +0900115 cmds.add(CONFIGURE_TERMINAL);
116 cmds.add(OPENFLOW_CMD);
117 controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds
118 .add(String.format(REMOVE_CONTROLLER_CMD, c.ip().toString(), c.port())));
119
DongRyeol Cha06041fa2018-06-07 10:23:32 +0900120 AristaUtils.retrieveCommandResult(handler(), cmds);
Palash Kalac99b15a2017-06-14 09:36:56 +0900121 }
122}