0d0e6ee92f628830ea97c5c1891909880c79b28b
[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.TreeSet;
27 import java.util.Comparator;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.stream.Collectors;
31 import javax.transaction.Transactional;
32 import javax.ws.rs.GET;
33 import javax.ws.rs.Path;
34 import javax.ws.rs.PathParam;
35 import javax.ws.rs.QueryParam;
36 import javax.ws.rs.core.Response;
37 import org.apache.http.HttpStatus;
38 import org.onap.so.apihandler.common.ErrorNumbers;
39 import org.onap.so.apihandler.common.ResponseBuilder;
40 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
41 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
42 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ActivitySequence;
43 import org.onap.so.apihandlerinfra.workflowspecificationbeans.ArtifactInfo;
44 import org.onap.so.apihandlerinfra.workflowspecificationbeans.Validation;
45 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowInputParameter;
46 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecification;
47 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecificationList;
48 import org.onap.so.apihandlerinfra.workflowspecificationbeans.WorkflowSpecifications;
49 import org.onap.so.db.catalog.beans.ActivitySpec;
50 import org.onap.so.db.catalog.beans.ActivitySpecUserParameters;
51 import org.onap.so.db.catalog.beans.UserParameters;
52 import org.onap.so.db.catalog.beans.Workflow;
53 import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
54 import org.onap.so.db.catalog.client.CatalogDbClient;
55 import org.onap.so.logger.ErrorCode;
56 import org.onap.so.logger.MessageEnum;
57 import org.slf4j.Logger;
58 import org.slf4j.LoggerFactory;
59 import org.springframework.beans.factory.annotation.Autowired;
60 import org.springframework.stereotype.Component;
61 import com.fasterxml.jackson.core.JsonProcessingException;
62 import com.fasterxml.jackson.databind.DeserializationFeature;
63 import com.fasterxml.jackson.databind.ObjectMapper;
64 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
65 import io.swagger.v3.oas.annotations.Operation;
66 import io.swagger.v3.oas.annotations.info.Info;
67 import io.swagger.v3.oas.annotations.media.ArraySchema;
68 import io.swagger.v3.oas.annotations.media.Content;
69 import io.swagger.v3.oas.annotations.media.Schema;
70 import io.swagger.v3.oas.annotations.responses.ApiResponse;
71
72 @Path("onap/so/infra/workflowSpecifications")
73 @OpenAPIDefinition(info = @Info(title = "onap/so/infra/workflowSpecifications",
74         description = "Queries of Workflow Specifications"))
75 @Component
76 public class WorkflowSpecificationsHandler {
77
78     @Autowired
79     private ResponseBuilder builder;
80
81     @Autowired
82     private CatalogDbClient catalogDbClient;
83
84     private static Logger logger = LoggerFactory.getLogger(WorkflowSpecificationsHandler.class);
85     private static final String ARTIFACT_TYPE_WORKFLOW = "workflow";
86     private static final String NATIVE_WORKFLOW = "native";
87
88     @Path("/{version:[vV]1}/workflows")
89     @GET
90     @Operation(description = "Finds Workflow Specifications", responses = @ApiResponse(
91             content = @Content(array = @ArraySchema(schema = @Schema(implementation = Response.class)))))
92     @Transactional
93
94     public Response queryWorkflowSpecifications(@QueryParam("vnfModelVersionId") String vnfModelVersionId,
95             @QueryParam("pnfModelVersionId") String pnfModelVersionId, @PathParam("version") String version)
96             throws Exception {
97         String apiVersion = version.substring(1);
98
99         List<Workflow> workflows = new ArrayList<>();
100         if (vnfModelVersionId == null && pnfModelVersionId == null) {
101             workflows.addAll(queryWorkflowSpecificationsForAll());
102         } else {
103             // 1. query workflow specifications for given vnfModelVersionId if need.
104             if (vnfModelVersionId != null) {
105                 List<Workflow> vnfWorkflows = queryWorkflowSpecificationsForVnf(vnfModelVersionId);
106                 logger.debug("Retrieved " + vnfWorkflows.size() + " workflows for given vnfModelVersionId.");
107                 if (vnfWorkflows.size() > 0) {
108                     workflows.addAll(vnfWorkflows);
109                 }
110             }
111
112             // 2. query workflow specifications for given pnfModelVersionId if need.
113             if (pnfModelVersionId != null) {
114                 List<Workflow> pnfWorkflows = queryWorkflowSpecificationsForPnf(pnfModelVersionId);
115                 logger.debug("Retrieved " + pnfWorkflows.size() + " workflows for given pnfModelVerionId.");
116                 if (pnfWorkflows.size() > 0) {
117                     workflows.addAll(pnfWorkflows);
118                 }
119             }
120         }
121
122         // Deduplication
123         List<Workflow> retWorkflows = workflows.stream()
124                 .collect(Collectors.collectingAndThen(
125                         Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Workflow::getArtifactUUID))),
126                         ArrayList::new));
127
128         WorkflowSpecifications workflowSpecifications = mapWorkflowsToWorkflowSpecifications(retWorkflows);
129
130         String jsonResponse;
131         try {
132             ObjectMapper mapper = new ObjectMapper();
133             jsonResponse = mapper.writeValueAsString(workflowSpecifications);
134         } catch (JsonProcessingException e) {
135             ErrorLoggerInfo errorLoggerInfo =
136                     new ErrorLoggerInfo.Builder(MessageEnum.APIH_REQUEST_VALIDATION_ERROR, ErrorCode.SchemaError)
137                             .build();
138             ValidateException validateException =
139                     new ValidateException.Builder("Mapping of request to JSON object failed : " + e.getMessage(),
140                             HttpStatus.SC_BAD_REQUEST, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
141                                     .errorInfo(errorLoggerInfo).build();
142             throw validateException;
143         }
144
145         return builder.buildResponse(HttpStatus.SC_OK, "", jsonResponse, apiVersion);
146     }
147
148     protected WorkflowSpecifications mapWorkflowsToWorkflowSpecifications(List<Workflow> workflows) {
149         if (workflows == null || workflows.isEmpty()) {
150             return null;
151         }
152         WorkflowSpecifications workflowSpecifications = new WorkflowSpecifications();
153         List<WorkflowSpecificationList> workflowSpecificationList = new ArrayList<>();
154
155         for (Workflow workflow : workflows) {
156             WorkflowSpecificationList workflowSpecificationListItem = new WorkflowSpecificationList();
157             WorkflowSpecification workflowSpecification = new WorkflowSpecification();
158             workflowSpecification.setArtifactInfo(buildArtifactInfo(workflow));
159             workflowSpecification.setActivitySequence(buildActivitySequence(workflow));
160             workflowSpecification.setWorkflowInputParameters(buildWorkflowInputParameters(workflow));
161             workflowSpecificationListItem.setWorkflowSpecification(workflowSpecification);
162             workflowSpecificationList.add(workflowSpecificationListItem);
163         }
164         workflowSpecifications.setWorkflowSpecificationList(workflowSpecificationList);
165         return workflowSpecifications;
166     }
167
168     private ArtifactInfo buildArtifactInfo(Workflow workflow) {
169         ArtifactInfo artifactInfo = new ArtifactInfo();
170         artifactInfo.setArtifactType(ARTIFACT_TYPE_WORKFLOW);
171         artifactInfo.setArtifactUuid(workflow.getArtifactUUID());
172         artifactInfo.setArtifactName(workflow.getArtifactName());
173         if (workflow.getVersion() != null) {
174             artifactInfo.setArtifactVersion(workflow.getVersion().toString());
175         }
176         artifactInfo.setArtifactDescription(workflow.getDescription());
177         artifactInfo.setWorkflowName(workflow.getName());
178         artifactInfo.setOperationName(workflow.getOperationName());
179         artifactInfo.setWorkflowSource(workflow.getSource());
180         artifactInfo.setWorkflowResourceTarget(workflow.getResourceTarget());
181         return artifactInfo;
182     }
183
184     private List<ActivitySequence> buildActivitySequence(Workflow workflow) {
185         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
186         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
187             return null;
188         }
189         List<ActivitySequence> activitySequences = new ArrayList<>();
190         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
191             if (workflowActivitySpecSequence != null) {
192                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
193                 if (activitySpec != null) {
194                     ActivitySequence activitySequence = new ActivitySequence();
195                     activitySequence.setName(activitySpec.getName());
196                     logger.debug("Adding activity: " + activitySpec.getName());
197                     activitySequence.setDescription(activitySpec.getDescription());
198                     activitySequences.add(activitySequence);
199                 }
200             }
201         }
202         return activitySequences;
203     }
204
205     private List<WorkflowInputParameter> buildWorkflowInputParameters(Workflow workflow) {
206         List<WorkflowActivitySpecSequence> workflowActivitySpecSequences = workflow.getWorkflowActivitySpecSequence();
207         if (workflowActivitySpecSequences == null || workflowActivitySpecSequences.isEmpty()) {
208             return new ArrayList<>();
209         }
210         Map<String, WorkflowInputParameter> workflowInputParameterMap = new HashMap<>();
211         for (WorkflowActivitySpecSequence workflowActivitySpecSequence : workflowActivitySpecSequences) {
212             if (workflowActivitySpecSequence != null) {
213                 ActivitySpec activitySpec = workflowActivitySpecSequence.getActivitySpec();
214                 if (activitySpec != null) {
215                     List<ActivitySpecUserParameters> activitySpecUserParameters =
216                             activitySpec.getActivitySpecUserParameters();
217                     if (activitySpecUserParameters != null && !activitySpecUserParameters.isEmpty()) {
218                         for (ActivitySpecUserParameters activitySpecUserParameter : activitySpecUserParameters) {
219                             UserParameters userParameter = activitySpecUserParameter.getUserParameters();
220                             if (userParameter != null) {
221                                 WorkflowInputParameter workflowInputParameter =
222                                         buildWorkflowInputParameter(userParameter);
223                                 workflowInputParameterMap.put(userParameter.getName(), workflowInputParameter);
224                             }
225                         }
226                     }
227                 }
228             }
229         }
230
231         if (workflowInputParameterMap.size() == 0) {
232             return new ArrayList<>();
233         }
234         List<WorkflowInputParameter> workflowInputParameterList =
235                 workflowInputParameterMap.values().stream().collect(Collectors.toList());
236         return workflowInputParameterList;
237     }
238
239     private WorkflowInputParameter buildWorkflowInputParameter(UserParameters userParameter) {
240         WorkflowInputParameter workflowInputParameter = new WorkflowInputParameter();
241         workflowInputParameter.setLabel(userParameter.getLabel());
242         workflowInputParameter.setInputType(userParameter.getType());
243         workflowInputParameter.setRequired(userParameter.getIsRequried());
244         workflowInputParameter.setSoFieldName(userParameter.getName());
245         workflowInputParameter.setSoPayloadLocation(userParameter.getPayloadLocation());
246         workflowInputParameter.setValidation(buildValidationList(userParameter));
247         return workflowInputParameter;
248     }
249
250     private List<Validation> buildValidationList(UserParameters userParameter) {
251         List<Validation> validationList = null;
252         if (userParameter.getMaxLength() != null || userParameter.getAllowableChars() != null) {
253             validationList = new ArrayList<>();
254             Validation validation = new Validation();
255             if (userParameter.getMaxLength() != null) {
256                 validation.setMaxLength(userParameter.getMaxLength().toString());
257             }
258             validation.setAllowableChars(userParameter.getAllowableChars());
259             validationList.add(validation);
260         }
261         return validationList;
262     }
263
264     private List<Workflow> queryWorkflowSpecificationsForAll() {
265         List<Workflow> workflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
266         return workflows;
267     }
268
269     private List<Workflow> queryWorkflowSpecificationsForVnf(String vnfModelVersionId) {
270         List<Workflow> workflows = catalogDbClient.findWorkflowByVnfModelUUID(vnfModelVersionId);
271
272         List<Workflow> nativeWorkflows = catalogDbClient.findWorkflowBySource(NATIVE_WORKFLOW);
273         if (!nativeWorkflows.isEmpty()) {
274             workflows.addAll(nativeWorkflows);
275         }
276         return workflows;
277     }
278
279     private List<Workflow> queryWorkflowSpecificationsForPnf(String pnfModelVersionId) {
280         List<Workflow> workflows = catalogDbClient.findWorkflowByPnfModelUUID(pnfModelVersionId);
281         return workflows;
282     }
283 }