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