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