blob: 49483f1c69a1507c2a1c2f990fcb5fc2f7716ee2 [file] [log] [blame]
Hyunsun Moon44aac662017-02-18 02:07:01 +09001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Hyunsun Moon44aac662017-02-18 02:07:01 +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 */
16package org.onosproject.openstacknetworking.cli;
17
18import com.fasterxml.jackson.core.JsonProcessingException;
19import com.fasterxml.jackson.databind.JsonNode;
20import com.fasterxml.jackson.databind.node.ArrayNode;
21import com.fasterxml.jackson.databind.node.ObjectNode;
22import com.google.common.collect.Lists;
23import org.apache.karaf.shell.commands.Command;
24import org.onosproject.cli.AbstractShellCommand;
25import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
26import org.openstack4j.core.transport.ObjectMapperSingleton;
27import org.openstack4j.model.network.Network;
28import org.openstack4j.model.network.Subnet;
29import org.openstack4j.openstack.networking.domain.NeutronNetwork;
30
31import java.util.Comparator;
32import java.util.List;
33import java.util.stream.Collectors;
34
35import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
36
37/**
38 * Lists OpenStack networks.
39 */
40@Command(scope = "onos", name = "openstack-networks",
41 description = "Lists all OpenStack networks")
42public class OpenstackNetworkListCommand extends AbstractShellCommand {
43
daniel parka792cf72017-04-14 16:25:35 +090044 private static final String FORMAT = "%-40s%-20s%-20s%-20s%-8s";
Hyunsun Moon44aac662017-02-18 02:07:01 +090045
46 @Override
47 protected void execute() {
48 OpenstackNetworkService service = AbstractShellCommand.get(OpenstackNetworkService.class);
49 List<Network> networks = Lists.newArrayList(service.networks());
50 networks.sort(Comparator.comparing(Network::getName));
51
52 if (outputJson()) {
53 try {
54 print("%s", mapper().writeValueAsString(json(networks)));
55 } catch (JsonProcessingException e) {
56 print("Failed to list networks in JSON format");
57 }
58 return;
59 }
60
daniel parka792cf72017-04-14 16:25:35 +090061 print(FORMAT, "ID", "Name", "Network Mode", "VNI", "Subnets");
Hyunsun Moon44aac662017-02-18 02:07:01 +090062 for (Network net: networks) {
63 List<String> subnets = service.subnets().stream()
64 .filter(subnet -> subnet.getNetworkId().equals(net.getId()))
65 .map(Subnet::getCidr)
66 .collect(Collectors.toList());
67 print(FORMAT, net.getId(),
68 net.getName(),
daniel parka792cf72017-04-14 16:25:35 +090069 net.getNetworkType().toString(),
Hyunsun Moon44aac662017-02-18 02:07:01 +090070 net.getProviderSegID(),
71 subnets.isEmpty() ? "" : subnets);
72 }
73 }
74
75 private JsonNode json(List<Network> networks) {
76 ArrayNode result = mapper().enable(INDENT_OUTPUT).createArrayNode();
77 for (Network net: networks) {
78 result.add(writeNetwork(net));
79 }
80 return result;
81 }
82
83 private ObjectNode writeNetwork(Network net) {
84 try {
85 String strNet = ObjectMapperSingleton.getContext(NeutronNetwork.class)
86 .writerFor(NeutronNetwork.class)
87 .writeValueAsString(net);
88 return (ObjectNode) mapper().readTree(strNet.getBytes());
89 } catch (Exception e) {
90 throw new IllegalStateException();
91 }
92 }
93}