cc5b8cf1e8f8aa673c7dd8765de96377de336ccc
[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 import org.apache.commons.lang3.*
26 import org.camunda.bpm.engine.delegate.BpmnError
27 import org.camunda.bpm.engine.delegate.DelegateExecution
28 import org.onap.aai.domain.yang.AllottedResource
29 import org.onap.aai.domain.yang.Relationship
30 import org.onap.aai.domain.yang.RelationshipData
31 import org.onap.so.bpmn.common.recipe.ResourceInput
32 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
33 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
34 import org.onap.so.bpmn.common.scripts.ExceptionUtil
35 import org.onap.so.bpmn.common.scripts.MsoUtils
36 import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
37 import org.onap.so.bpmn.core.domain.ModelInfo
38 import org.onap.so.bpmn.core.domain.ResourceType
39 import org.onap.so.bpmn.core.json.JsonUtils
40 import org.onap.so.bpmn.core.UrnPropertiesReader
41 import org.onap.aaiclient.client.aai.AAIObjectType
42 import org.onap.aaiclient.client.aai.AAIResourcesClient
43 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
44 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
45 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
46 import org.slf4j.Logger
47 import org.slf4j.LoggerFactory
48
49 import javax.ws.rs.NotFoundException
50
51 import static org.apache.commons.lang3.StringUtils.*
52
53 /**
54  * This groovy class supports the <class>DeleteSDNCCNetworkResource.bpmn</class> process.
55  * flow for SDNC Network Resource 
56  */
57 public class DeleteSDNCNetworkResource extends AbstractServiceTaskProcessor {
58     private static final Logger logger = LoggerFactory.getLogger( DeleteSDNCNetworkResource.class);
59
60     String Prefix="DELSDNCRES_"
61
62     ExceptionUtil exceptionUtil = new ExceptionUtil()
63
64     JsonUtils jsonUtil = new JsonUtils()
65
66     SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
67
68     MsoUtils msoUtils = new MsoUtils()
69
70     void preProcessRequest(DelegateExecution execution){
71         logger.info(" ***** Started preProcessRequest *****")
72         try {
73
74             //get bpmn inputs from resource request.
75             String requestId = execution.getVariable("mso-request-id")
76             String requestAction = execution.getVariable("requestAction")
77             logger.info("The requestAction is: " + requestAction)
78             String recipeParamsFromRequest = execution.getVariable("recipeParams")
79             logger.info("The recipeParams is: " + recipeParamsFromRequest)
80             String resourceInput = execution.getVariable("resourceInput")
81             logger.info("The resourceInput is: " + resourceInput)
82             //Get ResourceInput Object
83             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
84             execution.setVariable(Prefix + "resourceInput", resourceInputObj)
85
86             //Deal with recipeParams
87             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
88             String resourceModelName = resourceInputObj.getResourceModelInfo().getModelName()
89             String resourceInstanceId = resourceInputObj.getResourceInstancenUuid()
90             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
91             String serviceType = resourceInputObj.getServiceType()
92             String serviceInstanceId = resourceInputObj.getServiceInstanceId()
93
94             // fetch parent instance id for allotted resources
95             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
96             switch (modelType) {
97             // sdwanvpnattachment or sotnvpnattachment
98                 case "ALLOTTED_RESOURCE":
99                     String parentServiceId = fetchParentServiceInstance(globalCustomerId, serviceType, serviceInstanceId, resourceInstanceId)
100                     if (null != parentServiceId) {
101                         execution.setVariable("allotedParentServiceInstanceId", parentServiceId)
102                     } else {
103                         logger.warn("Alloted Resource ParentServiceInstanceId not found in AAI response for allotedId: " + resourceInstanceId)
104                     }
105                     break;
106                 default:
107                     break;
108             }
109
110             //For sdnc requestAction default is "NetworkInstance"
111             String operationType = "Network"
112             if(!StringUtils.isBlank(recipeParamsFromRequest) && "null" != recipeParamsFromRequest){
113                 //the operationType from worflow(first node) is second priority.
114                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
115             }
116             if(!StringUtils.isBlank(recipeParamsFromWf)){
117                 //the operationType from worflow(first node) is highest priority.
118                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
119             }
120             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
121             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
122                 // highest priority if operation type configured
123                 operationType = operationTypeFromConfig
124             }
125
126
127             //For sdnc, generate svc_action and request_action
128             String sdnc_svcAction = "delete"
129             String sdnc_requestAction = StringUtils.capitalize(sdnc_svcAction) + operationType + "Instance"
130             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".activation-required")
131             execution.setVariable("isActivateRequired", isActivateRequired)
132             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
133             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
134             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
135             execution.setVariable("mso-request-id", requestId)
136             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
137         } catch (BpmnError e) {
138             throw e;
139         } catch (Exception ex){
140             String msg = "Exception in preProcessRequest " + ex.getMessage()
141             logger.debug( msg)
142             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
143         }
144         logger.info(" ***** Exit preProcessRequest *****")
145     }
146
147     private String fetchParentServiceInstance(String globalCustId, String serviceType, String serviceInstanceId, String allotedResourceId ) {
148         logger.trace("Entered fetchParentServiceInstance")
149         try {
150             String parentServiceId = "";
151             AAIResourcesClient resourceClient = new AAIResourcesClient();
152             AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE, globalCustId, serviceType, serviceInstanceId, allotedResourceId)
153             AAIResultWrapper aaiResult = resourceClient.get(serviceInstanceUri, NotFoundException.class)
154             Optional<AllottedResource> si = aaiResult.asBean(AllottedResource.class)
155             if((si.present) && (null != si.get().getRelationshipList()) && (null != si.get().getRelationshipList().getRelationship())) {
156                 logger.debug("SI Data relationship-list exists")
157                 List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
158                 for (Relationship relationship : relationshipList) {
159                     String rt = relationship.getRelatedTo()
160                     List<RelationshipData> rl_datas = relationship.getRelationshipData()
161                     if(rt.equals("service-instance") ){
162                         for (RelationshipData rl_data : rl_datas) {
163                             String eKey = rl_data.getRelationshipKey()
164                             String eValue = rl_data.getRelationshipValue()
165                             if(eKey.equals("service-instance.service-instance-id") && (!eValue.equals(serviceInstanceId))){
166                                 return eValue
167                             }
168                         }
169                     }
170                 }
171             }
172
173             logger.trace("Exited fetchParentServiceInstance")
174         }catch(Exception e){
175             logger.debug("Error occured within deleteServiceInstance method: " + e)
176             exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Error occured during deleteServiceInstance from aai")
177         }
178         return null
179     }
180
181     /**
182      * Pre Process the BPMN Flow Request
183      * Includes:
184      * generate the nsOperationKey
185      * generate the nsParameters
186      */
187      void prepareSDNCRequest (DelegateExecution execution) {
188         logger.info(" ***** Started prepareSDNCRequest *****")
189
190         try {
191             // get variables
192             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
193             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
194             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
195             String deleteNetworkInput = execution.getVariable(Prefix + "networkRequest")
196
197             String hdrRequestId = execution.getVariable("mso-request-id")
198             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
199             String source = execution.getVariable("source")
200             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
201             String resourceInput = execution.getVariable(Prefix + "resourceInput")
202             logger.info("The resourceInput is: " + resourceInput)
203             String allotedParentServiceInstanceId = execution.getVariable("allotedParentServiceInstanceId")
204             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
205             String serviceType = resourceInputObj.getServiceType()
206             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
207             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
208             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
209             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
210             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
211             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid();
212             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
213             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
214             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
215             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
216             String resourceInstnaceId = resourceInputObj.getResourceInstancenUuid()
217             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
218
219             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
220             String sdncTopologyDeleteRequest = ""
221
222             switch (modelType) {
223                 case "VNF":
224                                     if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
225                                                 String serviceInstanceName = resourceInputObj.getResourceInstanceName()
226                                                 sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
227                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
228                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
229                                  <sdncadapter:RequestHeader>
230                                     <sdncadapter:RequestId>${MsoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
231                                     <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
232                                     <sdncadapter:SvcAction>${MsoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
233                                     <sdncadapter:SvcOperation>optical-service-delete</sdncadapter:SvcOperation>
234                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
235                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
236                                  </sdncadapter:RequestHeader>
237                                  <sdncadapterworkflow:SDNCRequestData>
238                                  <request-id>${msoUtils.xmlEscape(serviceInstanceId)}</request-id>
239                                      <payload>
240                                        <param>
241                                          <name>service-name</name>
242                                                                                  <value>${msoUtils.xmlEscape(serviceInstanceName)}</value>
243                                        </param>
244                                      </payload>
245                                 </sdncadapterworkflow:SDNCRequestData>
246                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
247                                         } else{
248                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
249                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
250                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
251                                  <sdncadapter:RequestHeader>
252                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
253                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
254                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
255                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
256                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
257                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
258                                  </sdncadapter:RequestHeader>
259                                  <sdncadapterworkflow:SDNCRequestData>
260                                      <request-information>
261                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
262                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
263                                         <source>${msoUtils.xmlEscape(source)}</source>
264                                         <notification-url></notification-url>
265                                         <order-number></order-number>
266                                         <order-version></order-version>
267                                      </request-information>
268                                      <service-information>
269                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
270                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
271                                         <onap-model-information>
272                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
273                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
274                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
275                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
276                                         </onap-model-information>
277                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
278                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
279                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
280                                      </service-information>
281                                      <vnf-information>
282                                         <vnf-id>$resourceInstnaceId</vnf-id>
283                                         <vnf-type></vnf-type>
284                                         <onap-model-information>
285                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
286                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
287                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
288                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
289                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
290                                         </onap-model-information>
291                                      </vnf-information>
292                                      <vnf-request-input>
293                                          <vnf-input-parameters>
294                                          </vnf-input-parameters>
295                                          <request-version></request-version>
296                                          <vnf-name></vnf-name>
297                                          <vnf-networks>
298                                         </vnf-networks>
299                                       </vnf-request-input>
300                                 </sdncadapterworkflow:SDNCRequestData>
301                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
302                                         } 
303                     break
304                 case "GROUP" :
305                     //When a new resource creation request reaches SO, the parent resources information needs to be provided
306                     //while creating the child resource.
307                     String vnfid = resourceInputObj.getVnfId()
308                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
309                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
310                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
311                     String vnfmodelUuid = vfModelInfo.getModelUuid()
312                     String vnfmodelVersion = vfModelInfo.getModelVersion()
313                     String vnfmodelName = vfModelInfo.getModelName()
314
315                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1" 
316                                                         xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
317                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
318                                   <sdncadapter:RequestHeader>
319                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
320                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
321                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
322                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
323                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
324                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
325                                   </sdncadapter:RequestHeader>
326                                   <sdncadapterworkflow:SDNCRequestData>
327                                     <request-information>
328                                       <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
329                                       <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
330                                       <source>${msoUtils.xmlEscape(source)}</source>
331                                       <notification-url></notification-url>
332                                       <order-number></order-number>
333                                       <order-version></order-version>
334                                     </request-information>
335                                     <service-information>
336                                       <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
337                                       <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
338                                       <onap-model-information>
339                                         <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
340                                         <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
341                                         <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
342                                         <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
343                                       </onap-model-information>
344                                       <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
345                                       <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
346                                       <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
347                                     </service-information>
348                                     <vnf-information>
349                                       <vnf-id>$vnfid</vnf-id>
350                                       <vnf-type></vnf-type>
351                                       <onap-model-information>
352                                         <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
353                                         <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
354                                         <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
355                                         <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
356                                         <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
357                                       </onap-model-information>
358                                     </vnf-information>
359                                     <vf-module-information>
360                                       <vf-module-id>$resourceInstnaceId</vf-module-id>
361                                       <vf-module-type></vf-module-type>
362                                       <from-preload>false</from-preload>
363                                       <onap-model-information>
364                                         <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
365                                         <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
366                                         <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
367                                         <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
368                                         <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
369                                       </onap-model-information>
370                                     </vf-module-information>
371                                     <vf-module-request-input>
372                                       <vf-module-input-parameters>
373                                       </vf-module-input-parameters>
374                                     </vf-module-request-input>
375                                   </sdncadapterworkflow:SDNCRequestData>
376                                 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
377                     break
378
379                 // sdwanvpnattachment or sotnvpnattachment
380                 case "ALLOTTED_RESOURCE" :
381                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
382                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
383                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
384                                  <sdncadapter:RequestHeader>
385                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
386                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
387                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
388                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
389                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
390                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
391                                  </sdncadapter:RequestHeader>
392                                  <sdncadapterworkflow:SDNCRequestData>
393                                      <request-information>
394                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
395                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
396                                         <source>${msoUtils.xmlEscape(source)}</source>
397                                         <notification-url></notification-url>
398                                         <order-number></order-number>
399                                         <order-version></order-version>
400                                      </request-information>
401                                      <service-information>
402                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
403                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
404                                         <onap-model-information>
405                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
406                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
407                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
408                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
409                                         </onap-model-information>
410                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
411                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
412                                         <subscriber-name></subscriber-name>
413                                      </service-information>
414                                      <allotted-resource-information>
415                                         <allotted-resource-id>$resourceInstnaceId</allotted-resource-id>
416                                         <allotted-resource-type></allotted-resource-type>
417                                         <parent-service-instance-id>$allotedParentServiceInstanceId</parent-service-instance-id>
418                                         <onap-model-information>
419                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
420                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
421                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
422                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
423                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
424                                         </onap-model-information>
425                                      </allotted-resource-information>
426                                      <connection-attachment-request-input>
427                                      </connection-attachment-request-input>
428                                 </sdncadapterworkflow:SDNCRequestData>
429                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
430
431                     break
432
433                 // for SDWANConnectivity and SOTNConnectivity:
434                 default:
435                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
436                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
437                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
438                                  <sdncadapter:RequestHeader>
439                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
440                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
441                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
442                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
443                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
444                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
445                                  </sdncadapter:RequestHeader>
446                                  <sdncadapterworkflow:SDNCRequestData>
447                                      <request-information>
448                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
449                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
450                                         <source>${msoUtils.xmlEscape(source)}</source>
451                                         <notification-url></notification-url>
452                                         <order-number></order-number>
453                                         <order-version></order-version>
454                                      </request-information>
455                                      <service-information>
456                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
457                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
458                                         <onap-model-information>
459                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
460                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
461                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
462                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
463                                         </onap-model-information>
464                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
465                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
466                                      </service-information>
467                                      <network-information>
468                                         <network-id>$resourceInstnaceId</network-id>
469                                         <onap-model-information>
470                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
471                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
472                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
473                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
474                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
475                                         </onap-model-information>
476                                      </network-information>
477                                      <network-request-input>
478                                        <network-input-parameters></network-input-parameters>
479                                      </network-request-input>
480                                 </sdncadapterworkflow:SDNCRequestData>
481                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
482             }
483
484             String sdncTopologyDeleteRequesAsString = utils.formatXml(sdncTopologyDeleteRequest)
485             execution.setVariable("sdncAdapterWorkflowRequest", sdncTopologyDeleteRequesAsString)
486             logger.info("sdncAdapterWorkflowRequest - " + "\n" +  sdncTopologyDeleteRequesAsString)
487
488         } catch (Exception ex) {
489             String exceptionMessage = " Bpmn error encountered in DeleteSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
490             logger.debug( exceptionMessage)
491             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
492
493         }
494         logger.info(" ***** Exit prepareSDNCRequest *****")
495     }
496
497     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
498         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
499         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
500         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
501     }
502
503     void prepareUpdateBeforeDeleteSDNCResource(DelegateExecution execution) {
504         logger.debug(" *** prepareUpdateBeforeDeleteSDNCResource *** ")
505         String resourceInput = execution.getVariable(Prefix + "resourceInput");
506         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
507         String operType = resourceInputObj.getOperationType()
508         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
509         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
510         String operationId = resourceInputObj.getOperationId()
511         String progress = "20"
512         String status = "processing"
513         String statusDescription = "SDCN resource delete invoked"
514
515         //String operationId = execution.getVariable("operationId")
516
517         String body = """
518                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
519                         xmlns:ns="http://org.onap.so/requestsdb">
520                         <soapenv:Header/>
521                 <soapenv:Body>
522                     <ns:updateResourceOperationStatus>
523                                <operType>${msoUtils.xmlEscape(operType)}</operType>
524                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
525                                <progress>${msoUtils.xmlEscape(progress)}</progress>
526                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
527                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
528                                <status>${msoUtils.xmlEscape(status)}</status>
529                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
530                     </ns:updateResourceOperationStatus>
531                 </soapenv:Body>
532                 </soapenv:Envelope>""";
533
534         setProgressUpdateVariables(execution, body)
535         logger.debug(" ***** Exit prepareUpdateBeforeDeleteSDNCResource *****")
536
537     }
538
539     void prepareUpdateAfterDeleteSDNCResource(DelegateExecution execution) {
540         logger.debug(" *** prepareUpdateAfterDeleteSDNCResource *** ")
541         String resourceInput = execution.getVariable(Prefix + "resourceInput");
542         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
543         String operType = resourceInputObj.getOperationType()
544         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
545         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
546         String operationId = resourceInputObj.getOperationId()
547         String progress = "100"
548         String status = "finished"
549         String statusDescription = "SDCN resource delete and deactivation completed"
550
551         //String operationId = execution.getVariable("operationId")
552
553         String body = """
554                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
555                         xmlns:ns="http://org.onap.so/requestsdb">
556                         <soapenv:Header/>
557                 <soapenv:Body>
558                     <ns:updateResourceOperationStatus>
559                                <operType>${msoUtils.xmlEscape(operType)}</operType>
560                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
561                                <progress>${msoUtils.xmlEscape(progress)}</progress>
562                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
563                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
564                                <status>${msoUtils.xmlEscape(status)}</status>
565                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
566                     </ns:updateResourceOperationStatus>
567                 </soapenv:Body>
568                 </soapenv:Envelope>""";
569
570         setProgressUpdateVariables(execution, body)
571         logger.debug(" ***** Exit prepareUpdateAfterDeleteSDNCResource *****")
572     }
573
574     void postDeleteSDNCCall(DelegateExecution execution){
575         logger.info(" ***** Started postDeleteSDNCCall *****")
576         String responseCode = execution.getVariable(Prefix + "sdncDeleteReturnCode")
577         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
578
579         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
580         logger.info(" ***** Exit postDeleteSDNCCall *****")
581     }
582
583     void sendSyncResponse (DelegateExecution execution) {
584         logger.debug( " *** sendSyncResponse *** ")
585
586         try {
587             String operationStatus = "finished"
588             // RESTResponse for main flow
589             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
590             logger.debug( " sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
591             sendWorkflowResponse(execution, 202, resourceOperationResp)
592             execution.setVariable("sentSyncResponse", true)
593
594         } catch (Exception ex) {
595             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
596             logger.debug( msg)
597             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
598         }
599         logger.debug(" ***** Exit sendSyncResponse *****")
600     }
601 }