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