Merge 'origin/casablanca' into master
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoCreateResources.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts
22
23 import org.onap.so.bpmn.common.scripts.CatalogDbUtilsFactory
24 import org.onap.so.bpmn.infrastructure.properties.BPMNProperties
25 import org.apache.commons.lang3.StringUtils
26 import org.apache.http.HttpResponse
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONObject
30 import org.onap.so.bpmn.common.recipe.BpmnRestClient
31 import org.onap.so.bpmn.common.recipe.ResourceInput
32 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
33 import org.onap.so.bpmn.common.scripts.CatalogDbUtils
34 import org.onap.so.bpmn.common.scripts.ExceptionUtil
35 import org.onap.so.bpmn.core.domain.AllottedResource
36 import org.onap.so.bpmn.core.domain.NetworkResource
37 import org.onap.so.bpmn.core.domain.Resource
38 import org.onap.so.bpmn.core.domain.ServiceDecomposition
39 import org.onap.so.bpmn.core.domain.VnfResource
40 import org.onap.so.bpmn.core.json.JsonUtils
41 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
42 import org.onap.so.logger.MsoLogger
43
44
45
46 /**
47  * This groovy class supports the <class>DoCreateResources.bpmn</class> process.
48  * 
49  * Inputs:
50  * @param - msoRequestId
51  * @param - globalSubscriberId - O
52  * @param - subscriptionServiceType - O
53  * @param - serviceInstanceId
54  * @param - serviceInstanceName - O
55  * @param - serviceInputParams (should contain aic_zone for serviceTypes TRANSPORT,ATM)
56  * @param - sdncVersion 
57  *
58  * @param - addResourceList
59  *
60  * Outputs:
61  * @param - WorkflowException
62  */
63 public class DoCreateResources extends AbstractServiceTaskProcessor{
64     private static final MsoLogger msoLogger = MsoLogger.getMsoLogger(MsoLogger.Catalog.BPEL, DoCreateResources.class);
65
66     ExceptionUtil exceptionUtil = new ExceptionUtil()
67     JsonUtils jsonUtil = new JsonUtils()
68     CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
69
70     public void preProcessRequest(DelegateExecution execution) {
71         msoLogger.trace("preProcessRequest ")
72         String msg = ""
73
74         List addResourceList = execution.getVariable("addResourceList")
75         if (addResourceList == null) {
76             msg = "Input addResourceList is null"
77             msoLogger.info(msg)
78             exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
79         }
80         else if (addResourceList.size() == 0) {
81             msg = "No resource in addResourceList"
82             msoLogger.info(msg)
83         }
84         msoLogger.trace("Exit preProcessRequest ")
85     }
86
87     public void sequenceResoure(DelegateExecution execution) {
88         msoLogger.trace("Start sequenceResoure Process ")
89         
90         String incomingRequest = execution.getVariable("uuiRequest")
91         String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
92
93         List<Resource> addResourceList = execution.getVariable("addResourceList")
94
95         List<NetworkResource> networkResourceList = new ArrayList<NetworkResource>()
96
97         List<Resource> sequencedResourceList = new ArrayList<Resource>()
98
99         String serviceDecompose = execution.getVariable("serviceDecomposition")
100         String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
101
102         // get Sequence from properties        
103         def resourceSequence = BPMNProperties.getResourceSequenceProp(serviceModelName)
104
105         // get Sequence from csar(model)  
106         if(resourceSequence == null) {
107             resourceSequence = ResourceRequestBuilder.getResourceSequence(serviceModelUuid)
108             msoLogger.info("Get Sequence from csar : " + resourceSequence)
109         }
110
111         if(resourceSequence != null) {
112             for (resourceType in resourceSequence) {
113                 for (resource in addResourceList) {
114                     if (StringUtils.containsIgnoreCase(resource.getModelInfo().getModelName(), resourceType)) {
115                         sequencedResourceList.add(resource)
116
117                         if (resource instanceof NetworkResource) {
118                             networkResourceList.add(resource)
119                         }
120                     }
121                 }
122             }
123         } else {
124
125             //define sequenced resource list, we deploy vf first and then network and then ar
126             //this is defaule sequence
127             List<VnfResource> vnfResourceList = new ArrayList<VnfResource>()
128             List<AllottedResource> arResourceList = new ArrayList<AllottedResource>()
129
130             for (Resource rc : addResourceList){
131                 if (rc instanceof VnfResource) {
132                     vnfResourceList.add(rc)
133                 } else if (rc instanceof NetworkResource) {
134                     networkResourceList.add(rc)
135                 } else if (rc instanceof AllottedResource) {
136                     arResourceList.add(rc)
137                 }
138             }
139             sequencedResourceList.addAll(vnfResourceList)
140             sequencedResourceList.addAll(networkResourceList)
141             sequencedResourceList.addAll(arResourceList)
142         }
143
144         String isContainsWanResource = networkResourceList.isEmpty() ? "false" : "true"
145         //if no networkResource, get SDNC config from properties file
146         if( "false".equals(isContainsWanResource)) {
147             String serviceNeedSDNC = "mso.workflow.custom." + serviceModelName + ".sdnc.need";
148             isContainsWanResource = BPMNProperties.getProperty(serviceNeedSDNC, isContainsWanResource)
149         }
150
151         execution.setVariable("isContainsWanResource", isContainsWanResource)
152         execution.setVariable("currentResourceIndex", 0)
153         execution.setVariable("sequencedResourceList", sequencedResourceList)
154         msoLogger.info("sequencedResourceList: " + sequencedResourceList)
155         msoLogger.trace("COMPLETED sequenceResoure Process ")
156     }
157
158     public prepareServiceTopologyRequest(DelegateExecution execution) {
159
160         msoLogger.trace("======== Start prepareServiceTopologyRequest Process ======== ")
161
162         String serviceDecompose = execution.getVariable("serviceDecomposition")
163
164         execution.setVariable("operationType", "create")
165         execution.setVariable("resourceType", "")
166
167         String serviceInvariantUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelInvariantUuid")
168         String serviceUuid = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelUuid")
169         String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
170
171         execution.setVariable("modelInvariantUuid", serviceInvariantUuid)
172         execution.setVariable("modelUuid", serviceUuid)
173         execution.setVariable("serviceModelName", serviceModelName)
174
175         msoLogger.trace("======== End prepareServiceTopologyRequest Process ======== ")
176     }
177
178     public void getCurrentResoure(DelegateExecution execution){
179         msoLogger.trace("Start getCurrentResoure Process ")
180         def currentIndex = execution.getVariable("currentResourceIndex")
181         List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
182         Resource currentResource = sequencedResourceList.get(currentIndex)
183         execution.setVariable("resourceType", currentResource.getModelInfo().getModelName())
184         msoLogger.info("Now we deal with resouce:" + currentResource.getModelInfo().getModelName())
185         msoLogger.trace("COMPLETED getCurrentResoure Process ")
186     }
187
188     public void parseNextResource(DelegateExecution execution){
189         msoLogger.trace("Start parseNextResource Process ")
190         def currentIndex = execution.getVariable("currentResourceIndex")
191         def nextIndex =  currentIndex + 1
192         execution.setVariable("currentResourceIndex", nextIndex)
193         List<String> sequencedResourceList = execution.getVariable("sequencedResourceList")
194         if(nextIndex >= sequencedResourceList.size()){
195             execution.setVariable("allResourceFinished", "true")
196         }else{
197             execution.setVariable("allResourceFinished", "false")
198         }
199         msoLogger.trace("COMPLETED parseNextResource Process ")
200     }
201
202     public void prepareResourceRecipeRequest(DelegateExecution execution){
203         msoLogger.trace("Start prepareResourceRecipeRequest Process ")
204         ResourceInput resourceInput = new ResourceInput()
205         String serviceInstanceName = execution.getVariable("serviceInstanceName")
206         String resourceType = execution.getVariable("resourceType")
207         String resourceInstanceName = resourceType + "_" + serviceInstanceName
208         resourceInput.setResourceInstanceName(resourceInstanceName)
209         msoLogger.info("Prepare Resource Request resourceInstanceName:" + resourceInstanceName)
210         String globalSubscriberId = execution.getVariable("globalSubscriberId")
211         String serviceType = execution.getVariable("serviceType")
212         String serviceInstanceId = execution.getVariable("serviceInstanceId")
213         String operationId = execution.getVariable("operationId")
214         String operationType = "createInstance"
215         resourceInput.setGlobalSubscriberId(globalSubscriberId)
216         resourceInput.setServiceType(serviceType)
217         resourceInput.setServiceInstanceId(serviceInstanceId)
218         resourceInput.setOperationId(operationId)
219         resourceInput.setOperationType(operationType);
220         def currentIndex = execution.getVariable("currentResourceIndex")
221         List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
222         Resource currentResource = sequencedResourceList.get(currentIndex)
223         resourceInput.setResourceModelInfo(currentResource.getModelInfo());
224         ServiceDecomposition serviceDecomposition = execution.getVariable("serviceDecomposition")
225         resourceInput.setServiceModelInfo(serviceDecomposition.getModelInfo());
226         def String resourceCustomizationUuid = currentResource.getModelInfo().getModelCustomizationUuid();
227
228         String incomingRequest = execution.getVariable("uuiRequest")
229         //set the requestInputs from tempalte  To Be Done
230         String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
231         String serviceParameters = jsonUtil.getJsonValue(incomingRequest, "service.parameters")
232         String resourceParameters = ResourceRequestBuilder.buildResourceRequestParameters(execution, serviceModelUuid, resourceCustomizationUuid, serviceParameters)
233         resourceInput.setResourceParameters(resourceParameters)
234         resourceInput.setRequestsInputs(incomingRequest)
235         execution.setVariable("resourceInput", resourceInput.toString())
236         execution.setVariable("resourceModelUUID", resourceInput.getResourceModelInfo().getModelUuid())
237         msoLogger.trace("COMPLETED prepareResourceRecipeRequest Process ")
238     }
239
240     public void executeResourceRecipe(DelegateExecution execution){
241         msoLogger.trace("Start executeResourceRecipe Process ")
242
243         try {
244             String requestId = execution.getVariable("msoRequestId")
245             String serviceInstanceId = execution.getVariable("serviceInstanceId")
246             String serviceType = execution.getVariable("serviceType")
247             String resourceInput = execution.getVariable("resourceInput")
248             String resourceModelUUID = execution.getVariable("resourceModelUUID")
249
250             // requestAction is action, not opertiontype
251             //String requestAction = resourceInput.getOperationType()
252             String requestAction = "createInstance"
253             JSONObject resourceRecipe = catalogDbUtils.getResourceRecipe(execution, resourceModelUUID, requestAction)
254
255             if (resourceRecipe != null) {
256                 String recipeURL = BPMNProperties.getProperty("bpelURL", "http://so-bpmn-infra.onap:8081") + resourceRecipe.getString("orchestrationUri")
257                 int recipeTimeOut = resourceRecipe.getInt("recipeTimeout")
258                 String recipeParamXsd = resourceRecipe.get("paramXSD")
259
260                 BpmnRestClient bpmnRestClient = new BpmnRestClient()
261                 HttpResponse resp = bpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput, recipeParamXsd)
262             } else {
263                 String exceptionMessage = "Resource receipe is not found for resource modeluuid: " + resourceModelUUID
264                 msoLogger.trace(exceptionMessage)
265                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
266             }
267
268             msoLogger.trace("======== end executeResourceRecipe Process ======== ")
269         }catch(BpmnError b){
270             msoLogger.debug("Rethrowing MSOWorkflowException")
271             throw b
272         }catch(Exception e){
273             msoLogger.debug("Error occured within DoCreateResources executeResourceRecipe method: " + e)
274             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured during DoCreateResources executeResourceRecipe Catalog")
275         }
276     }
277
278     public void postConfigRequest(DelegateExecution execution){
279         //now do noting
280     }
281 }