Open Kilda Java Documentation
SwitchesUtils.java
Go to the documentation of this file.
1 package org.openkilda;
2 
3 import static java.lang.String.format;
4 import static java.util.Base64.getEncoder;
10 
22 
23 import com.fasterxml.jackson.core.type.TypeReference;
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import org.glassfish.jersey.client.ClientConfig;
26 
27 import java.io.IOException;
28 import java.util.List;
29 import javax.ws.rs.client.Client;
30 import javax.ws.rs.client.ClientBuilder;
31 import javax.ws.rs.client.Entity;
32 import javax.ws.rs.client.WebTarget;
33 import javax.ws.rs.core.GenericType;
34 import javax.ws.rs.core.HttpHeaders;
35 import javax.ws.rs.core.MediaType;
36 import javax.ws.rs.core.Response;
37 
38 public final class SwitchesUtils {
39 
40  private static final String auth = topologyUsername + ":" + topologyPassword;
41  private static final String authHeaderValue = "Basic " + getEncoder().encodeToString(auth.getBytes());
42 
43  private SwitchesUtils() {
44  }
45 
52  public static boolean knockoutSwitch(String switchName) {
53  System.out.println("\n==> Knockout switch");
54 
55  Client client = ClientBuilder.newClient(new ClientConfig());
56  Response result = client
57  .target(trafficEndpoint)
58  .path("/knockoutswitch")
59  .queryParam("switch", switchName)
60  .request()
61  .post(Entity.json(""));
62 
63  System.out.println(format("===> Response = %s", result.toString()));
64  return result.getStatus() == 200;
65  }
66 
73  public static boolean reviveSwitch(String switchName) {
74  System.out.println("\n==> Revive switch");
75 
76  Client client = ClientBuilder.newClient(new ClientConfig());
77  Response result = client
78  .target(trafficEndpoint)
79  .path("/reviveswitch")
80  .queryParam("switch", switchName)
81  .queryParam("controller", "tcp:kilda:6653")
82  .request()
83  .post(Entity.json(""));
84 
85  System.out.println(format("===> Response = %s", result.toString()));
86  return result.getStatus() == 200;
87  }
88 
89 
95  public static List<SwitchDto> dumpSwitches() {
96  System.out.println("\n==> Topology-Engine Dump Switches");
97 
98  Client client = ClientBuilder.newClient(new ClientConfig());
99 
100  Response response = client
101  .target(northboundEndpoint)
102  .path("/api/v1/switches")
103  .request(MediaType.APPLICATION_JSON)
104  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
105  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
106  .get();
107 
108  System.out.println(format("===> Response = %s", response.toString()));
109 
110  try {
111  List<SwitchDto> switches = new ObjectMapper().readValue(
112  response.readEntity(String.class), new TypeReference<List<SwitchDto>>() {
113  });
114  //System.out.println(String.format("====> Data = %s", switches));
115 
116  return switches;
117 
118  } catch (IOException ex) {
119  throw new TopologyProcessingException(
120  format("Unable to parse the switches '%s'.", response.toString()), ex);
121  }
122  }
123 
131  public static boolean addSwitch(String switchName, String dpid) {
132  System.out.println("\n==> Adding link");
133 
134  Client client = ClientBuilder.newClient(new ClientConfig());
135  Response result = client
136  .target(mininetEndpoint)
137  .path("/switch")
138  .request(MediaType.APPLICATION_JSON)
139  .post(Entity.json(
140  format("{\"switches\":[{\"name\": \"%s\", \"dpid\": \"%s\"}]}",
141  switchName, dpid)));
142 
143  return result.getStatus() == 200;
144  }
145 
146  public static List<Long> deleteSwitchRules(String switchId, DeleteRulesAction deleteAction) {
147  return deleteSwitchRules(switchId, deleteAction, null, null, null);
148  }
149 
150  public static List<Long> deleteSwitchRules(String switchId, Integer inPort, Integer inVlan) {
151  return deleteSwitchRules(switchId, null, inPort, inVlan, null);
152  }
153 
154  public static List<Long> deleteSwitchRules(String switchId, Integer outPort) {
155  return deleteSwitchRules(switchId, null, null, null, outPort);
156  }
157 
161  public static List<Long> deleteSwitchRules(String switchId, DeleteRulesAction deleteAction,
162  Integer inPort, Integer inVlan, Integer outPort) {
163  System.out.println("\n==> Northbound Delete Switch Rules");
164 
165  Client client = ClientBuilder.newClient(new ClientConfig());
166 
167  WebTarget requestBuilder = client
168  .target(northboundEndpoint)
169  .path("/api/v1/switches/")
170  .path("{switch-id}")
171  .path("rules")
172  .resolveTemplate("switch-id", switchId);
173 
174  if (deleteAction != null) {
175  requestBuilder = requestBuilder.queryParam("delete-action", deleteAction);
176  }
177  if (inPort != null) {
178  requestBuilder = requestBuilder.queryParam("in-port", inPort);
179  }
180  if (inVlan != null) {
181  requestBuilder = requestBuilder.queryParam("in-vlan", inVlan);
182  }
183  if (outPort != null) {
184  requestBuilder = requestBuilder.queryParam("out-port", outPort);
185  }
186 
187  Response response = requestBuilder
188  .request(MediaType.APPLICATION_JSON)
189  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
190  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
191  .header(Utils.EXTRA_AUTH, String.valueOf(System.currentTimeMillis()))
192  .delete();
193 
194  System.out.println(format("===> Response = %s", response.toString()));
195 
196  int responseCode = response.getStatus();
197  if (responseCode == 200) {
198  List<Long> cookies = response.readEntity(new GenericType<List<Long>>() {
199  });
200  System.out.println(format("====> Northbound Delete Switch Rules = %d", cookies.size()));
201  return cookies;
202  } else {
203  System.out.println(format("====> Error: Northbound Delete Switch Rules = %s",
204  response.readEntity(MessageError.class)));
205  return null;
206  }
207  }
208 
212  public static List<FlowEntry> dumpSwitchRules(String switchId) {
213  System.out.println("\n==> Northbound Dump Switch Rules");
214 
215  Client client = ClientBuilder.newClient(new ClientConfig());
216 
217  Response response = client
218  .target(northboundEndpoint)
219  .path("/api/v1/switches/{switch-id}/rules")
220  .resolveTemplate("switch-id", switchId)
221 
222  .request(MediaType.APPLICATION_JSON)
223  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
224  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
225  .get();
226 
227  System.out.println(format("===> Response = %s", response.toString()));
228 
229  int responseCode = response.getStatus();
230  if (responseCode == 200) {
231  SwitchFlowEntries rules = response.readEntity(SwitchFlowEntries.class);
232  System.out.println(format("====> Northbound Dump Switch Rules = %s", rules.getFlowEntries()));
233  return rules.getFlowEntries();
234  } else {
235  System.out.println(format("====> Error: Northbound Dump Switch Rules = %s",
236  response.readEntity(MessageError.class)));
237  return null;
238  }
239  }
240 
244  public static RulesValidationResult validateSwitchRules(String switchId) {
245  System.out.println("\n==> Northbound Validate Switch Rules");
246 
247  Client client = ClientBuilder.newClient(new ClientConfig());
248 
249  Response response = client
250  .target(northboundEndpoint)
251  .path("/api/v1/switches/{switch-id}/rules/validate")
252  .resolveTemplate("switch-id", switchId)
253 
254  .request(MediaType.APPLICATION_JSON)
255  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
256  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
257  .get();
258 
259  System.out.println(format("===> Response = %s", response.toString()));
260 
261  int responseCode = response.getStatus();
262  if (responseCode == 200) {
263  RulesValidationResult rules = response.readEntity(RulesValidationResult.class);
264  System.out.println(format("====> Northbound Validate Switch Rules = %s", rules));
265  return rules;
266  } else {
267  System.out.println(format("====> Error: Northbound Validate Switch Rules = %s",
268  response.readEntity(MessageError.class)));
269  return null;
270  }
271  }
272 
276  public static RulesSyncResult synchronizeSwitchRules(String switchId) {
277  System.out.println("\n==> Northbound Synchronize Switch Rules");
278 
279  Client client = ClientBuilder.newClient(new ClientConfig());
280 
281  Response response = client
282  .target(northboundEndpoint)
283  .path("/api/v1/switches/{switch-id}/rules/synchronize")
284  .resolveTemplate("switch-id", switchId)
285 
286  .request(MediaType.APPLICATION_JSON)
287  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
288  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
289  .get();
290 
291  System.out.println(format("===> Response = %s", response.toString()));
292 
293  int responseCode = response.getStatus();
294  if (responseCode == 200) {
295  RulesSyncResult rules = response.readEntity(RulesSyncResult.class);
296  System.out.println(format("====> Northbound Synchronize Switch Rules = %s", rules));
297  return rules;
298  } else {
299  System.out.println(format("====> Error: Northbound Synchronize Switch Rules = %s",
300  response.readEntity(MessageError.class)));
301  return null;
302  }
303  }
304 
308  public static PortDto changeSwitchPortStatus(String switchName, int port, PortStatus status) {
309  System.out.println("\n==> Change port state");
310 
311  Client client = ClientBuilder.newClient(new ClientConfig());
312  Response result = client.target(northboundEndpoint)
313  .path("/api/v1/switches/{switch-id}/port/{port-no}/config")
314  .resolveTemplate("switch-id", switchName)
315  .resolveTemplate("port-no", port)
316  .request(MediaType.APPLICATION_JSON)
317  .header(HttpHeaders.AUTHORIZATION, authHeaderValue)
318  .header(Utils.CORRELATION_ID, String.valueOf(System.currentTimeMillis()))
319  .put(Entity.json(format("{\"status\": \"%s\"}", status)));
320 
321  System.out.println(format("===> Response = %s", result.toString()));
322 
323  int responseCode = result.getStatus();
324  if (responseCode == 200) {
325  PortDto portDto = result.readEntity(PortDto.class);
326  System.out.println(format("====> Success" + " = %s", portDto));
327  return portDto;
328  } else {
329  System.out.println(format("====> Error = %s", result.readEntity(MessageError.class)));
330  return null;
331  }
332  }
333 }
static List< SwitchDto > dumpSwitches()
static List< Long > deleteSwitchRules(String switchId, Integer inPort, Integer inVlan)
Definition: FlowEntry.java:29
static boolean reviveSwitch(String switchName)
static List< FlowEntry > dumpSwitchRules(String switchId)
def status()
Definition: rest.py:593
static List< Long > deleteSwitchRules(String switchId, DeleteRulesAction deleteAction)
list result
Definition: plan-d.py:72
static final String CORRELATION_ID
Definition: Utils.java:43
static PortDto changeSwitchPortStatus(String switchName, int port, PortStatus status)
static boolean addSwitch(String switchName, String dpid)
static List< Long > deleteSwitchRules(String switchId, Integer outPort)
static final String EXTRA_AUTH
Definition: Utils.java:47
static RulesSyncResult synchronizeSwitchRules(String switchId)
static List< Long > deleteSwitchRules(String switchId, DeleteRulesAction deleteAction, Integer inPort, Integer inVlan, Integer outPort)
static boolean knockoutSwitch(String switchName)
static final String northboundEndpoint
static RulesValidationResult validateSwitchRules(String switchId)