0240beab9adcba15fcbe551fcd591af2295ccb66
[so.git] /
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.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
48
49
50
51 /**
52  * This groovy class supports the <class>DoCreateResources.bpmn</class> process.
53  * 
54  * Inputs:
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 
62  *
63  * @param - addResourceList
64  *
65  * Outputs:
66  * @param - WorkflowException
67  */
68 public class DoCreateResources extends AbstractServiceTaskProcessor{
69     private static final Logger logger = LoggerFactory.getLogger( DoCreateResources.class);
70
71     ExceptionUtil exceptionUtil = new ExceptionUtil()
72     JsonUtils jsonUtil = new JsonUtils()
73     CatalogDbUtils catalogDbUtils = new CatalogDbUtilsFactory().create()
74
75     public void preProcessRequest(DelegateExecution execution) {
76         logger.trace("preProcessRequest ")
77         String msg = ""
78
79         List addResourceList = execution.getVariable("addResourceList")
80         if (addResourceList == null) {
81             msg = "Input addResourceList is null"
82             logger.info(msg)
83             exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
84         }
85         else if (addResourceList.size() == 0) {
86             msg = "No resource in addResourceList"
87             logger.info(msg)
88         }
89         logger.trace("Exit preProcessRequest ")
90     }
91
92     // this method will convert resource list to instance_resource_list
93     void prepareInstanceResourceList(DelegateExecution execution) {
94
95         String uuiRequest = execution.getVariable("uuiRequest")
96         List<Resource> sequencedResourceList = execution.getVariable("sequencedResourceList")
97         List<Resource> instanceResourceList = InstanceResourceList.getInstanceResourceList(sequencedResourceList, uuiRequest)
98
99         execution.setVariable("instanceResourceList", instanceResourceList)
100     }
101
102     public void sequenceResoure(DelegateExecution execution) {
103         logger.trace("Start sequenceResoure Process ")
104         
105         String incomingRequest = execution.getVariable("uuiRequest")
106         String serviceModelUuid = jsonUtil.getJsonValue(incomingRequest,"service.serviceUuid")
107
108         List<Resource> addResourceList = execution.getVariable("addResourceList")
109
110         List<NetworkResource> networkResourceList = new ArrayList<NetworkResource>()
111
112         List<Resource> sequencedResourceList = new ArrayList<Resource>()
113
114         String serviceDecompose = execution.getVariable("serviceDecomposition")
115         String serviceModelName = jsonUtil.getJsonValue(serviceDecompose, "serviceResources.modelInfo.modelName")
116
117         // get Sequence from properties        
118         def resourceSequence = BPMNProperties.getResourceSequenceProp(serviceModelName)
119
120         // get Sequence from csar(model)  
121         if(resourceSequence == null) {
122             resourceSequence = ResourceRequestBuilder.getResourceSequence(serviceModelUuid)
123             logger.info("Get Sequence from csar : " + resourceSequence)
124         }
125
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)
131
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)
143                                         }
144                                     }
145                                 }
146                             }
147                         }
148                         if (resource instanceof NetworkResource) {
149                             networkResourceList.add(resource)
150                         }
151                     }
152                 }
153             }
154         } else {
155
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>()
160
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)
168                 }
169             }
170             sequencedResourceList.addAll(vnfResourceList)
171             sequencedResourceList.addAll(networkResourceList)
172             sequencedResourceList.addAll(arResourceList)
173         }
174
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)
180         }
181
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 ")
187     }
188
189     public prepareServiceTopologyRequest(DelegateExecution execution) {
190
191         logger.trace("======== Start prepareServiceTopologyRequest Process ======== ")
192
193         String serviceDecompose = execution.getVariable("serviceDecomposition")
194
195         execution.setVariable("operationType", "create")
196         execution.setVariable("resourceType", "")
197
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")
201
202         execution.setVariable("modelInvariantUuid", serviceInvariantUuid)
203         execution.setVariable("modelUuid", serviceUuid)
204         execution.setVariable("serviceModelName", serviceModelName)
205
206         logger.trace("======== End prepareServiceTopologyRequest Process ======== ")
207     }
208
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 ")
217     }
218
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")
227         }else{
228             execution.setVariable("allResourceFinished", "false")
229         }
230         logger.trace("COMPLETED parseNextResource Process ")
231     }
232
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();
258
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<>();
266         }
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 ")
274     }
275
276     public void executeResourceRecipe(DelegateExecution execution){
277         logger.trace("Start executeResourceRecipe Process ")
278
279         try {
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")
285
286             // requestAction is action, not opertiontype
287             //String requestAction = resourceInput.getOperationType()
288             String requestAction = "createInstance"
289             JSONObject resourceRecipe = catalogDbUtils.getResourceRecipe(execution, resourceModelUUID, requestAction)
290
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")
295
296                 BpmnRestClient bpmnRestClient = new BpmnRestClient()
297                 HttpResponse resp = bpmnRestClient.post(recipeURL, requestId, recipeTimeOut, requestAction, serviceInstanceId, serviceType, resourceInput, recipeParamXsd)
298             } else {
299                 String exceptionMessage = "Resource receipe is not found for resource modeluuid: " + resourceModelUUID
300                 logger.trace(exceptionMessage)
301                 exceptionUtil.buildAndThrowWorkflowException(execution, 500, exceptionMessage)
302             }
303
304             logger.trace("======== end executeResourceRecipe Process ======== ")
305         }catch(BpmnError b){
306             logger.debug("Rethrowing MSOWorkflowException")
307             throw b
308         }catch(Exception e){
309             logger.debug("Error occured within DoCreateResources executeResourceRecipe method: " + e)
310             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Internal Error - Occured during DoCreateResources executeResourceRecipe Catalog")
311         }
312     }
313
314     public void postConfigRequest(DelegateExecution execution){
315         //now do noting
316     }
317 }