blob: 43dbe094a6c98fc89182c685f284dfd206ef38bc [file] [log] [blame]
sdnb0302912018-06-07 15:44:10 +09001/*
2 * Copyright 2018-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.cisco.rest;
18
19import static org.slf4j.LoggerFactory.getLogger;
20
Ray Milkey61b4c342018-06-08 09:36:57 -070021import java.io.IOException;
sdnb0302912018-06-07 15:44:10 +090022import java.util.ArrayList;
23import java.util.List;
24import java.util.Objects;
sdn4eae2982018-06-10 17:39:11 +090025import java.util.regex.Matcher;
26import java.util.regex.Pattern;
sdnb0302912018-06-07 15:44:10 +090027
sdn4eae2982018-06-10 17:39:11 +090028import org.onlab.packet.IpAddress;
sdnb0302912018-06-07 15:44:10 +090029import org.onosproject.drivers.cisco.rest.NxApiRequest.CommandType;
30import org.onosproject.net.DeviceId;
31import org.onosproject.net.behaviour.ControllerConfig;
32import org.onosproject.net.behaviour.ControllerInfo;
33import org.onosproject.net.driver.AbstractHandlerBehaviour;
34import org.onosproject.net.driver.DriverHandler;
35import org.slf4j.Logger;
36
37import com.fasterxml.jackson.databind.JsonNode;
38import com.fasterxml.jackson.databind.ObjectMapper;
39
40/**
41 * Gets and Sets the openflow controller.
42 */
43public class ControllerConfigCiscoImpl extends AbstractHandlerBehaviour implements ControllerConfig {
44 private final Logger log = getLogger(getClass());
45
46 private static final String SHOW_OF_CONTROLLER_CMD = "show openflow switch 1 controllers";
47 private static final String OPENFLOW_CMD = "openflow";
48 private static final String SW1_CMD = "switch 1";
49 private static final String DELETE_OF_CONFIG = "no switch 1";
50 private static final String PROTO_VER_CMD = "protocol-version 1.3";
51 private static final String PIPELINE_CMD = "pipeline 201";
52 private static final String OF_CONTROLLER_CONF_CMD = "controller ipv4 %s port %d vrf %s security none";
53 private static final String NO_SHUTDOWN_CMD = "no shutdown";
54 private static final String COPY_RUNNING_CONFIG = "copy running-config startup-config";
55
56 @Override
57 public List<ControllerInfo> getControllers() {
58 List<ControllerInfo> controllers = new ArrayList<ControllerInfo>();
59 DeviceId deviceId = handler().data().deviceId();
60
61 String response;
62
63 // "show openflow switch 1 controller" command only shows outputs with cli_ascii command type
64 response = NxApiRequest.post(handler(), SHOW_OF_CONTROLLER_CMD, CommandType.CLI_ASCII);
65
66 if (response == null) {
67 log.error("Failed to perform {} command on the device {} Response has Error/null",
68 SHOW_OF_CONTROLLER_CMD, deviceId);
69 return controllers;
70 }
71
72 try {
73 ObjectMapper om = new ObjectMapper();
74 JsonNode json = om.readTree(response);
75 if (json.has("result")) {
76 JsonNode res = json.get("result");
77 String msg = res.findValue("msg").asText();
sdn4eae2982018-06-10 17:39:11 +090078 controllers.addAll(parseControllerInfo(msg));
sdnb0302912018-06-07 15:44:10 +090079 } else if (json.has("error")) {
80 log.error("{} Response has IllegalStateException Error/null", deviceId);
81 return controllers;
82 }
83 } catch (IOException e) {
84 log.error("Exception thrown", e);
85 }
86
87 return controllers;
88 }
89
90 @Override
91 public void setControllers(List<ControllerInfo> controllers) {
92 DriverHandler handler = handler();
93 DeviceId deviceId = handler.data().deviceId();
94
95 List<String> cmds = new ArrayList<>();
96 cmds.add(OPENFLOW_CMD);
97 cmds.add(DELETE_OF_CONFIG);
98 cmds.add(SW1_CMD);
99 cmds.add(PROTO_VER_CMD);
100 cmds.add(PIPELINE_CMD);
101
102 // can configure up to eight controllers
103 controllers.stream().limit(8).forEach(c -> cmds
104 .add(String.format(OF_CONTROLLER_CONF_CMD, c.ip().toString(), c.port(), "management")));
105 cmds.add(NO_SHUTDOWN_CMD);
106 cmds.add(COPY_RUNNING_CONFIG);
107 String response = NxApiRequest.postClis(handler, cmds);
108 if (Objects.isNull(response)) {
109 throw new NullPointerException("Response is null");
110 }
111
Ray Milkey4dda8142018-06-08 08:55:37 -0700112 try {
113 ObjectMapper om = new ObjectMapper();
114 JsonNode json = om.readTree(response);
115 //TODO parse error messages.
116 if (json.has("error")) {
117 log.error("{} Response has IllegalStateException Error", deviceId);
118 return;
sdnb0302912018-06-07 15:44:10 +0900119 }
Ray Milkey4dda8142018-06-08 08:55:37 -0700120 } catch (IOException e) {
121 log.error("Exception thrown", e);
sdnb0302912018-06-07 15:44:10 +0900122 }
123 }
sdn4eae2982018-06-10 17:39:11 +0900124
125 @Override
126 public void removeControllers(List<ControllerInfo> controllers) {
127 DriverHandler handler = handler();
128 DeviceId deviceId = handler.data().deviceId();
129
130 List<String> cmds = new ArrayList<>();
131 cmds.add(OPENFLOW_CMD);
132 cmds.add(DELETE_OF_CONFIG);
133 cmds.add(COPY_RUNNING_CONFIG);
134
135 String response = NxApiRequest.postClis(handler, cmds);
136 if (Objects.isNull(response)) {
137 log.error(" Device {} Response is null", deviceId);
138 return;
139 }
140
141 try {
142 ObjectMapper om = new ObjectMapper();
143 JsonNode json = om.readTree(response);
144 if (json.has("errors")) {
145 log.error("{} Response has JSON Format Error {}", deviceId, json);
146 return;
147 }
148 //TODO parse error messages.
149 } catch (IOException e) {
150 log.error("Exception thrown", e);
151 }
152 }
153
154 private List<ControllerInfo> parseControllerInfo(String data) {
155 final String regex = "(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}):(\\d{1,5})";
156 Pattern pattern = Pattern.compile(regex);
157 Matcher match = pattern.matcher(data);
158 List<ControllerInfo> controllers = new ArrayList<ControllerInfo>();
159 while (match.find()) {
160 String str = match.group();
161 String[] ips = str.split(":");
162 ControllerInfo info = new ControllerInfo(IpAddress.valueOf(ips[0]),
163 Integer.parseInt(ips[1]), "tcp");
164 controllers.add(info);
165 }
166
167 return controllers;
168 }
169
170
sdnb0302912018-06-07 15:44:10 +0900171}