925d10179fce8ce6c993568a4e78cc67772ae264
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22 package org.onap.so.apihandlerinfra;
23
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.stream.Collectors;
29 import javax.transaction.Transactional;
30 import javax.ws.rs.GET;
31 import javax.ws.rs.Path;
32 import javax.ws.rs.PathParam;
33 import javax.ws.rs.QueryParam;
34 import javax.ws.rs.core.Response;
35 import org.apache.http.HttpStatus;
36 import org.onap.so.apihandler.common.ErrorNumbers;
37 import org.onap.so.apihandler.common.ResponseBuilder;
38 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
39 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
40 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ActivitySequence;
41 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ArtifactInfo;
42 import org.onap.so.apihandlerinfra.workflowspecificationbeans.Validation;
43 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
44 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecification;
45 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecificationList;
46 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
47 import org.onap.so.db.catalog.beans.ActivitySpec;
48 import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
49 import org.onap.so.db.catalog.beans.UserParameters;
50 import org.onap.so.db.catalog.beans.Workflow;
51 import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
52 import org.onap.so.db.catalog.client.CatalogDbClient;
53 import org.onap.so.logger.ErrorCode;
54 import org.onap.so.logger.MessageEnum;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57 import org.springframework.beans.factory.annotation.Autowired;
58 import org.springframework.stereotype.Component;
59 import com.fasterxml.jackson.core.JsonProcessingException;
60 import com.fasterxml.jackson.databind.DeserializationFeature;
61 import com.fasterxml.jackson.databind.ObjectMapper;
62 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
63 import io.swagger.v3.oas.annotations.Operation;
64 import io.swagger.v3.oas.annotations.info.Info;
65 import io.swagger.v3.oas.annotations.media.ArraySchema;
66 import io.swagger.v3.oas.annotations.media.Content;
67 import io.swagger.v3.oas.annotations.media.Schema;
68 import io.swagger.v3.oas.annotations.responses.ApiResponse;
69
70 @Path("onap/so/infra/workflowSpecifications")
71 @OpenAPIDefinition(info = @Info(title = "onap/so/infra/workflowSpecifications",
72         description = "Queries of Workflow Specifications"))
73 @Component
74 public class WorkflowSpecificationsHandler {
75
76     @Autowired
77     private ResponseBuilder builder;
78
79     @Autowired
80     private CatalogDbClient catalogDbClient;
81
82     private static Logger logger = LoggerFactory.getLogger(WorkflowSpecificationsHandler.class);
83     private static final String ARTIFACT_TYPE_WORKFLOW = "workflow";
84     private static final String NATIVE_WORKFLOW = "native";
85
86     @Path("/{version:[vV]1}/workflows")
87     @GET
88     @Operation(description = "Finds Workflow Specifications", responses = @ApiResponse(
89             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
90     @Transactional
91
92     public Response queryWorkflowSpecifications(@QueryParam("vnfModelVersionId") String vnfModelVersionId,
93             @PathParam("version") String version) throws Exception {
94
95         String apiVersion = version.substring(1);
96
97         ObjectMapper mapper1 = new ObjectMapper();
98         mapper1.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
99
100         List<Workflow> workflows = catalogDbClient.findWorkflowByModelUUID(vnfModelVersionId);
101
102         List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
103         if (nativeWorkflows != null && !nativeWorkflows.isEmpty()) {
104             workflows.addAll(nativeWorkflows);
105         }
106
107         WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(workflows);
108
109         String jsonResponse;
110         try {
111             ObjectMapper mapper = new ObjectMapper();
112             jsonResponse = mapper.writeValueAsString(workflowSpecifications);
113         } catch (JsonProcessingException e) {
114             ErrorLoggerInfo errorLoggerInfo =
115                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
116                             .build();
117             ValidateException validateException =
118                     new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
119                             HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
120                                     .errorInfo(errorLoggerInfo).build();
121             throw validateException;
122         }
123
124         return builder.buildResponse(HttpStatus.SC_OK, "", jsonResponse, apiVersion);
125     }
126
127     protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
128         if (workflows == null || workflows.isEmpty()) {
129             return null;
130         }
131         WorkflowSpecifications workflowSpecifications = new WorkflowSpecifications();
132         List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<>();
133
134         for (Workflow workflow : workflows) {
135             WorkflowSpecificationList workflowSpecificationListItem = new WorkflowSpecificationList();
136             WorkflowSpecification workflowSpecification = new WorkflowSpecification();
137             workflowSpecification.setArtifactInfo(buildArtifactInfo(workflow));
138             workflowSpecification.setActivitySequence(buildActivitySequence(workflow));
139             workflowSpecification.setWorkflowInputParameters(buildWorkflowInputParameters(workflow));
140             workflowSpecificationListItem.setWorkflowSpecification(workflowSpecification);
141             workflowSpecificationList.add(workflowSpecificationListItem);
142         }
143         workflowSpecifications.setWorkflowSpecificationList(workflowSpecificationList);
144         return workflowSpecifications;
145     }
146
147     private ArtifactInfo buildArtifactInfo(Workflow workflow) {
148         ArtifactInfo artifactInfo = new ArtifactInfo();
149         artifactInfo.setArtifactType(ARTIFACT_TYPE_WORKFLOW);
150         artifactInfo.setArtifactUuid(workflow.getArtifactUUID());
151         artifactInfo.setArtifactName(workflow.getArtifactName());
152         if (workflow.getVersion() != null) {
153             artifactInfo.setArtifactVersion(workflow.getVersion().toString());
154         }
155         artifactInfo.setArtifactDescription(workflow.getDescription());
156         artifactInfo.setWorkflowName(workflow.getName());
157         artifactInfo.setOperationName(workflow.getOperationName());
158         artifactInfo.setWorkflowSource(workflow.getSource());
159         artifactInfo.setWorkflowResourceTarget(workflow.getResourceTarget());
160         return artifactInfo;
161     }
162
163     private List<ActivitySequence> buildActivitySequence(Workflow workflow) {
164         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
165         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
166             return null;
167         }
168         List<ActivitySequence> activitySequences = new ArrayList<>();
169         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
170             if (workflowActivitySpecSequence != null) {
171                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
172                 if (activitySpec != null) {
173                     ActivitySequence activitySequence = new ActivitySequence();
174                     activitySequence.setName(activitySpec.getName());
175                     logger.debug("Adding activity: " + activitySpec.getName());
176                     activitySequence.setDescription(activitySpec.getDescription());
177                     activitySequences.add(activitySequence);
178                 }
179             }
180         }
181         return activitySequences;
182     }
183
184     private List<WorkflowInputParameter> buildWorkflowInputParameters(Workflow workflow) {
185         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
186         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
187             return new ArrayList<>();
188         }
189         Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<>();
190         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
191             if (workflowActivitySpecSequence != null) {
192                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
193                 if (activitySpec != null) {
194                     List<ActivitySpecUserParameters> activitySpecUserParameters =
195                             activitySpec.getActivitySpecUserParameters();
196                     if (activitySpecUserParameters != null && !activitySpecUserParameters.isEmpty()) {
197                         for (ActivitySpecUserParameters activitySpecUserParameter : activitySpecUserParameters) {
198                             UserParameters userParameter = activitySpecUserParameter.getUserParameters();
199                             if (userParameter != null) {
200                                 WorkflowInputParameter workflowInputParameter =
201                                         buildWorkflowInputParameter(userParameter);
202                                 workflowInputParameterMap.put(userParameter.getName(), workflowInputParameter);
203                             }
204                         }
205                     }
206                 }
207             }
208         }
209
210         if (workflowInputParameterMap.size() == 0) {
211             return new ArrayList<>();
212         }
213         List<WorkflowInputParameter> workflowInputParameterList =
214                 workflowInputParameterMap.values().stream().collect(Collectors.toList());
215         return workflowInputParameterList;
216     }
217
218     private WorkflowInputParameter buildWorkflowInputParameter(UserParameters userParameter) {
219         WorkflowInputParameter workflowInputParameter = new WorkflowInputParameter();
220         workflowInputParameter.setLabel(userParameter.getLabel());
221         workflowInputParameter.setInputType(userParameter.getType());
222         workflowInputParameter.setRequired(userParameter.getIsRequried());
223         workflowInputParameter.setSoFieldName(userParameter.getName());
224         workflowInputParameter.setSoPayloadLocation(userParameter.getPayloadLocation());
225         workflowInputParameter.setValidation(buildValidationList(userParameter));
226         return workflowInputParameter;
227     }
228
229     private List<Validation> buildValidationList(UserParameters userParameter) {
230         List<Validation> validationList = null;
231         if (userParameter.getMaxLength() != null || userParameter.getAllowableChars() != null) {
232             validationList = new ArrayList<>();
233             Validation validation = new Validation();
234             if (userParameter.getMaxLength() != null) {
235                 validation.setMaxLength(userParameter.getMaxLength().toString());
236             }
237             validation.setAllowableChars(userParameter.getAllowableChars());
238             validationList.add(validation);
239         }
240         return validationList;
241     }
242 }