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