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