blob: 82489f550f618f129c489f138c229ab8bf42382d [file] [log] [blame]
Thomas Vachuska02aeb032015-01-06 22:36:30 -08001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
Thomas Vachuska02aeb032015-01-06 22:36:30 -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 */
Jonathan Hart9bb32ab2015-05-05 18:17:31 -070016package org.onosproject.rest.resources;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080017
alshabib20a070b2016-06-03 14:44:05 -070018import com.fasterxml.jackson.databind.node.ObjectNode;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080019import org.onosproject.app.ApplicationAdminService;
Deepa Vaddireddyce8a6f72017-09-14 08:57:50 +000020import org.onosproject.app.ApplicationException;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080021import org.onosproject.core.Application;
22import org.onosproject.core.ApplicationId;
Jian Lie1c1c8d2016-05-09 16:24:40 -070023import org.onosproject.core.CoreService;
Jonathan Hart9bb32ab2015-05-05 18:17:31 -070024import org.onosproject.rest.AbstractWebResource;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080025
26import javax.ws.rs.Consumes;
27import javax.ws.rs.DELETE;
Thomas Vachuska62ad95f2015-02-18 12:11:36 -080028import javax.ws.rs.DefaultValue;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080029import javax.ws.rs.GET;
30import javax.ws.rs.POST;
31import javax.ws.rs.Path;
32import javax.ws.rs.PathParam;
33import javax.ws.rs.Produces;
Thomas Vachuska62ad95f2015-02-18 12:11:36 -080034import javax.ws.rs.QueryParam;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080035import javax.ws.rs.core.MediaType;
36import javax.ws.rs.core.Response;
alshabib20a070b2016-06-03 14:44:05 -070037import java.io.IOException;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080038import java.io.InputStream;
alshabib20a070b2016-06-03 14:44:05 -070039import java.net.URL;
Thomas Vachuska02aeb032015-01-06 22:36:30 -080040import java.util.Set;
41
Jian Licbf49892016-05-10 14:54:44 -070042import static org.onlab.util.Tools.nullIsNotFound;
Ray Milkeyb784adb2018-04-02 15:33:07 -070043import static org.onlab.util.Tools.readTreeFromStream;
Jian Licbf49892016-05-10 14:54:44 -070044
Thomas Vachuska02aeb032015-01-06 22:36:30 -080045/**
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070046 * Manage inventory of applications.
Thomas Vachuska02aeb032015-01-06 22:36:30 -080047 */
48@Path("applications")
49public class ApplicationsWebResource extends AbstractWebResource {
50
Jian Licbf49892016-05-10 14:54:44 -070051 private static final String APP_ID_NOT_FOUND = "Application ID is not found";
52 private static final String APP_NOT_FOUND = "Application is not found";
53
alshabib20a070b2016-06-03 14:44:05 -070054 private static final String URL = "url";
55 private static final String ACTIVATE = "activate";
56
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070057 /**
58 * Get all installed applications.
59 * Returns array of all installed applications.
60 *
61 * @return 200 OK
Jian Lie1c1c8d2016-05-09 16:24:40 -070062 * @onos.rsModel Applications
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070063 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -080064 @GET
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070065 public Response getApps() {
Thomas Vachuska02aeb032015-01-06 22:36:30 -080066 ApplicationAdminService service = get(ApplicationAdminService.class);
67 Set<Application> apps = service.getApplications();
68 return ok(encodeArray(Application.class, "applications", apps)).build();
69 }
70
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070071 /**
72 * Get application details.
73 * Returns details of the specified application.
Jian Lie1c1c8d2016-05-09 16:24:40 -070074 *
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070075 * @param name application name
76 * @return 200 OK; 404; 401
Jian Lie1c1c8d2016-05-09 16:24:40 -070077 * @onos.rsModel Application
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070078 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -080079 @GET
80 @Path("{name}")
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070081 public Response getApp(@PathParam("name") String name) {
Thomas Vachuska02aeb032015-01-06 22:36:30 -080082 ApplicationAdminService service = get(ApplicationAdminService.class);
Jayasree Ghoshe6213cf2016-09-28 07:55:55 +053083 ApplicationId appId = nullIsNotFound(service.getId(name), APP_NOT_FOUND);
Thomas Vachuska02aeb032015-01-06 22:36:30 -080084 return response(service, appId);
85 }
86
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -070087 /**
88 * Install a new application.
89 * Uploads application archive stream and optionally activates the
90 * application.
alshabib20a070b2016-06-03 14:44:05 -070091
92 * @param raw json object containing location (url) of application oar
93 * @return 200 OK; 404; 401
94 */
95 @POST
96 @Consumes(MediaType.APPLICATION_JSON)
97 @Produces(MediaType.APPLICATION_JSON)
98 public Response installApp(InputStream raw) {
99 Application app;
100 try {
Ray Milkeyb784adb2018-04-02 15:33:07 -0700101 ObjectNode jsonTree = readTreeFromStream(mapper(), raw);
alshabib20a070b2016-06-03 14:44:05 -0700102 URL url = new URL(jsonTree.get(URL).asText());
103 boolean activate = false;
104 if (jsonTree.has(ACTIVATE)) {
105 activate = jsonTree.get(ACTIVATE).asBoolean();
106 }
107
108 ApplicationAdminService service = get(ApplicationAdminService.class);
109 app = service.install(url.openStream());
110 if (activate) {
111 service.activate(app.id());
112 }
Deepa Vaddireddyce8a6f72017-09-14 08:57:50 +0000113 } catch (IOException | ApplicationException ex) {
alshabib20a070b2016-06-03 14:44:05 -0700114 throw new IllegalArgumentException(ex);
115 }
116 return ok(codec(Application.class).encode(app, this)).build();
117 }
118
119 /**
120 * Install a new application.
121 * Uploads application archive stream and optionally activates the
122 * application.
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700123 *
124 * @param activate true to activate app also
125 * @param stream application archive stream
126 * @return 200 OK; 404; 401
127 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800128 @POST
129 @Consumes(MediaType.APPLICATION_OCTET_STREAM)
130 @Produces(MediaType.APPLICATION_JSON)
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700131 public Response installApp(@QueryParam("activate")
132 @DefaultValue("false") boolean activate,
133 InputStream stream) {
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800134 ApplicationAdminService service = get(ApplicationAdminService.class);
Deepa Vaddireddyce8a6f72017-09-14 08:57:50 +0000135 Application app;
136 try {
137 app = service.install(stream);
138 if (activate) {
139 service.activate(app.id());
140 }
141 } catch (ApplicationException ex) {
142 throw new IllegalArgumentException(ex);
Thomas Vachuska62ad95f2015-02-18 12:11:36 -0800143 }
Deepa Vaddireddyce8a6f72017-09-14 08:57:50 +0000144
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800145 return ok(codec(Application.class).encode(app, this)).build();
146 }
147
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700148 /**
149 * Uninstall application.
150 * Uninstalls the specified application deactivating it first if necessary.
151 *
152 * @param name application name
Jian Lic2a542b2016-05-10 11:48:19 -0700153 * @return 204 NO CONTENT
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700154 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800155 @DELETE
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800156 @Path("{name}")
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700157 public Response uninstallApp(@PathParam("name") String name) {
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800158 ApplicationAdminService service = get(ApplicationAdminService.class);
159 ApplicationId appId = service.getId(name);
dvaddiree113b652017-08-04 14:58:06 +0530160 if (appId != null) {
161 service.uninstall(appId);
162 }
Jian Lic2a542b2016-05-10 11:48:19 -0700163 return Response.noContent().build();
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800164 }
165
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700166 /**
167 * Activate application.
168 * Activates the specified application.
169 *
170 * @param name application name
171 * @return 200 OK; 404; 401
172 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800173 @POST
174 @Produces(MediaType.APPLICATION_JSON)
175 @Path("{name}/active")
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700176 public Response activateApp(@PathParam("name") String name) {
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800177 ApplicationAdminService service = get(ApplicationAdminService.class);
Hyunsun Moon14998642016-06-10 12:54:26 -0700178 ApplicationId appId = nullIsNotFound(service.getId(name), APP_NOT_FOUND);
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800179 service.activate(appId);
180 return response(service, appId);
181 }
182
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700183 /**
184 * De-activate application.
185 * De-activates the specified application.
186 *
187 * @param name application name
dvaddiree113b652017-08-04 14:58:06 +0530188 * @return 204 NO CONTENT
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700189 */
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800190 @DELETE
191 @Produces(MediaType.APPLICATION_JSON)
192 @Path("{name}/active")
Thomas Vachuska0fa2aa12015-08-18 12:53:04 -0700193 public Response deactivateApp(@PathParam("name") String name) {
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800194 ApplicationAdminService service = get(ApplicationAdminService.class);
195 ApplicationId appId = service.getId(name);
dvaddiree113b652017-08-04 14:58:06 +0530196 if (appId != null) {
197 service.deactivate(appId);
198 }
199 return Response.noContent().build();
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800200 }
201
Jian Lie1c1c8d2016-05-09 16:24:40 -0700202 /**
203 * Registers an on or off platform application.
204 *
205 * @param name application name
206 * @return 200 OK; 404; 401
207 * @onos.rsModel ApplicationId
208 */
209 @POST
210 @Produces(MediaType.APPLICATION_JSON)
211 @Path("{name}/register")
212 public Response registerAppId(@PathParam("name") String name) {
213 CoreService service = get(CoreService.class);
214 ApplicationId appId = service.registerApplication(name);
215 return response(appId);
216 }
217
218 /**
Jian Li847242b2016-05-11 18:58:53 -0700219 * Gets applicationId entry by either id or name.
Jian Lie1c1c8d2016-05-09 16:24:40 -0700220 *
Jian Li847242b2016-05-11 18:58:53 -0700221 * @param id id of application
Jian Lie1c1c8d2016-05-09 16:24:40 -0700222 * @param name name of application
223 * @return 200 OK; 404; 401
224 * @onos.rsModel ApplicationId
225 */
226 @GET
227 @Produces(MediaType.APPLICATION_JSON)
Jian Li847242b2016-05-11 18:58:53 -0700228 @Path("ids/entry")
Jian Lia3e4c7a2016-05-12 13:15:40 -0700229 public Response getAppIdByName(@QueryParam("id") String id,
Jian Li847242b2016-05-11 18:58:53 -0700230 @QueryParam("name") String name) {
Jian Lie1c1c8d2016-05-09 16:24:40 -0700231 CoreService service = get(CoreService.class);
Jian Li847242b2016-05-11 18:58:53 -0700232 ApplicationId appId = null;
233 if (id != null) {
Jian Lia3e4c7a2016-05-12 13:15:40 -0700234 appId = service.getAppId(Short.valueOf(id));
Jian Li847242b2016-05-11 18:58:53 -0700235 } else if (name != null) {
236 appId = service.getAppId(name);
237 }
Jian Lie1c1c8d2016-05-09 16:24:40 -0700238 return response(appId);
239 }
240
241 /**
242 * Gets a collection of application ids.
243 * Returns array of all registered application ids.
244 *
245 * @return 200 OK; 404; 401
246 * @onos.rsModel ApplicationIds
247 */
248 @GET
249 @Produces(MediaType.APPLICATION_JSON)
250 @Path("ids")
251 public Response getAppIds() {
252 CoreService service = get(CoreService.class);
253 Set<ApplicationId> appIds = service.getAppIds();
254 return ok(encodeArray(ApplicationId.class, "applicationIds", appIds)).build();
255 }
256
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800257 private Response response(ApplicationAdminService service, ApplicationId appId) {
Jian Licbf49892016-05-10 14:54:44 -0700258 Application app = nullIsNotFound(service.getApplication(appId), APP_NOT_FOUND);
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800259 return ok(codec(Application.class).encode(app, this)).build();
260 }
261
Jian Lie1c1c8d2016-05-09 16:24:40 -0700262 private Response response(ApplicationId appId) {
Jian Licbf49892016-05-10 14:54:44 -0700263 ApplicationId checkedAppId = nullIsNotFound(appId, APP_ID_NOT_FOUND);
264 return ok(codec(ApplicationId.class).encode(checkedAppId, this)).build();
Jian Lie1c1c8d2016-05-09 16:24:40 -0700265 }
Thomas Vachuska02aeb032015-01-06 22:36:30 -0800266}