Changes for MDONS usecase
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / CreateSDNCNetworkResource.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - 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
26 import org.apache.commons.lang3.*
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONObject
30 import org.json.XML
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aai.domain.yang.ServiceInstances
33 import org.onap.aai.domain.yang.v13.Metadata
34 import org.onap.aai.domain.yang.v13.Metadatum
35 import org.onap.so.bpmn.common.recipe.ResourceInput
36 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
37 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
39 import org.onap.so.bpmn.common.scripts.MsoUtils
40 import org.onap.so.bpmn.core.domain.ModelInfo
41 import org.onap.so.bpmn.core.domain.ResourceType
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.bpmn.core.UrnPropertiesReader
44 import org.onap.so.client.aai.AAIObjectPlurals
45 import org.onap.so.client.aai.AAIResourcesClient
46 import org.onap.so.client.aai.AAIObjectType
47 import org.onap.so.client.aai.entities.uri.AAIResourceUri
48 import org.onap.so.client.aai.entities.uri.AAIUriFactory
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
51
52 /**
53  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
54  * flow for SDNC Network Resource Create
55  */
56 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
57
58     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class)
59     String Prefix="CRESDNCRES_"
60
61     ExceptionUtil exceptionUtil = new ExceptionUtil()
62
63     JsonUtils jsonUtil = new JsonUtils()
64
65     MsoUtils msoUtils = new MsoUtils()
66
67     public void preProcessRequest(DelegateExecution execution){
68
69         logger.info(" ***** Started preProcessRequest *****")
70         try {
71
72             //get bpmn inputs from resource request.
73             String requestId = execution.getVariable("mso-request-id")
74             String requestAction = execution.getVariable("requestAction")
75             logger.info("The requestAction is: " + requestAction)
76             String recipeParamsFromRequest = execution.getVariable("recipeParams")
77             logger.info("The recipeParams is: " + recipeParamsFromRequest)
78             String resourceInput = execution.getVariable("resourceInput")
79             logger.info("The resourceInput is: " + resourceInput)
80             //Get ResourceInput Object
81             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
82             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
83
84             //Deal with recipeParams
85             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
86
87             //For sdnc requestAction default is "createNetworkInstance"
88             String operationType = "Network"
89             if(!StringUtils.isBlank(recipeParamsFromRequest)){
90                 //the operationType from worflow(first node) is second priority.
91                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
92             }
93             if(!StringUtils.isBlank(recipeParamsFromWf)){
94                 //the operationType from worflow(first node) is highest priority.
95                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
96             }
97             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
98             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
99                 // highest priority if operation type configured
100                 operationType = operationTypeFromConfig
101             }
102
103             String sdnc_svcAction = "create"
104             String sdnc_requestAction = sdnc_svcAction.capitalize() + operationType + "Instance"
105             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
106             execution.setVariable("isActivateRequired", isActivateRequired)
107
108             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
109             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
110             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
111             execution.setVariable("mso-request-id", requestId)
112             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
113         } catch (BpmnError e) {
114             throw e
115         } catch (Exception ex){
116             msg = "Exception in preProcessRequest " + ex.getMessage()
117             logger.debug(msg)
118             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
119         }
120     }
121
122     String customizeResourceParam(String networkInputParametersJson) {
123         List<Map<String, Object>> paramList = new ArrayList()
124         JSONObject jsonObject = new JSONObject(networkInputParametersJson)
125         Iterator iterator = jsonObject.keys()
126         while (iterator.hasNext()) {
127             String key = iterator.next()
128             HashMap<String, String> hashMap = new HashMap()
129             hashMap.put("name", key)
130             if(jsonObject.get(key)==null){
131                  hashMap.put("value", "")
132              }else{
133                  hashMap.put("value", jsonObject.get(key))
134              }
135             paramList.add(hashMap)
136         }
137         Map<String, List<Map<String, Object>>> paramMap = new HashMap()
138         paramMap.put("param", paramList)
139
140         return  new JSONObject(paramMap).toString()
141     }
142
143     private List<Metadatum> getMetaDatum(String customerId,
144                                          String serviceType, String serId) {
145         logger.debug("Enter getPnfInstance")
146         AAIResourcesClient client = new AAIResourcesClient()
147
148         // think how AAI queried for PNF name using the name
149         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
150                 customerId, serviceType, serId)
151         logger.debug("uri for pnf get:" + uri.toString())
152
153         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
154         return metadata.getMetadatum()
155     }
156
157     /**
158      * This method updates the resource input by collecting required info from AAI
159      * @param execution
160      */
161     public ResourceInput updateResourceInput(DelegateExecution execution) {
162         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
163         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
164
165
166         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
167         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
168
169         switch (modelName) {
170             case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
171             case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
172                 // get the required properties and update in resource input
173
174                 def resourceInput = resourceInputObj.getResourceParameters()
175                 String incomingRequest = resourceInputObj.getRequestsInputs()
176                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
177                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
178                 String cvlan = jsonUtil.getJsonValue(serInput,
179                         "service.parameters.requestInputs.cvlan")
180                 String svlan = jsonUtil.getJsonValue(serInput,
181                         "service.parameters.requestInputs.svlan")
182                 String remoteId = jsonUtil.getJsonValue(serInput,
183                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
184                 String manufacturer = jsonUtil.getJsonValue(serInput,
185                         "service.parameters.requestInputs.ont_ont_manufacturer")
186                 String ontsn = jsonUtil.getJsonValue(serInput,
187                         "service.parameters.requestInputs.ont_ont_serial_num")
188
189                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
190                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
191                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
192                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
193                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
194                 logger.debug("old resource input:" + resourceInputObj.toString())
195                 resourceInputObj.setResourceParameters(uResourceInput)
196                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
197                 logger.debug("new resource Input :" + resourceInputObj.toString())
198                 break
199
200             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
201             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
202                 // get the required properties and update in resource input
203                 def resourceInput = resourceInputObj.getResourceParameters()
204                 String incomingRequest = resourceInputObj.getRequestsInputs()
205                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
206                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
207                 JSONObject inputParameters = new JSONObject(requestInputs)
208
209                 String cvlan = jsonUtil.getJsonValue(serInput,
210                         "service.parameters.requestInputs.cvlan")
211                 String svlan = jsonUtil.getJsonValue(serInput,
212                         "service.parameters.requestInputs.svlan")
213                 String manufacturer = jsonUtil.getJsonValue(serInput,
214                         "service.parameters.requestInputs.ont_ont_manufacturer")
215                 String remoteId = jsonUtil.getJsonValue(serInput,
216                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
217                 String ontsn = jsonUtil.getJsonValue(serInput,
218                         "service.parameters.requestInputs.ont_ont_serial_num")
219                 String serviceType = jsonUtil.getJsonValue(serInput,
220                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
221                 String macAddr = jsonUtil.getJsonValue(serInput,
222                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
223                 String upStream = jsonUtil.getJsonValue(serInput,
224                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
225                 String downStream = jsonUtil.getJsonValue(serInput,
226                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
227
228                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
229                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
230                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
231                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
232                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
233                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
234                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
235                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
236                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
237                 logger.debug("old resource input:" + resourceInputObj.toString())
238                 resourceInputObj.setResourceParameters(uResourceInput)
239                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
240                 logger.debug("new resource Input :" + resourceInputObj.toString())
241                 break
242
243
244             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
245
246                 def resourceInput = resourceInputObj.getResourceParameters()
247                 String incomingRequest = resourceInputObj.getRequestsInputs()
248                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
249                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
250                 JSONObject inputParameters = new JSONObject(requestInputs)
251                 if(inputParameters.has("local-access-provider-id")) {
252                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
253                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
254                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
255                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
256                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
257                     resourceInputObj.setResourceParameters(uResourceInput)
258                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
259                 }
260
261                 break
262
263             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
264             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
265             case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
266                 // fill attachment TP in networkInputParamJson
267                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
268                 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
269
270                 break
271             default:
272                 // Special case for handling alloted resource types
273                 // in case name is different as expected
274                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
275                     def vpnName = modelName + "_sotnVpnName"
276                     fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
277                 }
278                 break
279         }
280         return resourceInputObj
281     }
282
283     private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
284
285         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
286
287         AAIResourcesClient client = new AAIResourcesClient()
288         logger.info("sending request to resolve vpn-name:" + vpnName)
289         AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
290         Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
291
292         if(serviceInstancesOpt.isPresent()) {
293             List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
294             logger.info("response from aai:" + serviceInstanceList.toString())
295             if (serviceInstanceList.size() > 0) {
296                 ServiceInstance si = serviceInstanceList.get(0)
297                 String parentServiceInstanceId = si.getServiceInstanceId()
298                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
299                 logger.info("setting parentService id:" + parentServiceInstanceId)
300             } else {
301                 logger.error("No service instance found for given name.")
302             }
303         } else {
304             logger.error("No nodes found with this name" + vpnName)
305         }
306     }
307
308     /**
309      * Pre Process the BPMN Flow Request
310      * Includes:
311      * generate the nsOperationKey
312      * generate the nsParameters
313      */
314     public void prepareSDNCRequest (DelegateExecution execution) {
315         logger.info(" ***** Started prepareSDNCRequest *****")
316
317         try {
318             // get variables
319             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
320             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
321             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
322             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
323
324             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
325             String hdrRequestId = execution.getVariable("mso-request-id")
326             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
327             String source = execution.getVariable("source")
328             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
329             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
330             String serviceType = resourceInputObj.getServiceType()
331             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
332             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
333             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
334             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
335             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
336             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
337             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
338             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
339             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
340             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
341             String resourceInputPrameters = resourceInputObj.getResourceParameters()
342             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
343             //here convert json string to xml string
344             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
345             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
346             String sdncTopologyCreateRequest = ""
347
348             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
349
350             switch (modelType) {
351                 case "VNF" :
352                                         if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
353                                                 source = "SO"
354                                                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
355                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
356                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
357                                  <sdncadapter:RequestHeader>
358                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
359                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
360                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
361                                     <sdncadapter:SvcOperation>optical-service-create</sdncadapter:SvcOperation>
362                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
363                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
364                                  </sdncadapter:RequestHeader>
365                                  <sdncadapterworkflow:SDNCRequestData>
366                                     <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
367                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
368                                     <service-type>${msoUtils.xmlEscape(serviceType)}</service-type>
369                                     <notification-url>sdncCallback</notification-url>
370                                     <source>${msoUtils.xmlEscape(source)}</source>
371                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
372                                      <payload>
373                                          $netowrkInputParameters
374                                      </payload>
375                                 </sdncadapterworkflow:SDNCRequestData>
376                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
377                                         } else{
378                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
379                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
380                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
381                                  <sdncadapter:RequestHeader>
382                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
383                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
384                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
385                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
386                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
387                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
388                                  </sdncadapter:RequestHeader>
389                                  <sdncadapterworkflow:SDNCRequestData>
390                                      <request-information>
391                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
392                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
393                                         <source>${msoUtils.xmlEscape(source)}</source>
394                                         <notification-url></notification-url>
395                                         <order-number></order-number>
396                                         <order-version></order-version>
397                                      </request-information>
398                                      <service-information>
399                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
400                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
401                                         <onap-model-information>
402                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
403                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
404                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
405                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
406                                         </onap-model-information>
407                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
408                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
409                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
410                                      </service-information>
411                                      <vnf-information>
412                                         <vnf-type></vnf-type>
413                                         <onap-model-information>
414                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
415                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
416                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
417                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
418                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
419                                         </onap-model-information>
420                                      </vnf-information>
421                                      <vnf-request-input>
422                                          <vnf-input-parameters>
423                                            $netowrkInputParameters
424                                          </vnf-input-parameters>
425                                          <request-version></request-version>
426                                          <vnf-name></vnf-name>
427                                          <vnf-networks>
428                                         </vnf-networks>
429                                       </vnf-request-input>
430                                 </sdncadapterworkflow:SDNCRequestData>
431                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
432                                         }
433                     break
434                 case "GROUP" :
435                     String vnfid = resourceInputObj.getVnfId()
436                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
437                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
438                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
439                     String vnfmodelUuid = vfModelInfo.getModelUuid()
440                     String vnfmodelVersion = vfModelInfo.getModelVersion()
441                     String vnfmodelName = vfModelInfo.getModelName()
442                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
443                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
444                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
445                                  <sdncadapter:RequestHeader>
446                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
447                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
448                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
449                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
450                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
451                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
452                                  </sdncadapter:RequestHeader>
453                                  <sdncadapterworkflow:SDNCRequestData>
454                                      <request-information>
455                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
456                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
457                                         <source>${msoUtils.xmlEscape(source)}</source>
458                                         <notification-url></notification-url>
459                                         <order-number></order-number>
460                                         <order-version></order-version>
461                                      </request-information>
462                                      <service-information>
463                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
464                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
465                                         <onap-model-information>
466                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
467                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
468                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
469                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
470                                         </onap-model-information>
471                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
472                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
473                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
474                                      </service-information>
475                                      <vnf-information>
476                                         <onap-model-information>
477                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
478                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
479                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
480                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
481                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
482                                         </onap-model-information>
483                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
484                                      </vnf-information>
485                                      <vf-module-information>
486                                         <from-preload>false</from-preload>
487                                         <onap-model-information>
488                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
489                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
490                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
491                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
492                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
493                                         </onap-model-information>
494                                      </vf-module-information>
495                                      <vf-module-request-input>
496                                          <vf-module-input-parameters>
497                                            $netowrkInputParameters
498                                          </vf-module-input-parameters>
499                                       </vf-module-request-input>
500                                 </sdncadapterworkflow:SDNCRequestData>
501                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
502                     break
503
504                 // sdwanvpnattachment or sotnvpnattachment
505                 case "ALLOTTED_RESOURCE" :
506                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
507                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
508                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
509                                  <sdncadapter:RequestHeader>
510                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
511                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
512                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
513                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
514                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
515                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
516                                  </sdncadapter:RequestHeader>
517                                  <sdncadapterworkflow:SDNCRequestData>
518                                      <request-information>
519                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
520                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
521                                         <source>${msoUtils.xmlEscape(source)}</source>
522                                         <notification-url></notification-url>
523                                         <order-number></order-number>
524                                         <order-version></order-version>
525                                      </request-information>
526                                      <service-information>
527                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
528                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
529                                         <onap-model-information>
530                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
531                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
532                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
533                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
534                                         </onap-model-information>
535                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
536                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
537                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
538                                      </service-information>
539                                      <allotted-resource-information>
540                                         <allotted-resource-id></allotted-resource-id>
541                                         <allotted-resource-type></allotted-resource-type>
542                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
543                                         <onap-model-information>
544                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
545                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
546                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
547                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
548                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
549                                         </onap-model-information>
550                                      </allotted-resource-information>
551                                      <connection-attachment-request-input>
552                                        $netowrkInputParameters
553                                      </connection-attachment-request-input>
554                                 </sdncadapterworkflow:SDNCRequestData>
555                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
556
557                     break
558
559                 // for SDWANConnectivity and SOTNConnectivity:
560                 default:
561                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
562                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
563                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
564                                   <sdncadapter:RequestHeader>
565                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
566                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
567                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
568                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
569                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
570                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
571                                   </sdncadapter:RequestHeader>
572                                   <sdncadapterworkflow:SDNCRequestData>
573                                       <request-information>
574                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
575                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
576                                          <source>${msoUtils.xmlEscape(source)}</source>
577                                          <notification-url></notification-url>
578                                          <order-number></order-number>
579                                          <order-version></order-version>
580                                       </request-information>
581                                       <service-information>
582                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
583                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
584                                          <onap-model-information>
585                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
586                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
587                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
588                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
589                                          </onap-model-information>
590                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
591                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
592                                       </service-information>
593                                       <network-information>
594                                          <onap-model-information>
595                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
596                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
597                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
598                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
599                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
600                                          </onap-model-information>
601                                       </network-information>
602                                       <network-request-input>
603                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
604                                       </network-request-input>
605                                  </sdncadapterworkflow:SDNCRequestData>
606                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
607
608
609             }
610
611             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
612             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
613             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
614
615         } catch (Exception ex) {
616             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
617             logger.debug(exceptionMessage)
618             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
619
620         }
621         logger.info(" ***** Exit prepareSDNCRequest *****")
622     }
623
624     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
625         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
626         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
627         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
628     }
629
630     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
631         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
632         String operType = resourceInputObj.getOperationType()
633         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
634         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
635         String operationId = resourceInputObj.getOperationId()
636         String progress = "20"
637         String status = "processing"
638         String statusDescription = "SDCN resource creation invoked"
639
640         execution.getVariable("operationId")
641
642         String body = """
643                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
644                         xmlns:ns="http://org.onap.so/requestsdb">
645                         <soapenv:Header/>
646                 <soapenv:Body>
647                     <ns:updateResourceOperationStatus>
648                                <operType>${msoUtils.xmlEscape(operType)}</operType>
649                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
650                                <progress>${msoUtils.xmlEscape(progress)}</progress>
651                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
652                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
653                                <status>${msoUtils.xmlEscape(status)}</status>
654                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
655                     </ns:updateResourceOperationStatus>
656                 </soapenv:Body>
657                 </soapenv:Envelope>"""
658
659         setProgressUpdateVariables(execution, body)
660
661     }
662
663     public void prepareUpdateAfterCreateSDNCResource(execution) {
664         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
665         String operType = resourceInputObj.getOperationType()
666         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
667         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
668         String operationId = resourceInputObj.getOperationId()
669         String progress = "100"
670         String status = "finished"
671         String statusDescription = "SDCN resource creation and activation completed"
672
673         execution.getVariable("operationId")
674
675         String body = """
676                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
677                         xmlns:ns="http://org.onap.so/requestsdb">
678                         <soapenv:Header/>
679                 <soapenv:Body>
680                     <ns:updateResourceOperationStatus>
681                                <operType>${msoUtils.xmlEscape(operType)}</operType>
682                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
683                                <progress>${msoUtils.xmlEscape(progress)}</progress>
684                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
685                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
686                                <status>${msoUtils.xmlEscape(status)}</status>
687                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
688                     </ns:updateResourceOperationStatus>
689                 </soapenv:Body>
690                 </soapenv:Envelope>"""
691
692         setProgressUpdateVariables(execution, body)
693     }
694
695     public void afterCreateSDNCCall(DelegateExecution execution){
696         logger.info(" ***** Started prepareSDNCRequest *****")
697         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
698         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
699
700         def instnaceId = getInstanceId(execution)
701         execution.setVariable("resourceInstanceId", instnaceId)
702
703         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
704         logger.info(" ***** Exit prepareSDNCRequest *****")
705     }
706
707     private def getInstanceId(DelegateExecution execution) {
708         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
709
710         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
711         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
712         def val = ""
713
714         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
715         switch (modelType) {
716             case "VNF" :
717                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
718                 break
719             case "GROUP":
720                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
721                 break
722             case "ALLOTTED_RESOURCE":
723                 // sdwanvpnattachment or sotnvpnattachment
724                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
725                 break
726             default:
727                 // SDWANConnectivity or SOTN Connectivity
728                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
729                 break
730         }
731         return val.toString()
732     }
733
734     public void sendSyncResponse (DelegateExecution execution) {
735         logger.debug(" *** sendSyncResponse *** ")
736
737         try {
738             String operationStatus = "finished"
739             // RESTResponse for main flow
740             String vnfid=execution.getVariable("resourceInstanceId")
741             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
742             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
743             sendWorkflowResponse(execution, 202, resourceOperationResp)
744             execution.setVariable("sentSyncResponse", true)
745
746         } catch (Exception ex) {
747             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
748             logger.debug(msg)
749             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
750         }
751         logger.debug(" ***** Exit sendSyncResponse *****")
752     }
753 }