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 * Modifications Copyright (C) 2018 IBM.
9 * Modifications Copyright (c) 2019 Samsung
10 * ================================================================================
11 * Licensed under the Apache License, Version 2.0 (the "License");
12 * you may not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
15 * http://www.apache.org/licenses/LICENSE-2.0
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS,
19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
22 * ============LICENSE_END=========================================================
25 package org.onap.so.adapters.tenant;
28 import io.swagger.annotations.Api;
29 import io.swagger.annotations.ApiOperation;
30 import io.swagger.annotations.ApiParam;
31 import io.swagger.annotations.ApiResponse;
32 import io.swagger.annotations.ApiResponses;
34 import javax.servlet.http.HttpServletResponse;
35 import javax.ws.rs.Consumes;
36 import javax.ws.rs.DELETE;
37 import javax.ws.rs.GET;
38 import javax.ws.rs.POST;
39 import javax.ws.rs.Path;
40 import javax.ws.rs.PathParam;
41 import javax.ws.rs.Produces;
42 import javax.ws.rs.QueryParam;
43 import javax.ws.rs.core.MediaType;
44 import javax.ws.rs.core.Response;
45 import javax.xml.ws.Holder;
46 import org.onap.so.adapters.tenant.exceptions.TenantAlreadyExists;
47 import org.onap.so.adapters.tenant.exceptions.TenantException;
48 import org.onap.so.adapters.tenantrest.CreateTenantError;
49 import org.onap.so.adapters.tenantrest.CreateTenantRequest;
50 import org.onap.so.adapters.tenantrest.CreateTenantResponse;
51 import org.onap.so.adapters.tenantrest.DeleteTenantError;
52 import org.onap.so.adapters.tenantrest.DeleteTenantRequest;
53 import org.onap.so.adapters.tenantrest.DeleteTenantResponse;
54 import org.onap.so.adapters.tenantrest.QueryTenantError;
55 import org.onap.so.adapters.tenantrest.QueryTenantResponse;
56 import org.onap.so.adapters.tenantrest.RollbackTenantError;
57 import org.onap.so.adapters.tenantrest.RollbackTenantRequest;
58 import org.onap.so.adapters.tenantrest.RollbackTenantResponse;
59 import org.onap.so.adapters.tenantrest.TenantRollback;
60 import org.onap.so.openstack.beans.MsoTenant;
61 import org.onap.so.openstack.exceptions.MsoExceptionCategory;
62 import org.slf4j.Logger;
63 import org.slf4j.LoggerFactory;
64 import org.springframework.beans.factory.annotation.Autowired;
65 import org.springframework.stereotype.Component;
68 * This class services calls to the REST interface for Tenants (http://host:port/vnfs/rest/v1/tenants) Both XML and JSON
69 * can be produced/consumed. Set Accept: and Content-Type: headers appropriately. XML is the default.
72 @Api(value = "/v1/tenants", description = "root of tenant adapters restful web service")
74 public class TenantAdapterRest {
76 private static Logger logger = LoggerFactory.getLogger(TenantAdapterRest.class);
77 private static final String EXCEPTION = "Exception :";
78 // RAA? No logging in wrappers
80 private MsoTenantAdapterImpl tenantImpl;
85 * URL: EP: http://host:8080/tenants/rest Resource: v1/tenants REQ - metadata? { "cloudSiteId": "DAN", "tenantName":
86 * "RAA_1", "failIfExists": true, "msoRequest": { "requestId": "ra1", "serviceInstanceId": "sa1" }} RESP- {
87 * "cloudSiteId": "DAN", "tenantId": "128e10b9996d43a7874f19bbc4eb6749", "tenantCreated": true, "tenantRollback": {
88 * "tenantId": "128e10b9996d43a7874f19bbc4eb6749", "cloudId": "DAN", // RAA? cloudId instead of cloudSiteId
89 * "tenantCreated": true, "msoRequest": { "requestId": "ra1", "serviceInstanceId": "sa1" } } }
92 @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
93 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
94 @ApiOperation(value = "CreateTenant", response = Response.class,
95 notes = "Creates a new tenant, CreateTenantRequest data is required")
96 @ApiResponses({@ApiResponse(code = 200, message = "tenant has been successfully created"),
97 @ApiResponse(code = 500, message = "create tenant failed")})
98 public Response createTenant(
99 @ApiParam(value = "details of tenant being created", required = true) CreateTenantRequest req) {
100 logger.debug("createTenant enter: {}", req.toJsonString());
102 String newTenantId = null;
103 TenantRollback tenantRollback = new TenantRollback();
106 Holder<String> htenant = new Holder<>();
107 Holder<TenantRollback> hrollback = new Holder<>();
108 MsoTenantAdapter impl = tenantImpl;
109 impl.createTenant(req.getCloudSiteId(), req.getTenantName(), req.getMetadata(), req.getFailIfExists(),
110 req.getBackout(), req.getMsoRequest(), htenant, hrollback);
111 newTenantId = htenant.value;
112 tenantRollback = hrollback.value;
114 } catch (TenantAlreadyExists tae) {
115 logger.debug(EXCEPTION, tae);
116 CreateTenantError exc =
117 new CreateTenantError(tae.getMessage(), tae.getFaultInfo().getCategory(), Boolean.TRUE);
118 return Response.status(HttpServletResponse.SC_NOT_IMPLEMENTED).entity(exc).build();
119 } catch (TenantException te) {
120 logger.debug(EXCEPTION, te);
121 CreateTenantError exc = new CreateTenantError(te.getFaultInfo().getMessage(),
122 te.getFaultInfo().getCategory(), Boolean.TRUE);
123 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
124 } catch (Exception e) {
125 logger.debug(EXCEPTION, e);
126 CreateTenantError exc = new CreateTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
127 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
130 CreateTenantResponse resp = new CreateTenantResponse(req.getCloudSiteId(), newTenantId,
131 tenantRollback.getTenantCreated(), tenantRollback);
132 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
136 * URL: http://host:8080/tenants/rest Resource: v1/tenant/tennatId REQ: {"cloudSiteId": "DAN", "tenantId":
137 * "ca84cd3d3df44272845da554656b3ace", "msoRequest": { "requestId": "ra1", "serviceInstanceId": "sa1" } } RESP:
138 * {"tenantDeleted": true}
142 @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
143 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
144 @ApiOperation(value = "DeleteTenant", response = Response.class, notes = "Delete an existing tenant")
145 @ApiResponses({@ApiResponse(code = 200, message = "tenant has been successfully deleted"),
146 @ApiResponse(code = 500, message = "delete tenant failed")})
147 public Response deleteTenant(
148 @ApiParam(value = "tenantId of tenant being deleted",
149 required = true) @PathParam("tenantId") String tenantId,
150 @ApiParam(value = "DeleteTenantRequest object containing additional information of tenant being deleted",
151 required = false) DeleteTenantRequest req) {
152 boolean tenantDeleted = false;
155 Holder<Boolean> deleted = new Holder<>();
156 MsoTenantAdapter impl = tenantImpl;
157 impl.deleteTenant(req.getCloudSiteId(), req.getTenantId(), req.getMsoRequest(), deleted);
158 tenantDeleted = deleted.value;
159 } catch (TenantException te) {
160 logger.debug(EXCEPTION, te);
161 DeleteTenantError exc = new DeleteTenantError(te.getFaultInfo().getMessage(),
162 te.getFaultInfo().getCategory(), Boolean.TRUE);
163 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
164 } catch (Exception e) {
165 logger.debug(EXCEPTION, e);
166 DeleteTenantError exc = new DeleteTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
167 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
169 DeleteTenantResponse resp = new DeleteTenantResponse();
170 resp.setTenantDeleted(tenantDeleted);
171 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
175 * URL EP://http://host:8080/tenants/rest Resource: /v1/tenants Params:?tenantNameOrId=RAA_1&cloudSiteId=DAN RESP {
176 * "tenantId": "214b428a1f554c02935e66330f6a5409", "tenantName": "RAA_1", "metadata": {} }
180 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
181 @ApiOperation(value = "QueryTenant", response = Response.class, notes = "Query an existing tenant")
182 @ApiResponses({@ApiResponse(code = 200, message = "tenant has been successfully queried"),
183 @ApiResponse(code = 500, message = "query tenant failed")})
184 public Response queryTenant(@ApiParam(value = "tenantId", required = true) @PathParam("tenantId") String tenantId,
185 // @QueryParam("tenantNameOrId") String tenantNameOrId, //RAA? diff from doc
186 @ApiParam(value = "cloudSiteId", required = true) @QueryParam("cloudSiteId") String cloudSiteId,
187 @ApiParam(value = "msoRequest.requestId",
188 required = true) @QueryParam("msoRequest.requestId") String requestId,
189 @ApiParam(value = "msoRequest.serviceInstanceId",
190 required = true) @QueryParam("msoRequest.serviceInstanceId") String serviceInstanceId) {
191 MsoTenant tenant = null;
193 Holder<String> htenant = new Holder<>();
194 Holder<String> tenantName = new Holder<>();
195 Holder<Map<String, String>> metadata = new Holder<>();
196 MsoTenantAdapter impl = tenantImpl;
197 impl.queryTenant(cloudSiteId, tenantId, null, htenant, tenantName, metadata);
198 tenant = new MsoTenant(htenant.value, tenantName.value, metadata.value);
200 } catch (TenantException te) {
201 logger.debug(EXCEPTION, te);
202 QueryTenantError exc =
203 new QueryTenantError(te.getFaultInfo().getMessage(), te.getFaultInfo().getCategory());
204 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
205 } catch (Exception e) {
206 logger.debug(EXCEPTION, e);
207 QueryTenantError exc = new QueryTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL);
208 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
210 QueryTenantResponse resp =
211 new QueryTenantResponse(tenant.getTenantId(), tenant.getTenantName(), tenant.getMetadata());
212 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
216 * URL EP: //http://host:8080/tenants/rest Resource: /v1/tenants/rollback REQ {"cloudSiteId": "DAN", "tenantId":
217 * "f58abb05041d4ff384d4d22d1ccd2a6c", "msoRequest": { "requestId": "ra1", "serviceInstanceId": "sa1" } } RESP:
218 * {"tenantDeleted": true}
222 @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
223 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
224 @ApiOperation(value = "RollbackTenant", response = Response.class, notes = "Rollback an existing tenant")
225 @ApiResponses({@ApiResponse(code = 200, message = "tenant has been successfully rolledback"),
226 @ApiResponse(code = 500, message = "rollback tenant failed")})
227 public Response rollbackTenant(
228 @ApiParam(value = "rollback, command action", required = true) @QueryParam("rollback") String action,
229 @ApiParam(value = "RollbackTenantRequest", required = true) RollbackTenantRequest req) {
231 MsoTenantAdapter impl = tenantImpl;
232 impl.rollbackTenant(req.getTenantRollback());
233 } catch (TenantException te) {
234 logger.debug(EXCEPTION, te);
235 RollbackTenantError exc = new RollbackTenantError(te.getFaultInfo().getMessage(),
236 te.getFaultInfo().getCategory(), Boolean.TRUE);
237 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
238 } catch (Exception e) {
239 logger.debug(EXCEPTION, e);
240 RollbackTenantError exc =
241 new RollbackTenantError(e.getMessage(), MsoExceptionCategory.INTERNAL, Boolean.TRUE);
242 return Response.status(HttpServletResponse.SC_INTERNAL_SERVER_ERROR).entity(exc).build();
245 RollbackTenantResponse resp = new RollbackTenantResponse();
246 resp.setTenantRolledback(req != null);
247 return Response.status(HttpServletResponse.SC_OK).entity(resp).build();