2 * ============LICENSE_START=======================================================
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
13 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
23 package org.onap.so.asdc.installer.bpmn;
25 import java.util.ArrayList;
26 import java.util.List;
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;
52 public class WorkflowResource {
53 protected static final Logger logger = LoggerFactory.getLogger(WorkflowResource.class);
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";
61 protected WorkflowRepository workflowRepo;
64 protected ActivitySpecRepository activityRepo;
67 protected VnfResourceRepository vnfResourceRepo;
70 private BpmnInstaller bpmnInstaller;
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));
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);
91 logger.debug("Skipping installing - not the latest version: "
92 + artifactToInstall.getArtifactInfo().getArtifactName());
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);
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));
113 logger.debug("Successfully deployed to Camunda: {}", bpmnName);
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");
123 protected void installWorkflowResource(WorkflowArtifact artifact, String vfResourceModelUuid) throws Exception {
124 IArtifactInfo artifactInfo = artifact.getArtifactInfo();
126 Workflow workflow = new Workflow();
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()));
140 VnfResourceWorkflow vnfResourceWorkflow = new VnfResourceWorkflow();
141 vnfResourceWorkflow.setVnfResourceModelUUID(vfResourceModelUuid);
142 vnfResourceWorkflow.setWorkflow(workflow);
143 List<VnfResourceWorkflow> vnfResourceWorkflows = new ArrayList<>();
144 vnfResourceWorkflows.add(vnfResourceWorkflow);
146 workflow.setVnfResourceWorkflow(vnfResourceWorkflows);
148 List<String> activityNames = getActivityNameList(artifact.getResult());
149 List<WorkflowActivitySpecSequence> wfss = getWorkflowActivitySpecSequence(activityNames, workflow);
150 workflow.setWorkflowActivitySpecSequence(wfss);
152 workflowRepo.save(workflow);
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;
163 for (WorkflowArtifact artifactInMap : artifactsMapByUUID.values()) {
164 Double versionInMap = getWorkflowVersionFromArtifactName(artifactInMap.getArtifactInfo().getArtifactName());
165 if (versionInMap == null) {
168 if (workflowName.equals(getWorkflowNameFromArtifactName(artifactInMap.getArtifactInfo().getArtifactName()))
169 && Double.compare(workflowVersion, versionInMap) < 0) {
176 protected List<String> getActivityNameList(String bpmnContent) {
177 List<String> activityNameList = new ArrayList<>();
179 Pattern p = Pattern.compile(PATTERN);
180 Matcher m = p.matcher(bpmnContent);
182 activityNameList.add(m.group(1));
184 return activityNameList;
187 protected List<WorkflowActivitySpecSequence> getWorkflowActivitySpecSequence(List<String> activityNames,
188 Workflow workflow) throws Exception {
189 if (activityNames == null || activityNames.isEmpty()) {
192 List<WorkflowActivitySpecSequence> workflowActivitySpecs = new ArrayList<>();
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);
202 workflowActivitySpecs.add(workflowActivitySpec);
205 return workflowActivitySpecs;
208 public String getWorkflowNameFromArtifactName(String artifactName) {
209 if (artifactName == null) {
212 if (artifactName.contains(BPMN_SUFFIX)) {
213 return artifactName.substring(0, artifactName.lastIndexOf(BPMN_SUFFIX)).split("-")[0];
215 return artifactName.split("-")[0];
220 public Double getWorkflowVersionFromArtifactName(String artifactName) {
221 if (artifactName == null) {
224 String[] workflowNameParts = null;
225 if (artifactName.contains(BPMN_SUFFIX)) {
226 workflowNameParts = artifactName.substring(0, artifactName.lastIndexOf(BPMN_SUFFIX)).split("-");
228 workflowNameParts = artifactName.split("-");
230 if (workflowNameParts.length < 2) {
233 return Double.valueOf(workflowNameParts[1].replaceAll("_", "."));