Merge "add junit coverage for SvnfmService"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DeleteSDNCNetworkResource.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - SO
4  * ================================================================================
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  * 
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  * 
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts
24
25 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.so.client.aai.AAIObjectType
42 import org.onap.so.client.aai.AAIResourcesClient
43 import org.onap.so.client.aai.entities.AAIResultWrapper
44 import org.onap.so.client.aai.entities.uri.AAIResourceUri
45 import org.onap.so.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                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
225                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
226                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
227                                  <sdncadapter:RequestHeader>
228                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
229                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
230                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
231                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
232                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
233                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
234                                  </sdncadapter:RequestHeader>
235                                  <sdncadapterworkflow:SDNCRequestData>
236                                      <request-information>
237                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
238                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
239                                         <source>${msoUtils.xmlEscape(source)}</source>
240                                         <notification-url></notification-url>
241                                         <order-number></order-number>
242                                         <order-version></order-version>
243                                      </request-information>
244                                      <service-information>
245                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
246                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
247                                         <onap-model-information>
248                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
249                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
250                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
251                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
252                                         </onap-model-information>
253                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
254                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
255                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
256                                      </service-information>
257                                      <vnf-information>
258                                         <vnf-id>$resourceInstnaceId</vnf-id>
259                                         <vnf-type></vnf-type>
260                                         <onap-model-information>
261                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
262                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
263                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
264                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
265                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
266                                         </onap-model-information>
267                                      </vnf-information>
268                                      <vnf-request-input>
269                                          <vnf-input-parameters>
270                                          </vnf-input-parameters>
271                                          <request-version></request-version>
272                                          <vnf-name></vnf-name>
273                                          <vnf-networks>
274                                         </vnf-networks>
275                                       </vnf-request-input>
276                                 </sdncadapterworkflow:SDNCRequestData>
277                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
278                     break
279                 case "GROUP" :
280                     //When a new resource creation request reaches SO, the parent resources information needs to be provided
281                     //while creating the child resource.
282                     String vnfid = resourceInputObj.getVnfId()
283                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
284                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
285                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
286                     String vnfmodelUuid = vfModelInfo.getModelUuid()
287                     String vnfmodelVersion = vfModelInfo.getModelVersion()
288                     String vnfmodelName = vfModelInfo.getModelName()
289
290                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1" 
291                                                         xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
292                                                         xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
293                                   <sdncadapter:RequestHeader>
294                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
295                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
296                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
297                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
298                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
299                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
300                                   </sdncadapter:RequestHeader>
301                                   <sdncadapterworkflow:SDNCRequestData>
302                                     <request-information>
303                                       <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
304                                       <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
305                                       <source>${msoUtils.xmlEscape(source)}</source>
306                                       <notification-url></notification-url>
307                                       <order-number></order-number>
308                                       <order-version></order-version>
309                                     </request-information>
310                                     <service-information>
311                                       <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
312                                       <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
313                                       <onap-model-information>
314                                         <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
315                                         <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
316                                         <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
317                                         <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
318                                       </onap-model-information>
319                                       <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
320                                       <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
321                                       <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
322                                     </service-information>
323                                     <vnf-information>
324                                       <vnf-id>$vnfid</vnf-id>
325                                       <vnf-type></vnf-type>
326                                       <onap-model-information>
327                                         <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
328                                         <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
329                                         <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
330                                         <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
331                                         <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
332                                       </onap-model-information>
333                                     </vnf-information>
334                                     <vf-module-information>
335                                       <vf-module-id>$resourceInstnaceId</vf-module-id>
336                                       <vf-module-type></vf-module-type>
337                                       <from-preload>false</from-preload>
338                                       <onap-model-information>
339                                         <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
340                                         <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
341                                         <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
342                                         <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
343                                         <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
344                                       </onap-model-information>
345                                     </vf-module-information>
346                                     <vf-module-request-input>
347                                       <vf-module-input-parameters>
348                                       </vf-module-input-parameters>
349                                     </vf-module-request-input>
350                                   </sdncadapterworkflow:SDNCRequestData>
351                                 </aetgt:SDNCAdapterWorkflowRequest>""".trim()
352                     break
353
354                 // sdwanvpnattachment or sotnvpnattachment
355                 case "ALLOTTED_RESOURCE" :
356                     sdncTopologyDeleteRequest = """<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>connection-attachment-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></subscriber-name>
388                                      </service-information>
389                                      <allotted-resource-information>
390                                         <allotted-resource-id>$resourceInstnaceId</allotted-resource-id>
391                                         <allotted-resource-type></allotted-resource-type>
392                                         <parent-service-instance-id>$allotedParentServiceInstanceId</parent-service-instance-id>
393                                         <onap-model-information>
394                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
395                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
396                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
397                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
398                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
399                                         </onap-model-information>
400                                      </allotted-resource-information>
401                                      <connection-attachment-request-input>
402                                      </connection-attachment-request-input>
403                                 </sdncadapterworkflow:SDNCRequestData>
404                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
405
406                     break
407
408                 // for SDWANConnectivity and SOTNConnectivity:
409                 default:
410                     sdncTopologyDeleteRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
411                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1" 
412                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
413                                  <sdncadapter:RequestHeader>
414                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
415                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
416                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
417                                     <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
418                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
419                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
420                                  </sdncadapter:RequestHeader>
421                                  <sdncadapterworkflow:SDNCRequestData>
422                                      <request-information>
423                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
424                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
425                                         <source>${msoUtils.xmlEscape(source)}</source>
426                                         <notification-url></notification-url>
427                                         <order-number></order-number>
428                                         <order-version></order-version>
429                                      </request-information>
430                                      <service-information>
431                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
432                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
433                                         <onap-model-information>
434                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
435                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
436                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
437                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
438                                         </onap-model-information>
439                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
440                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
441                                      </service-information>
442                                      <network-information>
443                                         <network-id>$resourceInstnaceId</network-id>
444                                         <onap-model-information>
445                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
446                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
447                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
448                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
449                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
450                                         </onap-model-information>
451                                      </network-information>
452                                      <network-request-input>
453                                        <network-input-parameters></network-input-parameters>
454                                      </network-request-input>
455                                 </sdncadapterworkflow:SDNCRequestData>
456                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
457             }
458
459             String sdncTopologyDeleteRequesAsString = utils.formatXml(sdncTopologyDeleteRequest)
460             execution.setVariable("sdncAdapterWorkflowRequest", sdncTopologyDeleteRequesAsString)
461             logger.info("sdncAdapterWorkflowRequest - " + "\n" +  sdncTopologyDeleteRequesAsString)
462
463         } catch (Exception ex) {
464             String exceptionMessage = " Bpmn error encountered in DeleteSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
465             logger.debug( exceptionMessage)
466             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
467
468         }
469         logger.info(" ***** Exit prepareSDNCRequest *****")
470     }
471
472     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
473         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
474         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
475         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
476     }
477
478     void prepareUpdateBeforeDeleteSDNCResource(DelegateExecution execution) {
479         logger.debug(" *** prepareUpdateBeforeDeleteSDNCResource *** ")
480         String resourceInput = execution.getVariable(Prefix + "resourceInput");
481         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
482         String operType = resourceInputObj.getOperationType()
483         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
484         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
485         String operationId = resourceInputObj.getOperationId()
486         String progress = "20"
487         String status = "processing"
488         String statusDescription = "SDCN resource delete invoked"
489
490         //String operationId = execution.getVariable("operationId")
491
492         String body = """
493                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
494                         xmlns:ns="http://org.onap.so/requestsdb">
495                         <soapenv:Header/>
496                 <soapenv:Body>
497                     <ns:updateResourceOperationStatus>
498                                <operType>${msoUtils.xmlEscape(operType)}</operType>
499                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
500                                <progress>${msoUtils.xmlEscape(progress)}</progress>
501                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
502                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
503                                <status>${msoUtils.xmlEscape(status)}</status>
504                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
505                     </ns:updateResourceOperationStatus>
506                 </soapenv:Body>
507                 </soapenv:Envelope>""";
508
509         setProgressUpdateVariables(execution, body)
510         logger.debug(" ***** Exit prepareUpdateBeforeDeleteSDNCResource *****")
511
512     }
513
514     void prepareUpdateAfterDeleteSDNCResource(DelegateExecution execution) {
515         logger.debug(" *** prepareUpdateAfterDeleteSDNCResource *** ")
516         String resourceInput = execution.getVariable(Prefix + "resourceInput");
517         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
518         String operType = resourceInputObj.getOperationType()
519         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
520         String serviceInstanceId = resourceInputObj.getServiceInstanceId()
521         String operationId = resourceInputObj.getOperationId()
522         String progress = "100"
523         String status = "finished"
524         String statusDescription = "SDCN resource delete and deactivation completed"
525
526         //String operationId = execution.getVariable("operationId")
527
528         String body = """
529                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
530                         xmlns:ns="http://org.onap.so/requestsdb">
531                         <soapenv:Header/>
532                 <soapenv:Body>
533                     <ns:updateResourceOperationStatus>
534                                <operType>${msoUtils.xmlEscape(operType)}</operType>
535                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
536                                <progress>${msoUtils.xmlEscape(progress)}</progress>
537                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
538                                <serviceId>${msoUtils.xmlEscape(serviceInstanceId)}</serviceId>
539                                <status>${msoUtils.xmlEscape(status)}</status>
540                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
541                     </ns:updateResourceOperationStatus>
542                 </soapenv:Body>
543                 </soapenv:Envelope>""";
544
545         setProgressUpdateVariables(execution, body)
546         logger.debug(" ***** Exit prepareUpdateAfterDeleteSDNCResource *****")
547     }
548
549     void postDeleteSDNCCall(DelegateExecution execution){
550         logger.info(" ***** Started postDeleteSDNCCall *****")
551         String responseCode = execution.getVariable(Prefix + "sdncDeleteReturnCode")
552         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
553
554         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
555         logger.info(" ***** Exit postDeleteSDNCCall *****")
556     }
557
558     void sendSyncResponse (DelegateExecution execution) {
559         logger.debug( " *** sendSyncResponse *** ")
560
561         try {
562             String operationStatus = "finished"
563             // RESTResponse for main flow
564             String resourceOperationResp = """{"operationStatus":"${operationStatus}"}""".trim()
565             logger.debug( " sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
566             sendWorkflowResponse(execution, 202, resourceOperationResp)
567             execution.setVariable("sentSyncResponse", true)
568
569         } catch (Exception ex) {
570             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
571             logger.debug( msg)
572             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
573         }
574         logger.debug(" ***** Exit sendSyncResponse *****")
575     }
576 }