blob: 643d87e63d5279dc6dc1de040ac39c4c3ba2b81f [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";
48 private static final String CONTROLLER_ADDR = "controllerAddr";
49 private static final String CONTROLLER_IP = "ip";
50 private static final String CONTROLLER_PORT = "port";
51 private static final String PROTOCOL_TCP = "tcp";
52
53
Palash Kalac99b15a2017-06-14 09:36:56 +090054 private static final int MAX_CONTROLLERS = 8;
Palash Kalac99b15a2017-06-14 09:36:56 +090055
56 private final Logger log = getLogger(getClass());
57
58 @Override
59 public List<ControllerInfo> getControllers() {
sdn9952dab2018-06-12 14:52:51 +090060 log.debug("Arista get Controllers");
61
62 List<ControllerInfo> controllers = new ArrayList<>();
63 Optional<JsonNode> res = AristaUtils.retrieveCommandResult(handler(), SHOW_CONTROLLER_CMD);
64 if (res == null) {
65 return controllers;
66 }
67
68 JsonNode controllerInfo = res.get().findValue("controllersInfo");
69 Iterator<JsonNode> controlleriter = controllerInfo.iterator();
70 while (controlleriter.hasNext()) {
71 JsonNode temp1 = controlleriter.next();
72 if (temp1.has(CONTROLLER_ADDR)) {
73 JsonNode controllerAddr = temp1.get(CONTROLLER_ADDR);
74 if (controllerAddr.has(CONTROLLER_IP) && controllerAddr.has(CONTROLLER_PORT)) {
75 String ip = controllerAddr.get(CONTROLLER_IP).asText();
76 int port = controllerAddr.get(CONTROLLER_PORT).asInt();
77 ControllerInfo info = new ControllerInfo(IpAddress.valueOf(ip), port, PROTOCOL_TCP);
78 controllers.add(info);
79 log.debug("Controller Information {}", info.target());
80 }
81 }
82 }
83
84 return ImmutableList.copyOf(controllers);
Palash Kalac99b15a2017-06-14 09:36:56 +090085 }
86
87 @Override
88 public void setControllers(List<ControllerInfo> controllers) {
sdn9952dab2018-06-12 14:52:51 +090089 log.debug("Arista set Controllers");
90
91 List<String> cmds = new ArrayList<>();
92 cmds.add(CONFIGURE_TERMINAL);
93 cmds.add(OPENFLOW_CMD);
94 //The Arista switch supports up to 8 multi-controllers.
95 controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds
96 .add(String.format(SET_CONTROLLER_CMD, c.ip().toString(), c.port())));
97 if (controllers.size() > 8) {
98 log.warn(" {} Arista Switch maximun 8 controllers, not adding {} excessive ones",
99 handler().data().deviceId(), controllers.size() - 8);
100 }
101 cmds.add(NO_SHUTDOWN_CMD);
102 cmds.add(COPY_RUNNING_CONFIG);
103
104 AristaUtils.retrieveCommandResult(handler(), cmds);
Palash Kalac99b15a2017-06-14 09:36:56 +0900105 }
106
sdn9952dab2018-06-12 14:52:51 +0900107
Palash Kalac99b15a2017-06-14 09:36:56 +0900108 @Override
109 public void removeControllers(List<ControllerInfo> controllers) {
sdn9952dab2018-06-12 14:52:51 +0900110 log.debug("Arista remove Controllers");
Palash Kalac99b15a2017-06-14 09:36:56 +0900111
sdn9952dab2018-06-12 14:52:51 +0900112 List<String> cmds = Lists.newArrayList();
Palash Kalac99b15a2017-06-14 09:36:56 +0900113 cmds.add(CONFIGURE_TERMINAL);
114 cmds.add(OPENFLOW_CMD);
115 controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds
116 .add(String.format(REMOVE_CONTROLLER_CMD, c.ip().toString(), c.port())));
117
DongRyeol Cha06041fa2018-06-07 10:23:32 +0900118 AristaUtils.retrieveCommandResult(handler(), cmds);
Palash Kalac99b15a2017-06-14 09:36:56 +0900119 }
120}