blob: 32eaa22d78ff0445c559faca60577745173ba5ec [file] [log] [blame]
Hyunsun Moon6066bd32016-10-24 15:35:34 -07001/*
2 * Copyright 2016-present Open Networking Laboratory
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 */
16package org.opencord.cordvtn.cli;
17
18import com.fasterxml.jackson.core.JsonProcessingException;
19import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.node.ArrayNode;
21import com.google.common.base.Strings;
22import com.google.common.collect.Lists;
23import org.apache.karaf.shell.commands.Argument;
24import org.apache.karaf.shell.commands.Command;
25import org.onosproject.cli.AbstractShellCommand;
26import org.opencord.cordvtn.api.core.CordVtnService;
Hyunsun Moon6066bd32016-10-24 15:35:34 -070027import org.opencord.cordvtn.api.net.VtnPort;
28
29import java.util.Collections;
30import java.util.List;
31import java.util.stream.Collectors;
32
33import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
34
35/**
36 * Lists VTN networks.
37 */
38@Command(scope = "onos", name = "cordvtn-ports",
39 description = "Lists all VTN ports")
40public class CordVtnPortListCommand extends AbstractShellCommand {
41
Hyunsun Moona0e8b662016-11-21 12:32:01 -080042 private static final String FORMAT = "%-40s%-20s%-18s%-8s%s";
Hyunsun Moon6066bd32016-10-24 15:35:34 -070043
44 @Argument(name = "networkId", description = "Network ID")
45 private String networkId = null;
46
47 @Override
48 protected void execute() {
49 CordVtnService service = AbstractShellCommand.get(CordVtnService.class);
50
Hyunsun Moona0e8b662016-11-21 12:32:01 -080051 List<VtnPort> ports = Lists.newArrayList(service.vtnPorts());
52 Collections.sort(ports, VtnPort.VTN_PORT_COMPARATOR);
53 if (!Strings.isNullOrEmpty(networkId)) {
54 ports.removeIf(port -> !port.netId().id().equals(networkId));
Hyunsun Moon6066bd32016-10-24 15:35:34 -070055 }
56
57 if (outputJson()) {
58 try {
59 print("%s", mapper().writeValueAsString(json(ports)));
60 } catch (JsonProcessingException e) {
61 print("Failed to list networks in JSON format");
62 }
63 } else {
Hyunsun Moona0e8b662016-11-21 12:32:01 -080064 print(FORMAT, "ID", "MAC", "IP", "VLAN", "WAN IPs");
Hyunsun Moon6066bd32016-10-24 15:35:34 -070065 for (VtnPort port: ports) {
66 List<String> floatingIps = port.addressPairs().stream()
67 .map(ip -> ip.ip().toString())
68 .collect(Collectors.toList());
69 print(FORMAT, port.id(),
70 port.mac(),
71 port.ip(),
72 port.vlanId().isPresent() ? port.vlanId().get() : "",
73 floatingIps.isEmpty() ? "" : floatingIps);
74 }
75 }
76 }
77
78 private JsonNode json(List<VtnPort> ports) {
79 ArrayNode result = mapper().enable(INDENT_OUTPUT).createArrayNode();
80 for (VtnPort port: ports) {
81 ArrayNode addrPairs = mapper().createArrayNode();
82 port.addressPairs().forEach(pair -> addrPairs.add(
83 mapper().createObjectNode()
84 .put("ip", pair.ip().toString())
85 .put("mac", pair.mac().toString())));
86
87 result.add(mapper().createObjectNode()
88 .put("id", port.id().id())
89 .put("networkId", port.netId().id())
90 .put("mac", port.mac().toString())
91 .put("ip", port.ip().toString())
92 .put("vlan", port.vlanId().isPresent() ?
93 port.vlanId().get().toString() : null)
94 .set("addressPairs", addrPairs));
95 }
96 return result;
97 }
98}