Converting builtin applications to be delivered in a self-contained manner via OAR files.
Change-Id: I5b7c6939aacc263248868fac2e0f69124c5f3609
diff --git a/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java b/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
index ee3c5e8..4dd767b 100644
--- a/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/AbstractShellCommand.java
@@ -18,17 +18,17 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.karaf.shell.commands.Option;
-import org.apache.karaf.shell.console.OsgiCommandSupport;
+import org.apache.karaf.shell.console.AbstractAction;
+import org.onlab.osgi.DefaultServiceDirectory;
+import org.onlab.osgi.ServiceNotFoundException;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.Annotations;
-import org.onlab.osgi.DefaultServiceDirectory;
-import org.onlab.osgi.ServiceNotFoundException;
/**
* Base abstraction of Karaf shell commands.
*/
-public abstract class AbstractShellCommand extends OsgiCommandSupport {
+public abstract class AbstractShellCommand extends AbstractAction {
@Option(name = "-j", aliases = "--json", description = "Output JSON",
required = false, multiValued = false)
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
index 68a1957..9d40c66 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationCommand.java
@@ -21,6 +21,9 @@
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.core.ApplicationId;
+import java.io.IOException;
+import java.net.URL;
+
/**
* Manages application inventory.
*/
@@ -34,11 +37,11 @@
static final String DEACTIVATE = "deactivate";
@Argument(index = 0, name = "command",
- description = "Command name (activate|deactivate|uninstall)",
+ description = "Command name (install|activate|deactivate|uninstall)",
required = true, multiValued = false)
String command = null;
- @Argument(index = 1, name = "names", description = "Application name(s)",
+ @Argument(index = 1, name = "names", description = "Application name(s) or URL(s)",
required = true, multiValued = true)
String[] names = null;
@@ -46,27 +49,55 @@
protected void execute() {
ApplicationAdminService service = get(ApplicationAdminService.class);
if (command.equals(INSTALL)) {
- print("Not supported via CLI yet.");
+ for (String name : names) {
+ if (!installApp(service, name)) {
+ return;
+ }
+ }
} else {
for (String name : names) {
- ApplicationId appId = service.getId(name);
- if (appId == null) {
- print("No such application: %s", name);
+ if (!manageApp(service, name)) {
return;
}
-
- if (command.equals(UNINSTALL)) {
- service.uninstall(appId);
- } else if (command.equals(ACTIVATE)) {
- service.activate(appId);
- } else if (command.equals(DEACTIVATE)) {
- service.deactivate(appId);
- } else {
- print("Unsupported command: %s", command);
- }
}
}
}
+ // Installs the application from input of the specified URL
+ private boolean installApp(ApplicationAdminService service, String url) {
+ try {
+ if (url.equals("-")) {
+ service.install(System.in);
+ } else {
+ service.install(new URL(url).openStream());
+ }
+ } catch (IOException e) {
+ error("Unable to get URL: %s", url);
+ return false;
+ }
+ return true;
+ }
+
+ // Manages the specified application.
+ private boolean manageApp(ApplicationAdminService service, String name) {
+ ApplicationId appId = service.getId(name);
+ if (appId == null) {
+ print("No such application: %s", name);
+ return false;
+ }
+
+ if (command.equals(UNINSTALL)) {
+ service.uninstall(appId);
+ } else if (command.equals(ACTIVATE)) {
+ service.activate(appId);
+ } else if (command.equals(DEACTIVATE)) {
+ service.deactivate(appId);
+ } else {
+ print("Unsupported command: %s", command);
+ return false;
+ }
+ return true;
+ }
+
}
diff --git a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
index 1479b9d..1746169 100644
--- a/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
+++ b/cli/src/main/java/org/onosproject/cli/app/ApplicationNameCompleter.java
@@ -15,7 +15,6 @@
*/
package org.onosproject.cli.app;
-import com.google.common.collect.Sets;
import org.apache.karaf.shell.console.completer.ArgumentCompleter;
import org.apache.karaf.shell.console.completer.StringsCompleter;
import org.onosproject.app.ApplicationService;
@@ -23,11 +22,8 @@
import org.onosproject.cli.AbstractCompleter;
import org.onosproject.core.Application;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import java.util.SortedSet;
import static org.onosproject.app.ApplicationState.ACTIVE;
@@ -48,13 +44,14 @@
String cmd = list.getArguments()[1];
// Grab apps already on the command (to prevent tab-completed duplicates)
- final Set previousApps;
- if (list.getArguments().length > 2) {
- previousApps = Sets.newHashSet(
- Arrays.copyOfRange(list.getArguments(), 2, list.getArguments().length));
- } else {
- previousApps = Collections.emptySet();
- }
+ // FIXME: This does not work.
+// final Set previousApps;
+// if (list.getArguments().length > 2) {
+// previousApps = Sets.newHashSet(
+// Arrays.copyOfRange(list.getArguments(), 2, list.getArguments().length));
+// } else {
+// previousApps = Collections.emptySet();
+// }
// Fetch our service and feed it's offerings to the string completer
ApplicationService service = get(ApplicationService.class);
@@ -63,9 +60,9 @@
while (it.hasNext()) {
Application app = it.next();
ApplicationState state = service.getState(app.id());
- if (previousApps.contains(app.id().name())) {
- continue;
- }
+// if (previousApps.contains(app.id().name())) {
+// continue;
+// }
if (cmd.equals("uninstall") ||
(cmd.equals("activate") && state == INSTALLED) ||
(cmd.equals("deactivate") && state == ACTIVE)) {