2 * ============LICENSE_START=======================================================
\r
4 * ================================================================================
\r
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * ================================================================================
\r
7 * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * you may not use this file except in compliance with the License.
\r
9 * You may obtain a copy of the License at
\r
11 * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * Unless required by applicable law or agreed to in writing, software
\r
14 * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * See the License for the specific language governing permissions and
\r
17 * limitations under the License.
\r
18 * ============LICENSE_END=========================================================
\r
21 package org.openecomp.sdc.be.servlets;
\r
23 import com.fasterxml.jackson.databind.ObjectMapper;
\r
24 import com.google.gson.reflect.TypeToken;
\r
25 import com.jcabi.aspects.Loggable;
\r
26 import fj.data.Either;
\r
27 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
\r
28 import io.swagger.v3.oas.annotations.Operation;
\r
29 import io.swagger.v3.oas.annotations.Parameter;
\r
30 import io.swagger.v3.oas.annotations.info.Info;
\r
31 import io.swagger.v3.oas.annotations.media.ArraySchema;
\r
32 import io.swagger.v3.oas.annotations.media.Content;
\r
33 import io.swagger.v3.oas.annotations.media.Schema;
\r
34 import io.swagger.v3.oas.annotations.responses.ApiResponse;
\r
35 import io.swagger.v3.oas.annotations.responses.ApiResponses;
\r
36 import javax.inject.Inject;
\r
37 import javax.ws.rs.Consumes;
\r
38 import javax.ws.rs.DELETE;
\r
39 import javax.ws.rs.GET;
\r
40 import javax.ws.rs.HeaderParam;
\r
41 import javax.ws.rs.POST;
\r
42 import javax.ws.rs.PUT;
\r
43 import javax.ws.rs.Path;
\r
44 import javax.ws.rs.PathParam;
\r
45 import javax.ws.rs.Produces;
\r
46 import org.apache.http.HttpStatus;
\r
47 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
\r
48 import org.openecomp.sdc.be.components.impl.ResourceBusinessLogic;
\r
49 import org.openecomp.sdc.be.components.impl.ResourceImportManager;
\r
50 import org.openecomp.sdc.be.components.impl.ServiceBusinessLogic;
\r
51 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
\r
52 import org.openecomp.sdc.be.config.BeEcompErrorManager;
\r
53 import org.openecomp.sdc.be.dao.api.ActionStatus;
\r
54 import org.openecomp.sdc.be.datamodel.ServiceRelations;
\r
55 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
\r
56 import org.openecomp.sdc.be.impl.ComponentsUtils;
\r
57 import org.openecomp.sdc.be.impl.ServletUtils;
\r
58 import org.openecomp.sdc.be.model.DistributionStatusEnum;
\r
59 import org.openecomp.sdc.be.model.GroupInstanceProperty;
\r
60 import org.openecomp.sdc.be.model.Resource;
\r
61 import org.openecomp.sdc.be.model.Service;
\r
62 import org.openecomp.sdc.be.model.User;
\r
63 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
\r
64 import org.openecomp.sdc.be.user.UserBusinessLogic;
\r
65 import org.openecomp.sdc.common.api.Constants;
\r
66 import org.openecomp.sdc.common.datastructure.Wrapper;
\r
67 import org.openecomp.sdc.common.log.wrappers.Logger;
\r
68 import org.openecomp.sdc.exception.ResponseFormat;
\r
70 import javax.inject.Singleton;
\r
71 import javax.servlet.ServletContext;
\r
72 import javax.servlet.http.HttpServletRequest;
\r
73 import javax.ws.rs.core.Context;
\r
74 import javax.ws.rs.core.MediaType;
\r
75 import javax.ws.rs.core.Response;
\r
76 import java.lang.reflect.Type;
\r
77 import java.util.ArrayList;
\r
78 import java.util.List;
\r
79 import java.util.Map;
\r
81 @Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
\r
82 @Path("/v1/catalog")
\r
83 @OpenAPIDefinition(info = @Info(title = "Service Catalog", description = "Service Servlet"))
\r
85 public class ServiceServlet extends AbstractValidationsServlet {
\r
87 private static final Logger log = Logger.getLogger(ServiceServlet.class);
\r
88 private final ServiceBusinessLogic serviceBusinessLogic;
\r
89 private final ResourceBusinessLogic resourceBusinessLogic;
\r
92 public ServiceServlet(UserBusinessLogic userBusinessLogic,
\r
93 ComponentInstanceBusinessLogic componentInstanceBL,
\r
94 ComponentsUtils componentsUtils, ServletUtils servletUtils,
\r
95 ResourceImportManager resourceImportManager,
\r
96 ServiceBusinessLogic serviceBusinessLogic,
\r
97 ResourceBusinessLogic resourceBusinessLogic) {
\r
98 super(userBusinessLogic, componentInstanceBL, componentsUtils, servletUtils, resourceImportManager);
\r
99 this.serviceBusinessLogic = serviceBusinessLogic;
\r
100 this.resourceBusinessLogic = resourceBusinessLogic;
\r
105 @Consumes(MediaType.APPLICATION_JSON)
\r
106 @Produces(MediaType.APPLICATION_JSON)
\r
107 @Operation(description = "Create Service", method = "POST", summary = "Returns created service",
\r
108 responses = @ApiResponse(
\r
109 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Service.class)))))
\r
110 @ApiResponses(value = {@ApiResponse(responseCode = "201", description = "Service created"),
\r
111 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
112 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
113 @ApiResponse(responseCode = "409", description = "Service already exist")})
\r
114 public Response createService(@Parameter(description = "Service object to be created", required = true) String data,
\r
115 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
117 String url = request.getMethod() + " " + request.getRequestURI();
\r
118 log.debug("Start handle request of {}", url);
\r
120 User modifier = new User();
\r
121 modifier.setUserId(userId);
\r
122 log.debug("modifier id is {}", userId);
\r
124 Response response = null;
\r
126 Either<Service, ResponseFormat> convertResponse = parseToService(data, modifier);
\r
127 if (convertResponse.isRight()) {
\r
128 log.debug("failed to parse service");
\r
129 response = buildErrorResponse(convertResponse.right().value());
\r
133 Service service = convertResponse.left().value();
\r
134 Either<Service, ResponseFormat> actionResponse = serviceBusinessLogic.createService(service, modifier);
\r
136 if (actionResponse.isRight()) {
\r
137 log.debug("Failed to create service");
\r
138 response = buildErrorResponse(actionResponse.right().value());
\r
142 Object result = RepresentationUtils.toRepresentation(actionResponse.left().value());
\r
143 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.CREATED), result);
\r
146 } catch (Exception e) {
\r
147 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create Service");
\r
148 log.debug("create service failed with exception", e);
\r
149 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
154 public Either<Service, ResponseFormat> parseToService(String serviceJson, User user) {
\r
155 return getComponentsUtils().convertJsonToObjectUsingObjectMapper(serviceJson, user, Service.class, AuditingActionEnum.CREATE_RESOURCE, ComponentTypeEnum.SERVICE);
\r
159 @Path("/services/validate-name/{serviceName}")
\r
160 @Consumes(MediaType.APPLICATION_JSON)
\r
161 @Produces(MediaType.APPLICATION_JSON)
\r
162 @Operation(description = "validate service name", method = "GET",
\r
163 summary = "checks if the chosen service name is available ", responses = @ApiResponse(
\r
164 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
165 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service found"),
\r
166 @ApiResponse(responseCode = "403", description = "Restricted operation")})
\r
167 public Response validateServiceName(@PathParam("serviceName") final String serviceName,
\r
168 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
169 String url = request.getMethod() + " " + request.getRequestURI();
\r
170 log.debug("Start handle request of {}", url);
\r
173 User modifier = new User();
\r
174 modifier.setUserId(userId);
\r
175 log.debug("modifier id is {}", userId);
\r
176 Response response = null;
\r
178 Either<Map<String, Boolean>, ResponseFormat> actionResponse =
\r
179 serviceBusinessLogic.validateServiceNameExists(serviceName, userId);
\r
181 if (actionResponse.isRight()) {
\r
182 log.debug("failed to get validate service name");
\r
183 response = buildErrorResponse(actionResponse.right().value());
\r
186 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK),
\r
187 actionResponse.left().value());
\r
188 } catch (Exception e) {
\r
189 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Validate Service Name");
\r
190 log.debug("validate service name failed with exception", e);
\r
191 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
196 @Path("/audit-records/{componentType}/{componentUniqueId}")
\r
197 @Consumes(MediaType.APPLICATION_JSON)
\r
198 @Produces(MediaType.APPLICATION_JSON)
\r
199 @Operation(description = "get component audit records", method = "GET",
\r
200 summary = "get audit records for a service or a resource", responses = @ApiResponse(
\r
201 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
\r
202 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service found"),
\r
203 @ApiResponse(responseCode = "403", description = "Restricted operation")})
\r
204 public Response getComponentAuditRecords(@PathParam("componentType") final String componentType,
\r
205 @PathParam("componentUniqueId") final String componentUniqueId, @Context final HttpServletRequest request,
\r
206 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
208 ServletContext context = request.getSession().getServletContext();
\r
209 String url = request.getMethod() + " " + request.getRequestURI();
\r
210 log.debug("Start handle request of {}", url);
\r
212 User modifier = new User();
\r
213 modifier.setUserId(userId);
\r
214 log.debug("modifier id is {}", userId);
\r
215 Wrapper<Response> responseWrapper = new Wrapper<>();
\r
216 Wrapper<String> uuidWrapper = new Wrapper<>();
\r
217 Wrapper<String> versionWrapper = new Wrapper<>();
\r
218 Wrapper<User> userWrapper = new Wrapper<>();
\r
219 Wrapper<ComponentTypeEnum> componentWrapper = new Wrapper<>();
\r
221 validateUserExist(responseWrapper, userWrapper, userId);
\r
223 if (responseWrapper.isEmpty()) {
\r
224 validateComponentType(responseWrapper, componentWrapper, componentType);
\r
227 if (responseWrapper.isEmpty()) {
\r
228 fillUUIDAndVersion(responseWrapper, uuidWrapper, versionWrapper, userWrapper.getInnerElement(),
\r
229 componentWrapper.getInnerElement(), componentUniqueId, context);
\r
232 if (responseWrapper.isEmpty()) {
\r
233 Either<List<Map<String, Object>>, ResponseFormat> eitherServiceAudit =
\r
234 serviceBusinessLogic.getComponentAuditRecords(versionWrapper.getInnerElement(),
\r
235 uuidWrapper.getInnerElement(), userId);
\r
237 if (eitherServiceAudit.isRight()) {
\r
238 Response errorResponse = buildErrorResponse(eitherServiceAudit.right().value());
\r
239 responseWrapper.setInnerElement(errorResponse);
\r
241 List<Map<String, Object>> auditRecords = eitherServiceAudit.left().value();
\r
242 Response okResponse =
\r
243 buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), auditRecords);
\r
244 responseWrapper.setInnerElement(okResponse);
\r
249 } catch (Exception e) {
\r
250 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Validate Service Name");
\r
251 log.debug("get Service Audit Records failed with exception", e);
\r
252 Response errorResponse =
\r
253 buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
254 responseWrapper.setInnerElement(errorResponse);
\r
256 return responseWrapper.getInnerElement();
\r
259 private void fillUUIDAndVersion(Wrapper<Response> responseWrapper, Wrapper<String> uuidWrapper, Wrapper<String> versionWrapper, User user, final ComponentTypeEnum componentTypeEnum, final String componentUniqueId, ServletContext context) {
\r
261 if (componentTypeEnum == ComponentTypeEnum.RESOURCE) {
\r
262 Either<Resource, ResponseFormat> eitherResource = resourceBusinessLogic.getResource(componentUniqueId, user);
\r
263 if (eitherResource.isLeft()) {
\r
264 uuidWrapper.setInnerElement(eitherResource.left().value().getUUID());
\r
265 versionWrapper.setInnerElement(eitherResource.left().value().getVersion());
\r
267 responseWrapper.setInnerElement(buildErrorResponse(eitherResource.right().value()));
\r
271 Either<Service, ResponseFormat> eitherService = serviceBusinessLogic.getService(componentUniqueId, user);
\r
272 if (eitherService.isLeft()) {
\r
273 uuidWrapper.setInnerElement(eitherService.left().value().getUUID());
\r
274 versionWrapper.setInnerElement(eitherService.left().value().getVersion());
\r
276 responseWrapper.setInnerElement(buildErrorResponse(eitherService.right().value()));
\r
283 @Path("/services/{serviceId}")
\r
284 public Response deleteService(@PathParam("serviceId") final String serviceId, @Context final HttpServletRequest request) {
\r
285 String url = request.getMethod() + " " + request.getRequestURI();
\r
286 log.debug("Start handle request of {}", url);
\r
289 String userId = request.getHeader(Constants.USER_ID_HEADER);
\r
290 User modifier = new User();
\r
291 modifier.setUserId(userId);
\r
292 log.debug("modifier id is {}", userId);
\r
294 Response response = null;
\r
297 String serviceIdLower = serviceId.toLowerCase();
\r
298 ResponseFormat actionResponse = serviceBusinessLogic.deleteService(serviceIdLower, modifier);
\r
300 if (actionResponse.getStatus() != HttpStatus.SC_NO_CONTENT) {
\r
301 log.debug("failed to delete service");
\r
302 response = buildErrorResponse(actionResponse);
\r
305 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT), null);
\r
308 } catch (Exception e) {
\r
309 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Service");
\r
310 log.debug("delete service failed with exception", e);
\r
311 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
318 @Path("/services/{serviceName}/{version}")
\r
319 public Response deleteServiceByNameAndVersion(@PathParam("serviceName") final String serviceName, @PathParam("version") final String version, @Context final HttpServletRequest request) {
\r
320 String url = request.getMethod() + " " + request.getRequestURI();
\r
321 log.debug("Start handle request of {}", url);
\r
324 String userId = request.getHeader(Constants.USER_ID_HEADER);
\r
325 User modifier = new User();
\r
326 modifier.setUserId(userId);
\r
327 log.debug("modifier id is {}", userId);
\r
329 Response response = null;
\r
332 ResponseFormat actionResponse = serviceBusinessLogic.deleteServiceByNameAndVersion(serviceName, version, modifier);
\r
334 if (actionResponse.getStatus() != HttpStatus.SC_NO_CONTENT) {
\r
335 log.debug("failed to delete service");
\r
336 response = buildErrorResponse(actionResponse);
\r
339 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.NO_CONTENT), null);
\r
342 } catch (Exception e) {
\r
343 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete Service");
\r
344 log.debug("delete service failed with exception", e);
\r
345 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
352 @Path("/services/{serviceId}/metadata")
\r
353 @Consumes(MediaType.APPLICATION_JSON)
\r
354 @Produces(MediaType.APPLICATION_JSON)
\r
355 @Operation(description = "Update Service Metadata", method = "PUT", summary = "Returns updated service",
\r
356 responses = @ApiResponse(
\r
357 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Service.class)))))
\r
358 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service Updated"),
\r
359 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
360 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
\r
361 public Response updateServiceMetadata(@PathParam("serviceId") final String serviceId,
\r
362 @Parameter(description = "Service object to be Updated", required = true) String data,
\r
363 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
365 ServletContext context = request.getSession().getServletContext();
\r
366 String url = request.getMethod() + " " + request.getRequestURI();
\r
367 log.debug("Start handle request of {}", url);
\r
369 User modifier = new User();
\r
370 modifier.setUserId(userId);
\r
371 log.debug("modifier id is {}", userId);
\r
373 Response response = null;
\r
376 String serviceIdLower = serviceId.toLowerCase();
\r
378 Either<Service, ResponseFormat> convertResponse = parseToService(data, modifier);
\r
379 if (convertResponse.isRight()) {
\r
380 log.debug("failed to parse service");
\r
381 response = buildErrorResponse(convertResponse.right().value());
\r
384 Service updatedService = convertResponse.left().value();
\r
385 Either<Service, ResponseFormat> actionResponse =
\r
386 serviceBusinessLogic.updateServiceMetadata(serviceIdLower, updatedService, modifier);
\r
388 if (actionResponse.isRight()) {
\r
389 log.debug("failed to update service");
\r
390 response = buildErrorResponse(actionResponse.right().value());
\r
394 Service service = actionResponse.left().value();
\r
395 Object result = RepresentationUtils.toRepresentation(service);
\r
396 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
398 } catch (Exception e) {
\r
399 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update Service Metadata");
\r
400 log.debug("update service metadata failed with exception", e);
\r
401 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
407 * updates group instance property values
\r
408 * Note, than in case of group instance updated successfully, related resourceInstance and containing component modification time will be updated
\r
410 * @param componentInstanceId
\r
411 * @param groupInstanceId
\r
418 @Path("/{containerComponentType}/{serviceId}/resourceInstance/{componentInstanceId}/groupInstance/{groupInstanceId}")
\r
419 @Consumes(MediaType.APPLICATION_JSON)
\r
420 @Produces(MediaType.APPLICATION_JSON)
\r
421 @Operation(description = "Update Group Instance Property Values", method = "PUT",
\r
422 summary = "Returns updated group instance", responses = @ApiResponse(
\r
423 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Service.class)))))
\r
424 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Group Instance Property Values Updated"),
\r
425 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
426 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content")})
\r
427 public Response updateGroupInstancePropertyValues(@PathParam("serviceId") final String serviceId,
\r
428 @PathParam("componentInstanceId") final String componentInstanceId,
\r
429 @PathParam("groupInstanceId") final String groupInstanceId,
\r
430 @Parameter(description = "Group instance object to be Updated", required = true) String data,
\r
431 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
433 Response response = null;
\r
434 String url = request.getMethod() + " " + request.getRequestURI();
\r
435 log.debug("Start handle request of {}", url);
\r
437 User modifier = new User();
\r
438 modifier.setUserId(userId);
\r
439 log.debug("modifier id is {}",userId);
\r
441 Either<List<GroupInstanceProperty>, ResponseFormat> actionResponse = null;
\r
443 List<GroupInstanceProperty> updatedProperties;
\r
444 Type listType = new TypeToken<ArrayList<GroupInstanceProperty>>(){}.getType();
\r
445 ArrayList<GroupInstanceProperty> newProperties = gson.fromJson(data, listType);
\r
446 if (newProperties == null) {
\r
447 actionResponse = Either.right(getComponentsUtils().getResponseFormat(ActionStatus.INVALID_CONTENT));
\r
449 if(actionResponse == null){
\r
450 log.debug("Start handle update group instance property values request. Received group instance is {}", groupInstanceId);
\r
451 actionResponse = serviceBusinessLogic.updateGroupInstancePropertyValues(modifier, serviceId, componentInstanceId, groupInstanceId, newProperties);
\r
452 if(actionResponse.isRight()){
\r
453 actionResponse = Either.right(actionResponse.right().value());
\r
456 if(actionResponse.isLeft()){
\r
457 updatedProperties = actionResponse.left().value();
\r
458 ObjectMapper mapper = new ObjectMapper();
\r
459 String result = mapper.writeValueAsString(updatedProperties);
\r
460 response = buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
463 response = buildErrorResponse(actionResponse.right().value());
\r
465 } catch (Exception e) {
\r
466 log.error("Exception occured during update Group Instance property values: {}", e.getMessage(), e);
\r
467 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
473 @Path("/services/{serviceId}")
\r
474 @Consumes(MediaType.APPLICATION_JSON)
\r
475 @Produces(MediaType.APPLICATION_JSON)
\r
476 @Operation(description = "Retrieve Service", method = "GET", summary = "Returns service according to serviceId",
\r
477 responses = @ApiResponse(
\r
478 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Service.class)))))
\r
479 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service found"),
\r
480 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
481 @ApiResponse(responseCode = "404", description = "Service not found")})
\r
482 public Response getServiceById(@PathParam("serviceId") final String serviceId,
\r
483 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
485 String url = request.getMethod() + " " + request.getRequestURI();
\r
486 log.debug("Start handle request of {}", url);
\r
489 User modifier = new User();
\r
490 modifier.setUserId(userId);
\r
491 log.debug("modifier id is {}", userId);
\r
493 Response response = null;
\r
495 String serviceIdLower = serviceId.toLowerCase();
\r
496 log.debug("get service with id {}", serviceId);
\r
497 Either<Service, ResponseFormat> actionResponse = serviceBusinessLogic.getService(serviceIdLower, modifier);
\r
499 if (actionResponse.isRight()) {
\r
500 log.debug("failed to get service");
\r
501 response = buildErrorResponse(actionResponse.right().value());
\r
505 Service service = actionResponse.left().value();
\r
506 Object result = RepresentationUtils.toRepresentation(service);
\r
508 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
510 } catch (Exception e) {
\r
511 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Service");
\r
512 log.debug("get service failed with exception", e);
\r
513 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
519 @Path("/services/serviceName/{serviceName}/serviceVersion/{serviceVersion}")
\r
520 @Consumes(MediaType.APPLICATION_JSON)
\r
521 @Produces(MediaType.APPLICATION_JSON)
\r
522 @Operation(description = "Retrieve Service", method = "GET",
\r
523 summary = "Returns service according to name and version", responses = @ApiResponse(
\r
524 content = @Content(array = @ArraySchema(schema = @Schema(implementation = Service.class)))))
\r
525 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service found"),
\r
526 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
527 @ApiResponse(responseCode = "404", description = "Service not found")})
\r
528 public Response getServiceByNameAndVersion(@PathParam("serviceName") final String serviceName,
\r
529 @PathParam("serviceVersion") final String serviceVersion, @Context final HttpServletRequest request,
\r
530 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
533 User modifier = new User();
\r
534 modifier.setUserId(userId);
\r
535 log.debug("modifier id is {}", userId);
\r
537 Response response = null;
\r
539 Either<Service, ResponseFormat> actionResponse = serviceBusinessLogic.getServiceByNameAndVersion(serviceName, serviceVersion, userId);
\r
541 if (actionResponse.isRight()) {
\r
542 response = buildErrorResponse(actionResponse.right().value());
\r
546 Service service = actionResponse.left().value();
\r
547 Object result = RepresentationUtils.toRepresentation(service);
\r
549 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
551 } catch (Exception e) {
\r
552 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Service by name and version");
\r
553 log.debug("get service failed with exception", e);
\r
554 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
560 @Path("/services/{serviceId}/distribution-state/{state}")
\r
561 @Consumes(MediaType.APPLICATION_JSON)
\r
562 @Produces(MediaType.APPLICATION_JSON)
\r
563 @Operation(description = "Update Service Distribution State", method = "POST",
\r
564 summary = "service with the changed distribution status")
\r
565 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service distribution state changed"),
\r
566 @ApiResponse(responseCode = "409", description = "Restricted operation"),
\r
567 @ApiResponse(responseCode = "403", description = "Service is not available for distribution"),
\r
568 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
569 @ApiResponse(responseCode = "404", description = "Requested service was not found"),
\r
570 @ApiResponse(responseCode = "500", description = "Internal Server Error. Please try again later.")})
\r
571 public Response updateServiceDistributionState(
\r
572 @Parameter(description = "DistributionChangeInfo - get comment out of body",
\r
573 required = true) LifecycleChangeInfoWithAction jsonChangeInfo,
\r
574 @PathParam("serviceId") final String serviceId,
\r
575 @Parameter(schema = @Schema(allowableValues = {"approve", "reject"}),
\r
576 required = true) @PathParam("state") final String state,
\r
577 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
579 String url = request.getMethod() + " " + request.getRequestURI();
\r
580 log.debug("Start handle request of {}", url);
\r
582 User modifier = new User();
\r
583 modifier.setUserId(userId);
\r
584 log.debug("modifier id is {}", userId);
\r
586 Response response = null;
\r
588 Either<Service, ResponseFormat> actionResponse = serviceBusinessLogic.changeServiceDistributionState(serviceId, state, jsonChangeInfo, modifier);
\r
590 if (actionResponse.isRight()) {
\r
591 log.debug("failed to Update Service Distribution State");
\r
592 response = buildErrorResponse(actionResponse.right().value());
\r
595 Service service = actionResponse.left().value();
\r
596 Object result = RepresentationUtils.toRepresentation(service);
\r
598 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
599 } catch (Exception e) {
\r
600 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Update Service Distribution State");
\r
601 log.debug("updateServiceDistributionState failed with exception", e);
\r
602 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
608 @Path("/services/{serviceId}/distribution/{env}/activate")
\r
609 @Consumes(MediaType.APPLICATION_JSON)
\r
610 @Produces(MediaType.APPLICATION_JSON)
\r
611 @Operation(description = "Activate distribution", method = "POST", summary = "activate distribution")
\r
612 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "OK"),
\r
613 @ApiResponse(responseCode = "409",
\r
614 description = "Service cannot be distributed due to missing deployment artifacts"),
\r
615 @ApiResponse(responseCode = "404", description = "Requested service was not found"),
\r
616 @ApiResponse(responseCode = "500", description = "Internal Server Error. Please try again later.")})
\r
617 public Response activateDistribution(@PathParam("serviceId") final String serviceId,
\r
618 @PathParam("env") final String env, @Context final HttpServletRequest request,
\r
619 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
621 String url = request.getMethod() + " " + request.getRequestURI();
\r
622 log.debug("Start handle request of {}", url);
\r
624 User modifier = new User();
\r
625 modifier.setUserId(userId);
\r
626 log.debug("modifier id is {}", userId);
\r
628 Response response = null;
\r
630 Either<Service, ResponseFormat> distResponse = serviceBusinessLogic.activateDistribution(serviceId, env, modifier, request);
\r
632 if (distResponse.isRight()) {
\r
633 log.debug("failed to activate service distribution");
\r
634 response = buildErrorResponse(distResponse.right().value());
\r
637 Service service = distResponse.left().value();
\r
638 Object result = RepresentationUtils.toRepresentation(service);
\r
639 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
640 } catch (Exception e) {
\r
641 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Activate Distribution");
\r
642 log.debug("activate distribution failed with exception", e);
\r
643 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
649 @Path("/services/{serviceId}/distribution/{did}/markDeployed")
\r
650 @Consumes(MediaType.APPLICATION_JSON)
\r
651 @Produces(MediaType.APPLICATION_JSON)
\r
652 @Operation(description = "Mark distribution as deployed", method = "POST",
\r
653 summary = "relevant audit record will be created")
\r
654 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service was marked as deployed"),
\r
655 @ApiResponse(responseCode = "409", description = "Restricted operation"),
\r
656 @ApiResponse(responseCode = "403", description = "Service is not available"),
\r
657 @ApiResponse(responseCode = "400", description = "Invalid content / Missing content"),
\r
658 @ApiResponse(responseCode = "404", description = "Requested service was not found"),
\r
659 @ApiResponse(responseCode = "500", description = "Internal Server Error. Please try again later.")})
\r
660 public Response markDistributionAsDeployed(@PathParam("serviceId") final String serviceId,
\r
661 @PathParam("did") final String did, @Context final HttpServletRequest request,
\r
662 @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
664 String url = request.getMethod() + " " + request.getRequestURI();
\r
665 log.debug("Start handle request of {}", url);
\r
667 User modifier = new User();
\r
668 modifier.setUserId(userId);
\r
669 log.debug("modifier id is {}", userId);
\r
671 Response response = null;
\r
673 Either<Service, ResponseFormat> distResponse = serviceBusinessLogic.markDistributionAsDeployed(serviceId, did, modifier);
\r
675 if (distResponse.isRight()) {
\r
676 log.debug("failed to mark distribution as deployed");
\r
677 response = buildErrorResponse(distResponse.right().value());
\r
680 Service service = distResponse.left().value();
\r
681 Object result = RepresentationUtils.toRepresentation(service);
\r
682 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
683 } catch (Exception e) {
\r
684 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Mark Distribution As Deployed");
\r
685 log.debug("mark distribution as deployed failed with exception", e);
\r
686 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
692 @Path("/services/{serviceId}/tempUrlToBeDeleted")
\r
693 @Consumes(MediaType.APPLICATION_JSON)
\r
694 @Produces(MediaType.APPLICATION_JSON)
\r
695 @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "500", description = "Internal Server Error. Please try again later.") })
\r
696 public Response tempUrlToBeDeleted(@PathParam("serviceId") final String serviceId, @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
698 ServletContext context = request.getSession().getServletContext();
\r
699 String url = request.getMethod() + " " + request.getRequestURI();
\r
700 log.debug("Start handle request of {}", url);
\r
702 User modifier = new User();
\r
703 modifier.setUserId(userId);
\r
704 log.debug("modifier id is {}", userId);
\r
708 Service service = (serviceBusinessLogic.getService(serviceId, modifier)).left().value();
\r
709 Either<Service, ResponseFormat> res = serviceBusinessLogic.updateDistributionStatusForActivation(service, modifier, DistributionStatusEnum.DISTRIBUTED);
\r
711 if (res.isRight()) {
\r
712 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
714 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), null);
\r
715 } catch (Exception e) {
\r
716 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("tempUrlToBeDeleted");
\r
717 log.debug("failed with exception", e);
\r
718 response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r
725 @Path("/services/{serviceId}/linksMap")
\r
726 @Consumes(MediaType.APPLICATION_JSON)
\r
727 @Produces(MediaType.APPLICATION_JSON)
\r
728 @Operation(description = "Retrieve Service component relations map", method = "GET",
\r
729 summary = "Returns service components relations",responses = @ApiResponse(
\r
730 content = @Content(array = @ArraySchema(schema = @Schema(implementation = ServiceRelations.class)))))
\r
731 @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "Service found"),
\r
732 @ApiResponse(responseCode = "403", description = "Restricted operation"),
\r
733 @ApiResponse(responseCode = "404", description = "Service not found")})
\r
734 public Response getServiceComponentRelationMap(@PathParam("serviceId") final String serviceId,
\r
735 @Context final HttpServletRequest request, @HeaderParam(value = Constants.USER_ID_HEADER) String userId) {
\r
737 String url = request.getMethod() + " " + request.getRequestURI();
\r
738 log.debug("Start handle request of {}", url);
\r
741 User modifier = new User();
\r
742 modifier.setUserId(userId);
\r
743 log.debug("modifier id is {}", userId);
\r
745 Response response = null;
\r
747 String serviceIdLower = serviceId.toLowerCase();
\r
748 log.debug("get service components relations with id {}", serviceId);
\r
749 Either<ServiceRelations, ResponseFormat> actionResponse = serviceBusinessLogic.getServiceComponentsRelations(serviceIdLower, modifier);
\r
751 if (actionResponse.isRight()) {
\r
752 log.debug("failed to get service relations data");
\r
753 response = buildErrorResponse(actionResponse.right().value());
\r
757 ServiceRelations serviceRelations = actionResponse.left().value();
\r
758 Object result = RepresentationUtils.toRepresentation(serviceRelations);
\r
760 return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), result);
\r
762 } catch (Exception e) {
\r
763 BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Get Service");
\r
764 log.debug("get service relations data failed with exception", e);
\r
765 return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
\r