blob: 4db129da3e9a598b1cae29f5198446ff68df22e8 [file] [log] [blame]
Thomas Vachuska1dcb0482015-02-18 18:21:28 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Thomas Vachuska1dcb0482015-02-18 18:21:28 -08003 *
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.app;
17
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070018import com.google.common.io.ByteStreams;
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080019import org.apache.karaf.shell.commands.Argument;
20import org.apache.karaf.shell.commands.Command;
21import org.onosproject.app.ApplicationAdminService;
22import org.onosproject.cli.AbstractShellCommand;
Yuta HIGUCHI315baad2017-01-31 15:14:30 -080023import org.onosproject.core.Application;
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080024import org.onosproject.core.ApplicationId;
25
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070026import java.io.IOException;
27import java.net.URL;
Yuta HIGUCHI315baad2017-01-31 15:14:30 -080028import java.util.List;
29import java.util.stream.Collectors;
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070030
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080031/**
32 * Manages application inventory.
33 */
34@Command(scope = "onos", name = "app",
35 description = "Manages application inventory")
36public class ApplicationCommand extends AbstractShellCommand {
37
38 static final String INSTALL = "install";
39 static final String UNINSTALL = "uninstall";
40 static final String ACTIVATE = "activate";
41 static final String DEACTIVATE = "deactivate";
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070042 static final String DOWNLOAD = "download";
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080043
44 @Argument(index = 0, name = "command",
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070045 description = "Command name (install|activate|deactivate|uninstall|download)",
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080046 required = true, multiValued = false)
47 String command = null;
48
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070049 @Argument(index = 1, name = "names", description = "Application name(s) or URL(s)",
Thomas Vachuskafba28572015-03-25 18:48:59 -070050 required = true, multiValued = true)
51 String[] names = null;
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080052
53 @Override
54 protected void execute() {
55 ApplicationAdminService service = get(ApplicationAdminService.class);
56 if (command.equals(INSTALL)) {
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070057 for (String name : names) {
58 if (!installApp(service, name)) {
59 return;
60 }
61 }
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080062
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070063 } else if (command.equals(DOWNLOAD)) {
Thomas Vachuskafba28572015-03-25 18:48:59 -070064 for (String name : names) {
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070065 if (!downloadApp(service, name)) {
Thomas Vachuskafba28572015-03-25 18:48:59 -070066 return;
67 }
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080068 }
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070069 } else {
70 for (String name : names) {
71 if (!manageApp(service, name)) {
72 return;
73 }
74 }
75 }
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080076 }
Thomas Vachuska1dcb0482015-02-18 18:21:28 -080077
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070078 // Installs the application from input of the specified URL
79 private boolean installApp(ApplicationAdminService service, String url) {
80 try {
Jon Halla3fcf672017-03-28 16:53:22 -070081 if ("-".equals(url)) {
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -070082 service.install(System.in);
83 } else {
84 service.install(new URL(url).openStream());
85 }
86 } catch (IOException e) {
87 error("Unable to get URL: %s", url);
88 return false;
89 }
90 return true;
91 }
92
Thomas Vachuska08b4dec2017-08-31 15:20:17 -070093 // Downloads the application bits to the standard output.
94 private boolean downloadApp(ApplicationAdminService service, String name) {
95 try {
96 ByteStreams.copy(service.getApplicationArchive(service.getId(name)),
97 System.out);
98 } catch (IOException e) {
99 error("Unable to download bits for application %s", name);
100 return false;
101 }
102 return true;
103 }
104
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700105 // Manages the specified application.
106 private boolean manageApp(ApplicationAdminService service, String name) {
107 ApplicationId appId = service.getId(name);
108 if (appId == null) {
Yuta HIGUCHI315baad2017-01-31 15:14:30 -0800109 List<Application> matches = service.getApplications().stream()
110 .filter(app -> app.id().name().matches(".*\\." + name + "$"))
111 .collect(Collectors.toList());
112
113 if (matches.size() == 1) {
114 // Found match
115 appId = matches.iterator().next().id();
116 } else if (!matches.isEmpty()) {
117 print("Did you mean one of: %s",
118 matches.stream()
119 .map(Application::id)
120 .map(ApplicationId::name)
121 .collect(Collectors.toList()));
122 return false;
123 }
124 }
125 if (appId == null) {
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700126 print("No such application: %s", name);
127 return false;
128 }
129
Jonathan Hartb5132fa2017-02-02 13:20:35 -0800130 String action;
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700131 if (command.equals(UNINSTALL)) {
132 service.uninstall(appId);
Jonathan Hartb5132fa2017-02-02 13:20:35 -0800133 action = "Uninstalled";
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700134 } else if (command.equals(ACTIVATE)) {
135 service.activate(appId);
Jonathan Hartb5132fa2017-02-02 13:20:35 -0800136 action = "Activated";
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700137 } else if (command.equals(DEACTIVATE)) {
138 service.deactivate(appId);
Jonathan Hartb5132fa2017-02-02 13:20:35 -0800139 action = "Deactivated";
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700140 } else {
141 print("Unsupported command: %s", command);
142 return false;
143 }
Jonathan Hartb5132fa2017-02-02 13:20:35 -0800144 print("%s %s", action, appId.name());
Thomas Vachuskaa7a0f562015-04-14 23:27:44 -0700145 return true;
146 }
147
Thomas Vachuska1dcb0482015-02-18 18:21:28 -0800148}