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