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