2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.so.bpmn.infrastructure.scripts
23 import org.codehaus.jackson.map.ObjectMapper
24 import org.onap.so.bpmn.infrastructure.properties.BPMNProperties
26 import java.util.ArrayList
27 import java.util.Iterator
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.codehaus.groovy.runtime.ArrayUtil
34 import org.codehaus.groovy.runtime.ScriptBytecodeAdapter
35 import org.codehaus.groovy.runtime.callsite.CallSite
36 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation
37 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
38 import org.json.JSONArray
39 import org.json.JSONObject
40 import org.onap.so.bpmn.common.recipe.BpmnRestClient
41 import org.onap.so.bpmn.common.recipe.ResourceInput
42 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
43 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
44 import org.onap.so.bpmn.common.scripts.ExceptionUtil
45 import org.onap.so.bpmn.core.domain.AllottedResource
46 import org.onap.so.bpmn.core.domain.NetworkResource
47 import org.onap.so.bpmn.core.domain.Resource
48 import org.onap.so.bpmn.core.domain.ServiceDecomposition
49 import org.onap.so.bpmn.core.domain.VnfResource
50 import org.onap.so.bpmn.core.json.JsonUtils
51 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
52 import org.onap.so.logger.MessageEnum
53 import org.onap.so.logger.MsoLogger
58 * This groovy class supports the <class>DoCreateResources.bpmn</class> process.
61 * @param - msoRequestId
62 * @param - globalSubscriberId - O
63 * @param - subscriptionServiceType - O
64 * @param - serviceInstanceId
65 * @param - serviceInstanceName - O
66 * @param - serviceInputParams (should contain aic_zone for serviceTypes TRANSPORT,ATM)
67 * @param - sdncVersion
69 * @param - addResourceList
72 * @param - WorkflowException
75 public class DoCreateResources extends AbstractServiceTaskProcessor{
76 private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoCreateResources.class);
78 ExceptionUtil exceptionUtil = new ExceptionUtil()
79 JsonUtils jsonUtil = new JsonUtils()
80 CatalogDbUtils cutils = new CatalogDbUtils()
82 public void preProcessRequest(DelegateExecution execution)
84 msoLogger.trace("preProcessRequest ")
87 List addResourceList = execution.getVariable("addResourceList")
88 if (addResourceList == null)
90 msg = "Input addResourceList is null"
92 exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
94 else if (addResourceList.size() == 0)
96 msg = "No resource in addResourceList"
99 msoLogger.trace("Exit preProcessRequest ")
102 public void sequenceResoure(DelegateExecution execution)
104 msoLogger.trace("Start sequenceResoure Process ")
106 String serviceModelUUID = execution.getVariable("modelUuid")
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")
116 def resourceSequence = BPMNProperties.getResourceSequenceProp(serviceModelName)
118 if(resourceSequence != null) {
119 // sequence is defined in config file
120 for (resourceType in resourceSequence) {
121 for (resource in addResourceList) {
122 if (StringUtils.containsIgnoreCase(resource.getModelInfo().getModelName(), resourceType)) {
123 sequencedResourceList.add(resource)
125 if (resource instanceof NetworkResource) {
126 networkResourceList.add(resource)
133 //define sequenced resource list, we deploy vf first and then network and then ar
134 //this is defaule sequence
135 List<VnfResource> vnfResourceList = new ArrayList<VnfResource>()
136 List<AllottedResource> arResourceList = new ArrayList<AllottedResource>()
138 for (Resource rc : addResourceList){
139 if (rc instanceof VnfResource) {
140 vnfResourceList.add(rc)
141 } else if (rc instanceof NetworkResource) {
142 networkResourceList.add(rc)
143 } else if (rc instanceof AllottedResource) {
144 arResourceList.add(rc)
147 sequencedResourceList.addAll(vnfResourceList)
148 sequencedResourceList.addAll(networkResourceList)
149 sequencedResourceList.addAll(arResourceList)
152 String isContainsWanResource = networkResourceList.isEmpty() ? "false" : "true"
153 execution.setVariable("isContainsWanResource", isContainsWanResource)
154 execution.setVariable("currentResourceIndex", 0)
155 execution.setVariable("sequencedResourceList", sequencedResourceList)
156 msoLogger.info("sequencedResourceList: " + sequencedResourceList)
157 msoLogger.trace("COMPLETED sequenceResoure Process ")
160 public prepareServiceTopologyRequest(DelegateExecution execution) {
162 def isDebugEnabled = execution.getVariable("isDebugLogEnabled")
163 utils.log("INFO", "======== Start prepareServiceTopologyRequest Process ======== ", isDebugEnabled)
165 String serviceDecompose = execution.getVariable("serviceDecomposition")
167 execution.setVariable("operationType", "create")
168 execution.setVariable("resourceType", "")
170 String serviceInvariantUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelInvariantUuid")
171 String serviceUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelUuid")
172 String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
174 execution.setVariable("modelInvariantUuid", serviceInvariantUuid)
175 execution.setVariable("modelUuid", serviceUuid)
176 execution.setVariable("serviceModelName", serviceModelName)
178 utils.log("INFO", "======== End prepareServiceTopologyRequest Process ======== ", isDebugEnabled)
181 public void getCurrentResoure(DelegateExecution execution){
182 msoLogger.trace("Start getCurrentResoure Process ")
183 def currentIndex = execution.getVariable("currentResourceIndex")
184 List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
185 Resource currentResource = sequencedResourceList.get(currentIndex)
186 execution.setVariable("resourceType", currentResource.getModelInfo().getModelName())
187 msoLogger.info("Now we deal with resouce:" + currentResource.getModelInfo().getModelName())
188 msoLogger.trace("COMPLETED getCurrentResoure Process ")
191 public void parseNextResource(DelegateExecution execution){
192 msoLogger.trace("Start parseNextResource Process ")
193 def currentIndex = execution.getVariable("currentResourceIndex")
194 def nextIndex = currentIndex + 1
195 execution.setVariable("currentResourceIndex", nextIndex)
196 List<String> sequencedResourceList = execution.getVariable("sequencedResourceList")
197 if(nextIndex >= sequencedResourceList.size()){
198 execution.setVariable("allResourceFinished", "true")
200 execution.setVariable("allResourceFinished", "false")
202 msoLogger.trace("COMPLETED parseNextResource Process ")
205 public void prepareResourceRecipeRequest(DelegateExecution execution){
206 msoLogger.trace("Start prepareResourceRecipeRequest Process ")
207 ResourceInput resourceInput = new ResourceInput()
208 String serviceInstanceName = execution.getVariable("serviceInstanceName")
209 String resourceType = execution.getVariable("resourceType")
210 String resourceInstanceName = resourceType + "_" + serviceInstanceName
211 resourceInput.setResourceInstanceName(resourceInstanceName)
212 msoLogger.info("Prepare Resource Request resourceInstanceName:" + resourceInstanceName)
213 String globalSubscriberId = execution.getVariable("globalSubscriberId")
214 String serviceType = execution.getVariable("serviceType")
215 String serviceInstanceId = execution.getVariable("serviceInstanceId")
216 String operationId = execution.getVariable("operationId")
217 String operationType = "createInstance"
218 resourceInput.setGlobalSubscriberId(globalSubscriberId)
219 resourceInput.setServiceType(serviceType)
220 resourceInput.setServiceInstanceId(serviceInstanceId)
221 resourceInput.setOperationId(operationId)
222 resourceInput.setOperationType(operationType);
223 def currentIndex = execution.getVariable("currentResourceIndex")
224 List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
225 Resource currentResource = sequencedResourceList.get(currentIndex)
226 resourceInput.setResourceModelInfo(currentResource.getModelInfo());
227 ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
228 resourceInput.setServiceModelInfo(serviceDecomposition.getModelInfo());
230 String incomingRequest = execution.getVariable("uuiRequest")
231 //set the requestInputs from tempalte To Be Done
232 String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
233 String serviceParameters = jsonUtil.getJsonValue(incomingRequest, "service.parameters")
234 String resourceParameters = ResourceRequestBuilder.buildResourceRequestParameters(execution, serviceModelUuid, resourceCustomizationUuid, serviceParameters)
235 resourceInput.setResourceParameters(resourceParameters)
236 execution.setVariable("resourceInput", resourceInput)
237 msoLogger.trace("COMPLETED prepareResourceRecipeRequest Process ")
240 public void executeResourceRecipe(DelegateExecution execution){
241 msoLogger.trace("Start executeResourceRecipe Process ")
244 String requestId = execution.getVariable("msoRequestId")
245 String serviceInstanceId = execution.getVariable("serviceInstanceId")
246 String serviceType = execution.getVariable("serviceType")
247 ResourceInput resourceInput = execution.getVariable("resourceInput")
249 // requestAction is action, not opertiontype
250 //String requestAction = resourceInput.getOperationType()
251 String requestAction = "createInstance"
252 JSONObject resourceRecipe = cutils.getResourceRecipe(execution, resourceInput.getResourceModelInfo().getModelUuid(), requestAction)
254 if (resourceRecipe != null) {
255 String recipeURL = BPMNProperties.getProperty("bpelURL", "http://mso:8080") + resourceRecipe.getString("orchestrationUri")
256 int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
257 String recipeParamXsd = resourceRecipe.get("paramXSD")
258 HttpResponse resp = BpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput.toString(), recipeParamXsd)
260 String exceptionMessage = "Resource receipe is not found for resource modeluuid: " +
261 resourceInput.getResourceModelInfo().getModelUuid()
262 utils.log("ERROR", exceptionMessage, isDebugEnabled)
263 exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
266 msoLogger.trace("======== end executeResourceRecipe Process ======== ")
268 msoLogger.debug("Rethrowing MSOWorkflowException")
271 msoLogger.debug("Error occured within DoCreateResources executeResourceRecipe method: " + e)
272 exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured during DoCreateResources executeResourceRecipe Catalog")
276 public void postConfigRequest(DelegateExecution execution){