Arista Rest Driver Controller Config impl
Change-Id: Id0460a790248bba28f8ca3a1e181e2c295f2dea9
diff --git a/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaUtils.java b/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaUtils.java
index e569a27..2a7bef7 100644
--- a/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaUtils.java
+++ b/drivers/arista/src/main/java/org/onosproject/drivers/arista/AristaUtils.java
@@ -37,7 +37,7 @@
final class AristaUtils {
- private static final String API_ENDPOINT = "/command-api/";
+ private static final String API_ENDPOINT = "/command-api";
private static final String JSONRPC = "jsonrpc";
private static final String METHOD = "method";
private static final String RUN_CMDS = "runCmds";
@@ -128,4 +128,5 @@
return node.toString();
}
+
}
\ No newline at end of file
diff --git a/drivers/arista/src/main/java/org/onosproject/drivers/arista/ControllerConfigAristaImpl.java b/drivers/arista/src/main/java/org/onosproject/drivers/arista/ControllerConfigAristaImpl.java
index c206696..643d87e 100644
--- a/drivers/arista/src/main/java/org/onosproject/drivers/arista/ControllerConfigAristaImpl.java
+++ b/drivers/arista/src/main/java/org/onosproject/drivers/arista/ControllerConfigAristaImpl.java
@@ -16,13 +16,19 @@
package org.onosproject.drivers.arista;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+
import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableList;
+import org.onlab.packet.IpAddress;
import org.onosproject.net.behaviour.ControllerConfig;
import org.onosproject.net.behaviour.ControllerInfo;
import org.onosproject.net.driver.AbstractHandlerBehaviour;
import org.slf4j.Logger;
-
-import java.util.List;
+import com.fasterxml.jackson.databind.JsonNode;
import static org.slf4j.LoggerFactory.getLogger;
@@ -31,27 +37,79 @@
*/
public class ControllerConfigAristaImpl extends AbstractHandlerBehaviour implements ControllerConfig {
+ private static final String SHOW_CONTROLLER_CMD = "show openflow";
private static final String CONFIGURE_TERMINAL = "configure";
private static final String OPENFLOW_CMD = "openflow";
+ private static final String SET_CONTROLLER_CMD = "controller tcp:%s:%d";
+ private static final String NO_SHUTDOWN_CMD = "no shutdown";
+ private static final String SHUTDOWN_CMD = "shutdown";
private static final String REMOVE_CONTROLLER_CMD = "no controller tcp:%s:%d";
+ private static final String COPY_RUNNING_CONFIG = "copy running-config startup-config";
+ private static final String CONTROLLER_ADDR = "controllerAddr";
+ private static final String CONTROLLER_IP = "ip";
+ private static final String CONTROLLER_PORT = "port";
+ private static final String PROTOCOL_TCP = "tcp";
+
+
private static final int MAX_CONTROLLERS = 8;
private final Logger log = getLogger(getClass());
@Override
public List<ControllerInfo> getControllers() {
- throw new UnsupportedOperationException("get controllers configuration is not supported");
+ log.debug("Arista get Controllers");
+
+ List<ControllerInfo> controllers = new ArrayList<>();
+ Optional<JsonNode> res = AristaUtils.retrieveCommandResult(handler(), SHOW_CONTROLLER_CMD);
+ if (res == null) {
+ return controllers;
+ }
+
+ JsonNode controllerInfo = res.get().findValue("controllersInfo");
+ Iterator<JsonNode> controlleriter = controllerInfo.iterator();
+ while (controlleriter.hasNext()) {
+ JsonNode temp1 = controlleriter.next();
+ if (temp1.has(CONTROLLER_ADDR)) {
+ JsonNode controllerAddr = temp1.get(CONTROLLER_ADDR);
+ if (controllerAddr.has(CONTROLLER_IP) && controllerAddr.has(CONTROLLER_PORT)) {
+ String ip = controllerAddr.get(CONTROLLER_IP).asText();
+ int port = controllerAddr.get(CONTROLLER_PORT).asInt();
+ ControllerInfo info = new ControllerInfo(IpAddress.valueOf(ip), port, PROTOCOL_TCP);
+ controllers.add(info);
+ log.debug("Controller Information {}", info.target());
+ }
+ }
+ }
+
+ return ImmutableList.copyOf(controllers);
}
@Override
public void setControllers(List<ControllerInfo> controllers) {
- throw new UnsupportedOperationException("set controllers configuration is not supported");
+ log.debug("Arista set Controllers");
+
+ List<String> cmds = new ArrayList<>();
+ cmds.add(CONFIGURE_TERMINAL);
+ cmds.add(OPENFLOW_CMD);
+ //The Arista switch supports up to 8 multi-controllers.
+ controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds
+ .add(String.format(SET_CONTROLLER_CMD, c.ip().toString(), c.port())));
+ if (controllers.size() > 8) {
+ log.warn(" {} Arista Switch maximun 8 controllers, not adding {} excessive ones",
+ handler().data().deviceId(), controllers.size() - 8);
+ }
+ cmds.add(NO_SHUTDOWN_CMD);
+ cmds.add(COPY_RUNNING_CONFIG);
+
+ AristaUtils.retrieveCommandResult(handler(), cmds);
}
+
@Override
public void removeControllers(List<ControllerInfo> controllers) {
- List<String> cmds = Lists.newArrayList();
+ log.debug("Arista remove Controllers");
+ List<String> cmds = Lists.newArrayList();
cmds.add(CONFIGURE_TERMINAL);
cmds.add(OPENFLOW_CMD);
controllers.stream().limit(MAX_CONTROLLERS).forEach(c -> cmds