Replaced all tabs with spaces in java and pom.xml
[so.git] / adapters / mso-openstack-adapters / src / main / java / org / onap / so / adapters / tenant / TenantAdapterRest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
14  * 
15  *      http://www.apache.org/licenses/LICENSE-2.0
16  * 
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=========================================================
23  */
24
25 package org.onap.so.adapters.tenant;
26
27
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;
33 import java.util.Map;
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;
66
67 /**
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.
70  */
71 @Path("/v1/tenants")
72 @Api(value = "/v1/tenants", description = "root of tenant adapters restful web service")
73 @Component
74 public class TenantAdapterRest {
75
76     private static Logger logger = LoggerFactory.getLogger(TenantAdapterRest.class);
77     private static final String EXCEPTION = "Exception :";
78     // RAA? No logging in wrappers
79     @Autowired
80     private MsoTenantAdapterImpl tenantImpl;
81
82
83
84     /*
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" } } }
90      */
91     @POST
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());
101
102         String newTenantId = null;
103         TenantRollback tenantRollback = new TenantRollback();
104
105         try {
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;
113
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();
128         }
129
130         CreateTenantResponse resp = new CreateTenantResponse(req.getCloudSiteId(), newTenantId,
131                 tenantRollback.getTenantCreated(), tenantRollback);
132         return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
133     }
134
135     /*
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}
139      */
140     @DELETE
141     @Path("{tenantId}")
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;
153
154         try {
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();
168         }
169         DeleteTenantResponse resp = new DeleteTenantResponse();
170         resp.setTenantDeleted(tenantDeleted);
171         return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
172     }
173
174     /*
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": {} }
177      */
178     @GET
179     @Path("{tenantId}")
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;
192         try {
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);
199
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();
209         }
210         QueryTenantResponse resp =
211                 new QueryTenantResponse(tenant.getTenantId(), tenant.getTenantName(), tenant.getMetadata());
212         return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
213     }
214
215     /*
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}
219      */
220     @DELETE
221     @Path("")
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) {
230         try {
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();
243         }
244
245         RollbackTenantResponse resp = new RollbackTenantResponse();
246         resp.setTenantRolledback(req != null);
247         return Response.status(HttpServletResponse.SC_OK).entity(resp).build();
248     }
249 }