2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018 Huawei Technologies Co., Ltd. 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.bpmn.infrastructure.scripts
25 import org.onap.so.bpmn.common.resource.InstanceResourceList
26 import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
27 import org.onap.so.bpmn.core.domain.GroupResource
28 import org.onap.so.bpmn.infrastructure.properties.BPMNProperties
29 import org.apache.commons.lang3.StringUtils
30 import org.apache.http.HttpResponse
31 import org.camunda.bpm.engine.delegate.BpmnError
32 import org.camunda.bpm.engine.delegate.DelegateExecution
33 import org.json.JSONObject
34 import org.onap.so.bpmn.common.recipe.BpmnRestClient
35 import org.onap.so.bpmn.common.recipe.ResourceInput
36 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
37 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
39 import org.onap.so.bpmn.core.domain.AllottedResource
40 import org.onap.so.bpmn.core.domain.NetworkResource
41 import org.onap.so.bpmn.core.domain.Resource
42 import org.onap.so.bpmn.core.domain.ServiceDecomposition
43 import org.onap.so.bpmn.core.domain.VnfResource
44 import org.onap.so.bpmn.core.json.JsonUtils
45 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
46 import org.slf4j.Logger
47 import org.slf4j.LoggerFactory
52 * This groovy class supports the <class>DoCreateResources.bpmn</class> process.
55 * @param - msoRequestId
56 * @param - globalSubscriberId - O
57 * @param - subscriptionServiceType - O
58 * @param - serviceInstanceId
59 * @param - serviceInstanceName - O
60 * @param - serviceInputParams (should contain aic_zone for serviceTypes TRANSPORT,ATM)
61 * @param - sdncVersion
63 * @param - addResourceList
66 * @param - WorkflowException
68 public class DoCreateResources extends AbstractServiceTaskProcessor{
69 private static final Logger logger = LoggerFactory.getLogger( DoCreateResources.class);
71 ExceptionUtil exceptionUtil = new ExceptionUtil()
72 JsonUtils jsonUtil = new JsonUtils()
73 CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
75 public void preProcessRequest(DelegateExecution execution) {
76 logger.trace("preProcessRequest ")
79 List addResourceList = execution.getVariable("addResourceList")
80 if (addResourceList == null) {
81 msg = "Input addResourceList is null"
83 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
85 else if (addResourceList.size() == 0) {
86 msg = "No resource in addResourceList"
89 logger.trace("Exit preProcessRequest ")
92 // this method will convert resource list to instance_resource_list
93 void prepareInstanceResourceList(DelegateExecution execution) {
95 String uuiRequest = execution.getVariable("uuiRequest")
96 List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
97 List<Resource> instanceResourceList = InstanceResourceList.getInstanceResourceList(sequencedResourceList, uuiRequest)
99 execution.setVariable("instanceResourceList", instanceResourceList)
102 public void sequenceResoure(DelegateExecution execution) {
103 logger.trace("Start sequenceResoure Process ")
105 String incomingRequest = execution.getVariable("uuiRequest")
106 String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
108 List<Resource> addResourceList = execution.getVariable("addResourceList")
110 List<NetworkResource> networkResourceList = new ArrayList<NetworkResource>()
112 List<Resource> sequencedResourceList = new ArrayList<Resource>()
114 String serviceDecompose = execution.getVariable("serviceDecomposition")
115 String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
117 // get Sequence from properties
118 def resourceSequence = BPMNProperties.getResourceSequenceProp(serviceModelName)
120 // get Sequence from csar(model)
121 if(resourceSequence == null) {
122 resourceSequence = ResourceRequestBuilder.getResourceSequence(serviceModelUuid)
123 logger.info("Get Sequence from csar : " + resourceSequence)
126 if(resourceSequence != null) {
127 for (resourceType in resourceSequence) {
128 for (resource in addResourceList) {
129 if (StringUtils.containsIgnoreCase(resource.getModelInfo().getModelName(), resourceType)) {
130 sequencedResourceList.add(resource)
132 // if resource type is vnfResource then check for groups also
133 // Did not use continue because if same model type is used twice
134 // then we would like to add it twice for processing
135 // e.g. S{ V1{G1, G2, G1}} --> S{ V1{G1, G1, G2}}
136 if (resource instanceof VnfResource) {
137 if (resource.getGroups() != null) {
138 String[] grpSequence = resource.getGroupOrder().split(",")
139 for (String grpType in grpSequence) {
140 for (GroupResource gResource in resource.getGroups()) {
141 if (StringUtils.containsIgnoreCase(gResource.getModelInfo().getModelName(), grpType)) {
142 sequencedResourceList.add(gResource)
148 if (resource instanceof NetworkResource) {
149 networkResourceList.add(resource)
156 //define sequenced resource list, we deploy vf first and then network and then ar
157 //this is default sequence
158 List<VnfResource> vnfResourceList = new ArrayList<VnfResource>()
159 List<AllottedResource> arResourceList = new ArrayList<AllottedResource>()
161 for (Resource rc : addResourceList){
162 if (rc instanceof VnfResource) {
163 vnfResourceList.add(rc)
164 } else if (rc instanceof NetworkResource) {
165 networkResourceList.add(rc)
166 } else if (rc instanceof AllottedResource) {
167 arResourceList.add(rc)
170 sequencedResourceList.addAll(vnfResourceList)
171 sequencedResourceList.addAll(networkResourceList)
172 sequencedResourceList.addAll(arResourceList)
175 String isContainsWanResource = networkResourceList.isEmpty() ? "false" : "true"
176 //if no networkResource, get SDNC config from properties file
177 if( "false".equals(isContainsWanResource)) {
178 String serviceNeedSDNC = "mso.workflow.custom." + serviceModelName + ".sdnc.need";
179 isContainsWanResource = BPMNProperties.getProperty(serviceNeedSDNC, isContainsWanResource)
182 execution.setVariable("isContainsWanResource", isContainsWanResource)
183 execution.setVariable("currentResourceIndex", 0)
184 execution.setVariable("sequencedResourceList", sequencedResourceList)
185 logger.info("sequencedResourceList: " + sequencedResourceList)
186 logger.trace("COMPLETED sequenceResoure Process ")
189 public prepareServiceTopologyRequest(DelegateExecution execution) {
191 logger.trace("======== Start prepareServiceTopologyRequest Process ======== ")
193 String serviceDecompose = execution.getVariable("serviceDecomposition")
195 execution.setVariable("operationType", "create")
196 execution.setVariable("resourceType", "")
198 String serviceInvariantUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelInvariantUuid")
199 String serviceUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelUuid")
200 String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
202 execution.setVariable("modelInvariantUuid", serviceInvariantUuid)
203 execution.setVariable("modelUuid", serviceUuid)
204 execution.setVariable("serviceModelName", serviceModelName)
206 logger.trace("======== End prepareServiceTopologyRequest Process ======== ")
209 public void getCurrentResoure(DelegateExecution execution){
210 logger.trace("Start getCurrentResoure Process ")
211 def currentIndex = execution.getVariable("currentResourceIndex")
212 List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
213 Resource currentResource = sequencedResourceList.get(currentIndex)
214 execution.setVariable("resourceType", currentResource.getModelInfo().getModelName())
215 logger.info("Now we deal with resouce:" + currentResource.getModelInfo().getModelName())
216 logger.trace("COMPLETED getCurrentResoure Process ")
219 public void parseNextResource(DelegateExecution execution){
220 logger.trace("Start parseNextResource Process ")
221 def currentIndex = execution.getVariable("currentResourceIndex")
222 def nextIndex = currentIndex + 1
223 execution.setVariable("currentResourceIndex", nextIndex)
224 List<String> sequencedResourceList = execution.getVariable("sequencedResourceList")
225 if(nextIndex >= sequencedResourceList.size()){
226 execution.setVariable("allResourceFinished", "true")
228 execution.setVariable("allResourceFinished", "false")
230 logger.trace("COMPLETED parseNextResource Process ")
233 public void prepareResourceRecipeRequest(DelegateExecution execution){
234 logger.trace("Start prepareResourceRecipeRequest Process ")
235 ResourceInput resourceInput = new ResourceInput()
236 String serviceInstanceName = execution.getVariable("serviceInstanceName")
237 String resourceType = execution.getVariable("resourceType")
238 String resourceInstanceName = resourceType + "_" + serviceInstanceName
239 resourceInput.setResourceInstanceName(resourceInstanceName)
240 logger.info("Prepare Resource Request resourceInstanceName:" + resourceInstanceName)
241 String globalSubscriberId = execution.getVariable("globalSubscriberId")
242 String serviceType = execution.getVariable("serviceType")
243 String serviceInstanceId = execution.getVariable("serviceInstanceId")
244 String operationId = execution.getVariable("operationId")
245 String operationType = "createInstance"
246 resourceInput.setGlobalSubscriberId(globalSubscriberId)
247 resourceInput.setServiceType(serviceType)
248 resourceInput.setServiceInstanceId(serviceInstanceId)
249 resourceInput.setOperationId(operationId)
250 resourceInput.setOperationType(operationType);
251 def currentIndex = execution.getVariable("currentResourceIndex")
252 List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
253 Resource currentResource = sequencedResourceList.get(currentIndex)
254 resourceInput.setResourceModelInfo(currentResource.getModelInfo());
255 ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
256 resourceInput.setServiceModelInfo(serviceDecomposition.getModelInfo());
257 def String resourceCustomizationUuid = currentResource.getModelInfo().getModelCustomizationUuid();
259 String incomingRequest = execution.getVariable("uuiRequest")
260 //set the requestInputs from tempalte To Be Done
261 String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
262 String serviceParameters = jsonUtil.getJsonValue(incomingRequest, "service.parameters")
263 Map<String, Object> currentVFData = (Map) execution.getVariable("currentVFData");
264 if (null == currentVFData) {
265 currentVFData = new HashMap<>();
267 String resourceParameters = ResourceRequestBuilder.buildResourceRequestParameters(execution, serviceModelUuid, resourceCustomizationUuid, serviceParameters, currentVFData)
268 resourceInput.setResourceParameters(resourceParameters)
269 resourceInput.setRequestsInputs(incomingRequest)
270 execution.setVariable("resourceInput", resourceInput.toString())
271 execution.setVariable("resourceModelUUID", resourceInput.getResourceModelInfo().getModelUuid())
272 execution.setVariable("currentVFData",currentVFData);
273 logger.trace("COMPLETED prepareResourceRecipeRequest Process ")
276 public void executeResourceRecipe(DelegateExecution execution){
277 logger.trace("Start executeResourceRecipe Process ")
280 String requestId = execution.getVariable("msoRequestId")
281 String serviceInstanceId = execution.getVariable("serviceInstanceId")
282 String serviceType = execution.getVariable("serviceType")
283 String resourceInput = execution.getVariable("resourceInput")
284 String resourceModelUUID = execution.getVariable("resourceModelUUID")
286 // requestAction is action, not opertiontype
287 //String requestAction = resourceInput.getOperationType()
288 String requestAction = "createInstance"
289 JSONObject resourceRecipe = catalogDbUtils.getResourceRecipe(execution, resourceModelUUID, requestAction)
291 if (resourceRecipe != null) {
292 String recipeURL = BPMNProperties.getProperty("bpelURL", "http://so-bpmn-infra.onap:8081") + resourceRecipe.getString("orchestrationUri")
293 int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
294 String recipeParamXsd = resourceRecipe.get("paramXSD")
296 BpmnRestClient bpmnRestClient = new BpmnRestClient()
297 HttpResponse resp = bpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput, recipeParamXsd)
299 String exceptionMessage = "Resource receipe is not found for resource modeluuid: " + resourceModelUUID
300 logger.trace(exceptionMessage)
301 exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
304 logger.trace("======== end executeResourceRecipe Process ======== ")
306 logger.debug("Rethrowing MSOWorkflowException")
309 logger.debug("Error occured within DoCreateResources executeResourceRecipe method: " + e)
310 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured during DoCreateResources executeResourceRecipe Catalog")
314 public void postConfigRequest(DelegateExecution execution){