[SO] Release so 1.13.0 image
[so.git] / asdc-controller / src / main / java / org / onap / so / asdc / installer / bpmn / WorkflowResource.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 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
23 package org.onap.so.asdc.installer.bpmn;
24
25 import java.util.ArrayList;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.regex.Matcher;
29 import java.util.regex.Pattern;
30 import org.onap.so.logger.LoggingAnchor;
31 import org.apache.http.HttpResponse;
32 import org.onap.sdc.api.notification.IArtifactInfo;
33 import org.onap.so.asdc.installer.VfResourceStructure;
34 import org.onap.so.asdc.installer.WorkflowArtifact;
35 import org.onap.so.db.catalog.beans.ActivitySpec;
36 import org.onap.so.db.catalog.beans.VnfResource;
37 import org.onap.so.db.catalog.beans.VnfResourceWorkflow;
38 import org.onap.so.db.catalog.beans.Workflow;
39 import org.onap.so.db.catalog.beans.WorkflowActivitySpecSequence;
40 import org.onap.so.db.catalog.data.repository.ActivitySpecRepository;
41 import org.onap.so.db.catalog.data.repository.VnfResourceRepository;
42 import org.onap.so.db.catalog.data.repository.WorkflowRepository;
43 import org.onap.logging.filter.base.ErrorCode;
44 import org.onap.so.logger.MessageEnum;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47 import org.springframework.beans.factory.annotation.Autowired;
48 import org.springframework.http.HttpStatus;
49 import org.springframework.stereotype.Component;
50
51 @Component
52 public class WorkflowResource {
53     protected static final Logger logger = LoggerFactory.getLogger(WorkflowResource.class);
54
55     private static final String PATTERN = ".*\\\"activity:(.*)\\\" .*";
56     private static final String TARGET_RESOURCE_VNF = "vnf";
57     private static final String SOURCE_SDC = "sdc";
58     private static final String BPMN_SUFFIX = ".bpmn";
59
60     @Autowired
61     protected WorkflowRepository workflowRepo;
62
63     @Autowired
64     protected ActivitySpecRepository activityRepo;
65
66     @Autowired
67     protected VnfResourceRepository vnfResourceRepo;
68
69     @Autowired
70     private BpmnInstaller bpmnInstaller;
71
72     public void processWorkflows(VfResourceStructure vfResourceStructure) throws Exception {
73         Map<String, WorkflowArtifact> artifactsMapByUUID = vfResourceStructure.getWorkflowArtifactsMapByUUID();
74         if (artifactsMapByUUID != null && !artifactsMapByUUID.isEmpty()) {
75             String vfResourceModelUuid = vfResourceStructure.getResourceInstance().getResourceUUID();
76             VnfResource vnfResource = vnfResourceRepo.findResourceByModelUUID(vfResourceModelUuid);
77             if (vnfResource == null) {
78                 logger.debug("Failed deploying BPMN for vfResourceModelUUID {}", vfResourceModelUuid);
79                 logger.error("{} {} {} {} {} {}", MessageEnum.ASDC_ARTIFACT_NOT_DEPLOYED_DETAIL.toString(),
80                         vfResourceModelUuid, vfResourceModelUuid, HttpStatus.NOT_FOUND, ErrorCode.DataError.getValue(),
81                         "ASDC BPMN deploy failed");
82                 throw (new Exception("VF Resource not present in Catalog DB: " + vfResourceModelUuid));
83             }
84             for (String uuid : artifactsMapByUUID.keySet()) {
85                 WorkflowArtifact artifactToInstall = artifactsMapByUUID.get(uuid);
86                 if (isLatestVersionAvailable(artifactsMapByUUID, artifactToInstall)) {
87                     logger.debug("Installing the BPMN: " + artifactToInstall.getArtifactInfo().getArtifactName());
88                     deployWorkflowResourceToCamunda(artifactToInstall);
89                     installWorkflowResource(artifactToInstall, vfResourceModelUuid);
90                 } else {
91                     logger.debug("Skipping installing - not the latest version: "
92                             + artifactToInstall.getArtifactInfo().getArtifactName());
93                 }
94             }
95         }
96     }
97
98     protected void deployWorkflowResourceToCamunda(WorkflowArtifact artifact) throws Exception {
99         String bpmnName = artifact.getArtifactInfo().getArtifactName();
100         String version = artifact.getArtifactInfo().getArtifactVersion();
101         logger.debug("BPMN Name: " + bpmnName);
102         try {
103             HttpResponse response = bpmnInstaller.sendDeploymentRequest(bpmnName, version);
104             logger.debug("Response status line: {}", response.getStatusLine());
105             logger.debug("Response entity: {}", response.getEntity().toString());
106             if (response.getStatusLine().getStatusCode() != 200) {
107                 logger.debug("Failed deploying BPMN {}", bpmnName);
108                 logger.error(LoggingAnchor.SIX, MessageEnum.ASDC_ARTIFACT_NOT_DEPLOYED_DETAIL.toString(), bpmnName,
109                         bpmnName, Integer.toString(response.getStatusLine().getStatusCode()),
110                         ErrorCode.DataError.getValue(), "ASDC BPMN deploy failed");
111                 throw (new Exception("Error from Camunda on deploying the BPMN: " + bpmnName));
112             } else {
113                 logger.debug("Successfully deployed to Camunda: {}", bpmnName);
114             }
115         } catch (Exception e) {
116             logger.debug("Exception :", e);
117             logger.error(LoggingAnchor.FIVE, MessageEnum.ASDC_ARTIFACT_NOT_DEPLOYED_DETAIL.toString(), bpmnName,
118                     e.getMessage(), ErrorCode.DataError.getValue(), "ASDC BPMN deploy failed");
119             throw e;
120         }
121     }
122
123     protected void installWorkflowResource(WorkflowArtifact artifact, String vfResourceModelUuid) throws Exception {
124         IArtifactInfo artifactInfo = artifact.getArtifactInfo();
125
126         Workflow workflow = new Workflow();
127
128         workflow.setArtifactChecksum(artifactInfo.getArtifactChecksum());
129         workflow.setArtifactName(artifactInfo.getArtifactName());
130         workflow.setArtifactUUID(artifactInfo.getArtifactUUID());
131         workflow.setBody(artifact.getResult());
132         workflow.setDescription(artifactInfo.getArtifactDescription());
133         workflow.setName(getWorkflowNameFromArtifactName(artifactInfo.getArtifactName()));
134         workflow.setResourceTarget(TARGET_RESOURCE_VNF);
135         workflow.setSource(SOURCE_SDC);
136         workflow.setTimeoutMinutes(artifactInfo.getArtifactTimeout());
137         workflow.setOperationName(getWorkflowNameFromArtifactName(artifactInfo.getArtifactName()));
138         workflow.setVersion(getWorkflowVersionFromArtifactName(artifactInfo.getArtifactName()));
139
140         VnfResourceWorkflow vnfResourceWorkflow = new VnfResourceWorkflow();
141         vnfResourceWorkflow.setVnfResourceModelUUID(vfResourceModelUuid);
142         vnfResourceWorkflow.setWorkflow(workflow);
143         List<VnfResourceWorkflow> vnfResourceWorkflows = new ArrayList<>();
144         vnfResourceWorkflows.add(vnfResourceWorkflow);
145
146         workflow.setVnfResourceWorkflow(vnfResourceWorkflows);
147
148         List<String> activityNames = getActivityNameList(artifact.getResult());
149         List<WorkflowActivitySpecSequence> wfss = getWorkflowActivitySpecSequence(activityNames, workflow);
150         workflow.setWorkflowActivitySpecSequence(wfss);
151
152         workflowRepo.save(workflow);
153
154     }
155
156     protected boolean isLatestVersionAvailable(Map<String, WorkflowArtifact> artifactsMapByUUID,
157             WorkflowArtifact artifact) {
158         String workflowName = getWorkflowNameFromArtifactName(artifact.getArtifactInfo().getArtifactName());
159         Double workflowVersion = getWorkflowVersionFromArtifactName(artifact.getArtifactInfo().getArtifactName());
160         if (workflowVersion == null) {
161             workflowVersion = 0.0;
162         }
163         for (WorkflowArtifact artifactInMap : artifactsMapByUUID.values()) {
164             Double versionInMap = getWorkflowVersionFromArtifactName(artifactInMap.getArtifactInfo().getArtifactName());
165             if (versionInMap == null) {
166                 versionInMap = 0.0;
167             }
168             if (workflowName.equals(getWorkflowNameFromArtifactName(artifactInMap.getArtifactInfo().getArtifactName()))
169                     && Double.compare(workflowVersion, versionInMap) < 0) {
170                 return false;
171             }
172         }
173         return true;
174     }
175
176     protected List<String> getActivityNameList(String bpmnContent) {
177         List<String> activityNameList = new ArrayList<>();
178
179         Pattern p = Pattern.compile(PATTERN);
180         Matcher m = p.matcher(bpmnContent);
181         while (m.find()) {
182             activityNameList.add(m.group(1));
183         }
184         return activityNameList;
185     }
186
187     protected List<WorkflowActivitySpecSequence> getWorkflowActivitySpecSequence(List<String> activityNames,
188             Workflow workflow) throws Exception {
189         if (activityNames == null || activityNames.isEmpty()) {
190             return null;
191         }
192         List<WorkflowActivitySpecSequence> workflowActivitySpecs = new ArrayList<>();
193         int seqNo = 1;
194         for (String activityName : activityNames) {
195             ActivitySpec activitySpec = activityRepo.findByName(activityName);
196             if (activitySpec != null) {
197                 WorkflowActivitySpecSequence workflowActivitySpec = new WorkflowActivitySpecSequence();
198                 workflowActivitySpec.setActivitySpec(activitySpec);
199                 workflowActivitySpec.setWorkflow(workflow);
200                 workflowActivitySpec.setSeqNo(seqNo);
201                 seqNo++;
202                 workflowActivitySpecs.add(workflowActivitySpec);
203             }
204         }
205         return workflowActivitySpecs;
206     }
207
208     public String getWorkflowNameFromArtifactName(String artifactName) {
209         if (artifactName == null) {
210             return null;
211         } else {
212             if (artifactName.contains(BPMN_SUFFIX)) {
213                 return artifactName.substring(0, artifactName.lastIndexOf(BPMN_SUFFIX)).split("-")[0];
214             } else {
215                 return artifactName.split("-")[0];
216             }
217         }
218     }
219
220     public Double getWorkflowVersionFromArtifactName(String artifactName) {
221         if (artifactName == null) {
222             return null;
223         } else {
224             String[] workflowNameParts = null;
225             if (artifactName.contains(BPMN_SUFFIX)) {
226                 workflowNameParts = artifactName.substring(0, artifactName.lastIndexOf(BPMN_SUFFIX)).split("-");
227             } else {
228                 workflowNameParts = artifactName.split("-");
229             }
230             if (workflowNameParts.length < 2) {
231                 return null;
232             } else {
233                 return Double.valueOf(workflowNameParts[1].replaceAll("_", "."));
234             }
235         }
236     }
237 }