2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.so.adapters.tenant;
27 import javax.servlet.http.HttpServletResponse;
28 import javax.ws.rs.Consumes;
29 import javax.ws.rs.DELETE;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.POST;
32 import javax.ws.rs.Path;
33 import javax.ws.rs.PathParam;
34 import javax.ws.rs.Produces;
35 import javax.ws.rs.QueryParam;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.Response;
38 import javax.xml.ws.Holder;
40 import org.onap.so.adapters.tenant.exceptions.TenantAlreadyExists;
41 import org.onap.so.adapters.tenant.exceptions.TenantException;
42 import org.onap.so.adapters.tenantrest.CreateTenantError;
43 import org.onap.so.adapters.tenantrest.CreateTenantRequest;
44 import org.onap.so.adapters.tenantrest.CreateTenantResponse;
45 import org.onap.so.adapters.tenantrest.DeleteTenantError;
46 import org.onap.so.adapters.tenantrest.DeleteTenantRequest;
47 import org.onap.so.adapters.tenantrest.DeleteTenantResponse;
48 import org.onap.so.adapters.tenantrest.QueryTenantError;
49 import org.onap.so.adapters.tenantrest.QueryTenantResponse;
50 import org.onap.so.adapters.tenantrest.RollbackTenantError;
51 import org.onap.so.adapters.tenantrest.RollbackTenantRequest;
52 import org.onap.so.adapters.tenantrest.RollbackTenantResponse;
53 import org.onap.so.adapters.tenantrest.TenantRollback;
54 import org.onap.so.logger.MsoLogger;
55 import org.onap.so.openstack.beans.MsoTenant;
56 import org.onap.so.openstack.exceptions.MsoExceptionCategory;
57 import org.springframework.beans.factory.annotation.Autowired;
58 import org.springframework.stereotype.Component;
60 import io.swagger.annotations.Api;
61 import io.swagger.annotations.ApiOperation;
62 import io.swagger.annotations.ApiParam;
63 import io.swagger.annotations.ApiResponse;
64 import io.swagger.annotations.ApiResponses;
67 * This class services calls to the REST interface for Tenants (http://host:port/vnfs/rest/v1/tenants)
68 * Both XML and JSON can be produced/consumed. Set Accept: and Content-Type: headers appropriately. XML is the default.
71 @Api(value = "/v1/tenants", description = "root of tenant adapters restful web service")
73 public class TenantAdapterRest {
74 private static MsoLogger LOGGER = MsoLogger.getMsoLogger (MsoLogger.Catalog.RA, TenantAdapterRest.class);
76 //RAA? No logging in wrappers
78 private MsoTenantAdapterImpl tenantImpl;
84 EP: http://host:8080/tenants/rest
89 "tenantName": "RAA_1",
93 "serviceInstanceId": "sa1"
98 "tenantId": "128e10b9996d43a7874f19bbc4eb6749",
99 "tenantCreated": true,
101 "tenantId": "128e10b9996d43a7874f19bbc4eb6749",
102 "cloudId": "DAN", // RAA? cloudId instead of cloudSiteId
103 "tenantCreated": true,
106 "serviceInstanceId": "sa1"
112 @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
113 @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
114 @ApiOperation(value = "CreateTenant",
115 response = Response.class,
116 notes = "Creates a new tenant, CreateTenantRequest data is required")
118 @ApiResponse(code = 200, message = "tenant has been successfully created"),
119 @ApiResponse(code = 500, message = "create tenant failed") })
120 public Response createTenant(
121 @ApiParam(value = "details of tenant being created", required = true)
122 CreateTenantRequest req) {
123 LOGGER.debug("createTenant enter: " + req.toJsonString());
125 String newTenantId = null;
126 TenantRollback tenantRollback = new TenantRollback ();
129 Holder<String> htenant = new Holder<>();
130 Holder<TenantRollback> hrollback = new Holder<>();
131 MsoTenantAdapter impl = tenantImpl;
133 req.getCloudSiteId(),
136 req.getFailIfExists(),
141 newTenantId = htenant.value;
142 tenantRollback = hrollback.value;
143 // TenantAdapterCore TAImpl = new TenantAdapterCore();
144 // newTenantId = TAImpl.createTenant (req.getCloudSiteId(),
145 // req.getTenantName(),
146 // req.getFailIfExists(),
148 // req.getMetadata(),
149 // req.getMsoRequest(),
152 catch (TenantAlreadyExists tae) {
153 LOGGER.debug("Exception :",tae);
154 CreateTenantError exc = new CreateTenantError(tae.getMessage(), tae.getFaultInfo().getCategory(), Boolean.TRUE);
155 return Response.status(HttpServletResponse.SC_NOT_IMPLEMENTED).entity(exc).build();
157 catch (TenantException te) {
158 LOGGER.debug("Exception :",te);
159 CreateTenantError exc = new CreateTenantError(te.getFaultInfo().getMessage(), te.getFaultInfo().getCategory(), Boolean.TRUE);
160 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
162 catch (Exception e) {
163 LOGGER.debug("Exception :",e);
164 CreateTenantError exc = new CreateTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
165 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
168 CreateTenantResponse resp = new CreateTenantResponse (req.getCloudSiteId(), newTenantId, tenantRollback.getTenantCreated(), tenantRollback);
169 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
174 http://host:8080/tenants/rest
175 Resource: v1/tenant/tennatId
177 {"cloudSiteId": "DAN",
178 "tenantId": "ca84cd3d3df44272845da554656b3ace",
181 "serviceInstanceId": "sa1"
185 {"tenantDeleted": true}
189 @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
190 @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
191 @ApiOperation(value = "DeleteTenant",
192 response = Response.class,
193 notes = "Delete an existing tenant")
195 @ApiResponse(code = 200, message = "tenant has been successfully deleted"),
196 @ApiResponse(code = 500, message = "delete tenant failed") })
197 public Response deleteTenant(
198 @ApiParam(value = "tenantId of tenant being deleted", required = true)
199 @PathParam("tenantId") String tenantId,
200 @ApiParam(value = "DeleteTenantRequest object containing additional information of tenant being deleted", required = false)
201 DeleteTenantRequest req)
203 boolean tenantDeleted = false;
206 Holder<Boolean> deleted = new Holder<>();
207 MsoTenantAdapter impl = tenantImpl;
209 req.getCloudSiteId(),
213 tenantDeleted = deleted.value;
215 catch (TenantException te) {
216 LOGGER.debug("Exception :",te);
217 DeleteTenantError exc = new DeleteTenantError(te.getFaultInfo().getMessage(), te.getFaultInfo().getCategory(), Boolean.TRUE);
218 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
220 catch (Exception e) {
221 LOGGER.debug("Exception :",e);
222 DeleteTenantError exc = new DeleteTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
223 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
225 DeleteTenantResponse resp = new DeleteTenantResponse();
226 resp.setTenantDeleted(tenantDeleted);
227 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
232 EP://http://host:8080/tenants/rest
233 Resource: /v1/tenants
234 Params:?tenantNameOrId=RAA_1&cloudSiteId=DAN
237 "tenantId": "214b428a1f554c02935e66330f6a5409",
238 "tenantName": "RAA_1",
244 @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
245 @ApiOperation(value = "QueryTenant",
246 response = Response.class,
247 notes = "Query an existing tenant")
249 @ApiResponse(code = 200, message = "tenant has been successfully queried"),
250 @ApiResponse(code = 500, message = "query tenant failed") })
251 public Response queryTenant(
252 @ApiParam(value = "tenantId", required = true)
253 @PathParam("tenantId") String tenantId,
254 // @QueryParam("tenantNameOrId") String tenantNameOrId, //RAA? diff from doc
255 @ApiParam(value = "cloudSiteId", required = true)
256 @QueryParam("cloudSiteId") String cloudSiteId,
257 @ApiParam(value = "msoRequest.requestId", required = true)
258 @QueryParam("msoRequest.requestId") String requestId,
259 @ApiParam(value = "msoRequest.serviceInstanceId", required = true)
260 @QueryParam("msoRequest.serviceInstanceId") String serviceInstanceId)
262 MsoTenant tenant = null;
264 Holder<String> htenant = new Holder<>();
265 Holder<String> tenantName = new Holder<>();
266 Holder<Map<String,String>> metadata = new Holder<>();
267 MsoTenantAdapter impl = tenantImpl;
276 tenant = new MsoTenant(htenant.value, tenantName.value, metadata.value);
277 // TenantAdapterCore TAImpl = new TenantAdapterCore();
278 // MsoRequest msoReq = new MsoRequest();
279 // tenant = TAImpl.queryTenant (cloudSiteId, tenantId, msoReq);
281 catch (TenantException te) {
282 LOGGER.debug("Exception :",te);
283 QueryTenantError exc = new QueryTenantError(te.getFaultInfo().getMessage(), te.getFaultInfo().getCategory());
284 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
286 catch (Exception e) {
287 LOGGER.debug("Exception :",e);
288 QueryTenantError exc = new QueryTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL);
289 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
291 QueryTenantResponse resp = new QueryTenantResponse(tenant.getTenantId(), tenant.getTenantName(), tenant.getMetadata());
292 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
297 EP: //http://host:8080/tenants/rest
298 Resource: /v1/tenants/rollback
300 {"cloudSiteId": "DAN",
301 "tenantId": "f58abb05041d4ff384d4d22d1ccd2a6c",
304 "serviceInstanceId": "sa1"
308 {"tenantDeleted": true}
312 @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
313 @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
314 @ApiOperation(value = "RollbackTenant",
315 response = Response.class,
316 notes = "Rollback an existing tenant")
318 @ApiResponse(code = 200, message = "tenant has been successfully rolledback"),
319 @ApiResponse(code = 500, message = "rollback tenant failed") })
320 public Response rollbackTenant(
321 @ApiParam(value = "rollback, command action", required = true)
322 @QueryParam("rollback") String action, // WTF?
323 @ApiParam(value = "RollbackTenantRequest", required = true)
324 RollbackTenantRequest req)
327 MsoTenantAdapter impl = tenantImpl;
328 impl.rollbackTenant(req.getTenantRollback());
330 catch (TenantException te) {
331 LOGGER.debug("Exception :",te);
332 RollbackTenantError exc = new RollbackTenantError(te.getFaultInfo().getMessage(), te.getFaultInfo().getCategory(), Boolean.TRUE);
333 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
335 catch (Exception e) {
336 LOGGER.debug("Exception :",e);
337 RollbackTenantError exc = new RollbackTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
338 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
341 RollbackTenantResponse resp = new RollbackTenantResponse ();
342 resp.setTenantRolledback(req != null);
343 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();