blob: 4b88ad35748c6a459dab31294c9784d931be413f [file] [log] [blame]
Thomas Vachuska5c2f8132015-04-08 23:09:08 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Thomas Vachuska5c2f8132015-04-08 23:09:08 -07003 *
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.cli.net;
17
Andrea Campanellae6e2b762017-02-22 21:55:53 +010018import com.fasterxml.jackson.databind.node.ArrayNode;
19import com.google.common.collect.ImmutableList;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070020import org.apache.karaf.shell.api.action.Argument;
21import org.apache.karaf.shell.api.action.Command;
Ray Milkey0068fd02018-10-11 15:45:39 -070022import org.apache.karaf.shell.api.action.Completion;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070023import org.apache.karaf.shell.api.action.lifecycle.Service;
24import org.apache.karaf.shell.api.action.Option;
Andrea Campanellae6e2b762017-02-22 21:55:53 +010025import org.onosproject.cli.AbstractShellCommand;
26import org.onosproject.net.driver.Behaviour;
27import org.onosproject.net.driver.Driver;
Thomas Vachuska11b99fc2017-04-27 12:51:04 -070028import org.onosproject.net.driver.DriverService;
Andrea Campanellae6e2b762017-02-22 21:55:53 +010029
Yuta HIGUCHI4a6852e2017-10-27 17:15:39 -070030import java.util.Comparator;
Yuta HIGUCHI0083a512017-02-21 12:14:38 -080031import java.util.List;
32import java.util.Optional;
Ray Milkey39616f32015-05-14 15:43:00 -070033import java.util.Set;
Yuta HIGUCHI0083a512017-02-21 12:14:38 -080034import java.util.stream.Collectors;
Ray Milkey39616f32015-05-14 15:43:00 -070035
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070036/**
37 * Lists device drivers.
38 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070039@Service
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070040@Command(scope = "onos", name = "drivers",
41 description = "Lists device drivers")
42public class DriversListCommand extends AbstractShellCommand {
43
Thomas Vachuska635c2d72015-05-08 14:32:13 -070044 private static final String FMT = "driver=%s, extends=%s, mfr=%s, hw=%s, sw=%s";
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070045 private static final String FMT_B = " %s via %s";
46 private static final String FMT_P = " %s=%s";
47
48 @Argument(index = 0, name = "driverName", description = "Driver name",
49 required = false, multiValued = false)
Ray Milkey0068fd02018-10-11 15:45:39 -070050 @Completion(DriverNameCompleter.class)
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070051 String driverName = null;
52
Yuta HIGUCHI4a6852e2017-10-27 17:15:39 -070053 @Option(name = "-s", aliases = "--sort", description = "Sort output by driver name",
54 required = false, multiValued = false)
55 private boolean sort = false;
56
57 @Option(name = "-n", aliases = "--name", description = "Show driver name only",
58 required = false, multiValued = false)
59 private boolean nameOnly = false;
60
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070061 @Override
Ray Milkeyd84f89b2018-08-17 14:54:17 -070062 protected void doExecute() {
Thomas Vachuska11b99fc2017-04-27 12:51:04 -070063 DriverService service = get(DriverService.class);
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070064
65 if (driverName != null) {
Andrea Campanella45f4d3d2017-02-23 14:45:21 +010066 printDriver(service.getDriver(driverName), true);
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070067 } else {
Ray Milkey39616f32015-05-14 15:43:00 -070068 if (outputJson()) {
69 json(service.getDrivers());
70 } else {
Yuta HIGUCHI4a6852e2017-10-27 17:15:39 -070071 service.getDrivers()
72 .stream()
73 .sorted(Comparator.comparing(Driver::name))
74 .forEach(d -> printDriver(d, true));
Ray Milkey39616f32015-05-14 15:43:00 -070075 }
Thomas Vachuska5c2f8132015-04-08 23:09:08 -070076 }
77 }
78
Ray Milkey39616f32015-05-14 15:43:00 -070079 private void json(Driver driver) {
80 print("%s", jsonForEntity(driver, Driver.class));
81 }
82
83 private void json(Set<Driver> drivers) {
84 ArrayNode result = mapper().createArrayNode();
85 drivers.forEach(driver -> result.add(jsonForEntity(driver, Driver.class)));
86 print("%s", result.toString());
87 }
88
Andrea Campanella45f4d3d2017-02-23 14:45:21 +010089 private void printDriver(Driver driver, boolean first) {
Ray Milkey39616f32015-05-14 15:43:00 -070090 if (outputJson()) {
91 json(driver);
Yuta HIGUCHI4a6852e2017-10-27 17:15:39 -070092 } else if (nameOnly) {
93 print("%s", driver.name());
Yuta HIGUCHI0083a512017-02-21 12:14:38 -080094 } else {
Andrea Campanellae6e2b762017-02-22 21:55:53 +010095 List<Driver> parents = Optional.ofNullable(driver.parents())
96 .orElse(ImmutableList.of());
Yuta HIGUCHI0083a512017-02-21 12:14:38 -080097
Andrea Campanellae6e2b762017-02-22 21:55:53 +010098 List<String> parentsNames = parents.stream()
99 .map(Driver::name).collect(Collectors.toList());
100
Andrea Campanella45f4d3d2017-02-23 14:45:21 +0100101 if (first) {
102 print(FMT, driver.name(), parentsNames,
103 driver.manufacturer(), driver.hwVersion(), driver.swVersion());
104 } else {
105 print(" Inherited from %s", driver.name());
106 }
107
Andrea Campanellae6e2b762017-02-22 21:55:53 +0100108 driver.behaviours().forEach(b -> printBehaviour(b, driver));
Charles Chana59f9b762017-07-30 18:09:44 -0700109 driver.properties().forEach((k, v) -> print(FMT_P, k, v));
110
Andrea Campanella45f4d3d2017-02-23 14:45:21 +0100111 //recursion call to print each parent
112 parents.stream().forEach(parent -> printDriver(parent, false));
Ray Milkey39616f32015-05-14 15:43:00 -0700113 }
Thomas Vachuska5c2f8132015-04-08 23:09:08 -0700114 }
115
Andrea Campanellae6e2b762017-02-22 21:55:53 +0100116 private void printBehaviour(Class<? extends Behaviour> behaviour, Driver driver) {
117 print(FMT_B, behaviour.getCanonicalName(),
118 driver.implementation(behaviour).getCanonicalName());
119 }
120
Thomas Vachuska5c2f8132015-04-08 23:09:08 -0700121}