56a97bc271b73a0932f8213f3b269494112883ea
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * OPENECOMP - SO
4  * ================================================================================
5  * Copyright (C) 2018 Huawei Technologies Co., Ltd. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (c) 2019 Samsung
8  * ================================================================================
9  * Licensed under the Apache License, Version 2.0 (the "License")
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.so.bpmn.infrastructure.scripts
24
25
26 import org.apache.commons.lang3.*
27 import org.camunda.bpm.engine.delegate.BpmnError
28 import org.camunda.bpm.engine.delegate.DelegateExecution
29 import org.json.JSONObject
30 import org.json.XML
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aai.domain.yang.ServiceInstances
33 import org.onap.aai.domain.yang.v13.Metadata
34 import org.onap.aai.domain.yang.v13.Metadatum
35 import org.onap.so.bpmn.common.recipe.ResourceInput
36 import org.onap.so.bpmn.common.resource.ResourceRequestBuilder
37 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
38 import org.onap.so.bpmn.common.scripts.ExceptionUtil
39 import org.onap.so.bpmn.common.scripts.MsoUtils
40 import org.onap.so.bpmn.core.domain.ModelInfo
41 import org.onap.so.bpmn.core.domain.ResourceType
42 import org.onap.so.bpmn.core.json.JsonUtils
43 import org.onap.so.bpmn.core.UrnPropertiesReader
44 import org.onap.aaiclient.client.aai.AAIObjectPlurals
45 import org.onap.aaiclient.client.aai.AAIResourcesClient
46 import org.onap.aaiclient.client.aai.AAIObjectType
47 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
48 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
51
52 /**
53  * This groovy class supports the <class>CreateSDNCCNetworkResource.bpmn</class> process.
54  * flow for SDNC Network Resource Create
55  */
56 public class CreateSDNCNetworkResource extends AbstractServiceTaskProcessor {
57
58     private static final Logger logger = LoggerFactory.getLogger( CreateSDNCNetworkResource.class)
59     String Prefix="CRESDNCRES_"
60
61     ExceptionUtil exceptionUtil = new ExceptionUtil()
62
63     JsonUtils jsonUtil = new JsonUtils()
64
65     MsoUtils msoUtils = new MsoUtils()
66
67     public void preProcessRequest(DelegateExecution execution){
68
69         logger.info(" ***** Started preProcessRequest *****")
70         try {
71
72             //get bpmn inputs from resource request.
73             String requestId = execution.getVariable("mso-request-id")
74             String requestAction = execution.getVariable("requestAction")
75             logger.info("The requestAction is: " + requestAction)
76             String recipeParamsFromRequest = execution.getVariable("recipeParams")
77             logger.info("The recipeParams is: " + recipeParamsFromRequest)
78             String resourceInput = execution.getVariable("resourceInput")
79             logger.info("The resourceInput is: " + resourceInput)
80             //Get ResourceInput Object
81             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(resourceInput, ResourceInput.class)
82             execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
83
84             //Deal with recipeParams
85             String recipeParamsFromWf = execution.getVariable("recipeParamXsd")
86
87             //For sdnc requestAction default is "createNetworkInstance"
88             String operationType = "Network"
89             if(!StringUtils.isBlank(recipeParamsFromRequest)){
90                 //the operationType from worflow(first node) is second priority.
91                 operationType = jsonUtil.getJsonValue(recipeParamsFromRequest, "operationType")
92             }
93             if(!StringUtils.isBlank(recipeParamsFromWf)){
94                 //the operationType from worflow(first node) is highest priority.
95                 operationType = jsonUtil.getJsonValue(recipeParamsFromWf, "operationType")
96             }
97             String operationTypeFromConfig = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() + ".operation-type")
98             if (StringUtils.isNotEmpty(operationTypeFromConfig)) {
99                 // highest priority if operation type configured
100                 operationType = operationTypeFromConfig
101             }
102
103             String sdnc_svcAction = "create"
104             String sdnc_requestAction = sdnc_svcAction.capitalize() + operationType + "Instance"
105             String isActivateRequired = UrnPropertiesReader.getVariable("resource-config." + resourceInputObj.resourceModelInfo.getModelName() +".activation-required")
106             execution.setVariable("isActivateRequired", isActivateRequired)
107
108             execution.setVariable(Prefix + "svcAction", sdnc_svcAction)
109             execution.setVariable(Prefix + "requestAction", sdnc_requestAction)
110             execution.setVariable(Prefix + "serviceInstanceId", resourceInputObj.getServiceInstanceId())
111             execution.setVariable("mso-request-id", requestId)
112             execution.setVariable("mso-service-instance-id", resourceInputObj.getServiceInstanceId())
113         } catch (BpmnError e) {
114             throw e
115         } catch (Exception ex){
116             msg = "Exception in preProcessRequest " + ex.getMessage()
117             logger.debug(msg)
118             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
119         }
120     }
121
122     String customizeResourceParam(String networkInputParametersJson) {
123         List<Map<String, Object>> paramList = new ArrayList()
124         JSONObject jsonObject = new JSONObject(networkInputParametersJson)
125         Iterator iterator = jsonObject.keys()
126         while (iterator.hasNext()) {
127             String key = iterator.next()
128             HashMap<String, String> hashMap = new HashMap()
129             hashMap.put("name", key)
130             hashMap.put("value", jsonObject.get(key))
131             paramList.add(hashMap)
132         }
133         Map<String, List<Map<String, Object>>> paramMap = new HashMap()
134         paramMap.put("param", paramList)
135
136         return  new JSONObject(paramMap).toString()
137     }
138
139     private List<Metadatum> getMetaDatum(String customerId,
140                                          String serviceType, String serId) {
141         logger.debug("Enter getPnfInstance")
142         AAIResourcesClient client = new AAIResourcesClient()
143
144         // think how AAI queried for PNF name using the name
145         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE_METADATA,
146                 customerId, serviceType, serId)
147         logger.debug("uri for pnf get:" + uri.toString())
148
149         Metadata metadata = client.get(uri).asBean(Metadata.class).get()
150         return metadata.getMetadatum()
151     }
152
153     /**
154      * This method updates the resource input by collecting required info from AAI
155      * @param execution
156      */
157     public ResourceInput updateResourceInput(DelegateExecution execution) {
158         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
159         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
160
161
162         def resourceInputTmp = execution.getVariable(Prefix + "resourceInput")
163         String serInput = jsonUtil.getJsonValue(resourceInputTmp, "requestsInputs")
164
165         switch (modelName) {
166             case ~/[\w\s\W]*OLT[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
167             case ~/[\w\s\W]*AccessConnectivity[\w\s\W]*/ :
168                 // get the required properties and update in resource input
169
170                 def resourceInput = resourceInputObj.getResourceParameters()
171                 String incomingRequest = resourceInputObj.getRequestsInputs()
172                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
173                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
174                 String cvlan = jsonUtil.getJsonValue(serInput,
175                         "service.parameters.requestInputs.cvlan")
176                 String svlan = jsonUtil.getJsonValue(serInput,
177                         "service.parameters.requestInputs.svlan")
178                 String remoteId = jsonUtil.getJsonValue(serInput,
179                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
180                 String manufacturer = jsonUtil.getJsonValue(serInput,
181                         "service.parameters.requestInputs.ont_ont_manufacturer")
182                 String ontsn = jsonUtil.getJsonValue(serInput,
183                         "service.parameters.requestInputs.ont_ont_serial_num")
184
185                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.CVLAN", cvlan)
186                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.SVLAN", svlan)
187                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.remote_id", remoteId)
188                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
189                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ONTSN", ontsn)
190                 logger.debug("old resource input:" + resourceInputObj.toString())
191                 resourceInputObj.setResourceParameters(uResourceInput)
192                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
193                 logger.debug("new resource Input :" + resourceInputObj.toString())
194                 break
195
196             case ~/[\w\s\W]*EdgeInternetProfile[\w\s\W]*/ : // for backward compatibilty only, this case will be deprecated
197             case ~/[\w\s\W]*InternetProfile[\w\s\W]*/ :
198                 // get the required properties and update in resource input
199                 def resourceInput = resourceInputObj.getResourceParameters()
200                 String incomingRequest = resourceInputObj.getRequestsInputs()
201                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
202                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
203                 JSONObject inputParameters = new JSONObject(requestInputs)
204
205                 String cvlan = jsonUtil.getJsonValue(serInput,
206                         "service.parameters.requestInputs.cvlan")
207                 String svlan = jsonUtil.getJsonValue(serInput,
208                         "service.parameters.requestInputs.svlan")
209                 String manufacturer = jsonUtil.getJsonValue(serInput,
210                         "service.parameters.requestInputs.ont_ont_manufacturer")
211                 String remoteId = jsonUtil.getJsonValue(serInput,
212                         "service.parameters.requestInputs.edgeinternetprofile_ip_remote_id")
213                 String ontsn = jsonUtil.getJsonValue(serInput,
214                         "service.parameters.requestInputs.ont_ont_serial_num")
215                 String serviceType = jsonUtil.getJsonValue(serInput,
216                         "service.parameters.requestInputs.edgeinternetprofile_ip_service_type")
217                 String macAddr = jsonUtil.getJsonValue(serInput,
218                         "service.parameters.requestInputs.edgeinternetprofile_ip_rg_mac_addr")
219                 String upStream = jsonUtil.getJsonValue(serInput,
220                         "service.parameters.requestInputs.edgeinternetprofile_ip_upstream_speed")
221                 String downStream = jsonUtil.getJsonValue(serInput,
222                         "service.parameters.requestInputs.edgeinternetprofile_ip_downstream_speed")
223
224                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.c_vlan", cvlan)
225                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.s_vlan", svlan)
226                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.manufacturer", manufacturer)
227                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_remote_id", remoteId)
228                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ont_sn", ontsn)
229                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_service_type", serviceType)
230                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_rg_mac_addr", macAddr)
231                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_upstream_speed", upStream)
232                 uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.ip_downstream_speed", downStream)
233                 logger.debug("old resource input:" + resourceInputObj.toString())
234                 resourceInputObj.setResourceParameters(uResourceInput)
235                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
236                 logger.debug("new resource Input :" + resourceInputObj.toString())
237                 break
238
239
240             case ~/[\w\s\W]*SOTNConnectivity[\w\s\W]*/:
241
242                 def resourceInput = resourceInputObj.getResourceParameters()
243                 String incomingRequest = resourceInputObj.getRequestsInputs()
244                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
245                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
246                 JSONObject inputParameters = new JSONObject(requestInputs)
247                 if(inputParameters.has("local-access-provider-id")) {
248                     String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.access-provider-id", inputParameters.get("local-access-provider-id"))
249                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-client-id", inputParameters.get("local-access-client-id"))
250                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-topology-id", inputParameters.get("local-access-topology-id"))
251                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-ltp-id", inputParameters.get("local-access-ltp-id"))
252                     uResourceInput = jsonUtil.addJsonValue(uResourceInput, "requestInputs.access-node-id", inputParameters.get("local-access-node-id"))
253                     resourceInputObj.setResourceParameters(uResourceInput)
254                     execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
255                 }
256
257                 break
258
259             case ~/[\w\s\W]*UNI[\w\s\W]*/ :
260                 def resourceInput = resourceInputObj.getResourceParameters()
261                 String incomingRequest = resourceInputObj.getRequestsInputs()
262                 String serviceParameters = JsonUtils.getJsonValue(incomingRequest, "service.parameters")
263                 String requestInputs = JsonUtils.getJsonValue(serviceParameters, "requestInputs")
264                 JSONObject inputParameters = new JSONObject(requestInputs)
265                 String uResourceInput = jsonUtil.addJsonValue(resourceInput, "requestInputs.service-name", inputParameters.get("name"))
266                 resourceInputObj.setResourceParameters(uResourceInput)
267                 execution.setVariable(Prefix + "resourceInput", resourceInputObj.toString())
268                 execution.setVariable("isAsyncRequired", "Yes")
269                 break
270
271             case ~/[\w\s\W]*sdwanvpnattachment[\w\s\W]*/ :
272             case ~/[\w\s\W]*sotnvpnattachment[\w\s\W]*/ :
273             case ~/[\w\s\W]*SOTN-Attachment[\w\s\W]*/ :
274                 // fill attachment TP in networkInputParamJson
275                 def vpnName = StringUtils.containsIgnoreCase(modelName, "sotnvpnattachment") ? "sotnvpnattachmentvf_sotncondition_sotnVpnName" : (StringUtils.containsIgnoreCase(modelName, "SOTN-Attachment") ? "elinesotnattachmentvf0_elinesotnattachmentvfc0_sotnVpnName" : "sdwanvpnattachmentvf_sdwancondition_sdwanVpnName")
276                 fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
277
278                 break
279             default:
280                 // Special case for handling alloted resource types
281                 // in case name is different as expected
282                 if ("ALLOTTED_RESOURCE".equals(resourceInputObj.getResourceModelInfo().getModelType())) {
283                     def vpnName = modelName + "_sotnVpnName"
284                     fillAttachmentTPInfo(resourceInputObj, execution, vpnName)
285                 }
286                 break
287         }
288         return resourceInputObj
289     }
290
291     private void fillAttachmentTPInfo(ResourceInput resourceInputObj, DelegateExecution execution, String vpnName) {
292
293         String parentServiceName = jsonUtil.getJsonValueForKey(resourceInputObj.getRequestsInputs(), vpnName)
294
295         AAIResourcesClient client = new AAIResourcesClient()
296         logger.info("sending request to resolve vpn-name:" + vpnName)
297         AAIResourceUri uri = AAIUriFactory.createResourceUri(new AAIObjectPlurals("/nodes", "/service-instances", "queryByName")).queryParam("service-instance-name", parentServiceName)
298         Optional<ServiceInstances> serviceInstancesOpt = client.get(ServiceInstances.class, uri)
299
300         if(serviceInstancesOpt.isPresent()) {
301             List<ServiceInstance> serviceInstanceList = serviceInstancesOpt.get().getServiceInstance()
302             logger.info("response from aai:" + serviceInstanceList.toString())
303             if (serviceInstanceList.size() > 0) {
304                 ServiceInstance si = serviceInstanceList.get(0)
305                 String parentServiceInstanceId = si.getServiceInstanceId()
306                 execution.setVariable("parentServiceInstanceId", parentServiceInstanceId)
307                 logger.info("setting parentService id:" + parentServiceInstanceId)
308             } else {
309                 logger.error("No service instance found for given name.")
310             }
311         } else {
312             logger.error("No nodes found with this name" + vpnName)
313         }
314     }
315
316     /**
317      * Pre Process the BPMN Flow Request
318      * Includes:
319      * generate the nsOperationKey
320      * generate the nsParameters
321      */
322     public void prepareSDNCRequest (DelegateExecution execution) {
323         logger.info(" ***** Started prepareSDNCRequest *****")
324
325         try {
326             // get variables
327             String sdnc_svcAction = execution.getVariable(Prefix + "svcAction")
328             String sdnc_requestAction = execution.getVariable(Prefix + "requestAction")
329             String sdncCallback = execution.getVariable("URN_mso_workflow_sdncadapter_callback")
330             String createNetworkInput = execution.getVariable(Prefix + "networkRequest")
331
332             String parentServiceInstanceId = execution.getVariable("parentServiceInstanceId")
333             String hdrRequestId = execution.getVariable("mso-request-id")
334             String serviceInstanceId = execution.getVariable(Prefix + "serviceInstanceId")
335             String source = execution.getVariable("source")
336             String sdnc_service_id = execution.getVariable(Prefix + "sdncServiceId")
337             ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
338             String serviceType = resourceInputObj.getServiceType()
339             String serviceModelInvariantUuid = resourceInputObj.getServiceModelInfo().getModelInvariantUuid()
340             String serviceModelUuid = resourceInputObj.getServiceModelInfo().getModelUuid()
341             String serviceModelVersion = resourceInputObj.getServiceModelInfo().getModelVersion()
342             String serviceModelName = resourceInputObj.getServiceModelInfo().getModelName()
343             String globalCustomerId = resourceInputObj.getGlobalSubscriberId()
344             String modelInvariantUuid = resourceInputObj.getResourceModelInfo().getModelInvariantUuid()
345             String modelCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
346             String modelUuid = resourceInputObj.getResourceModelInfo().getModelUuid()
347             String modelName = resourceInputObj.getResourceModelInfo().getModelName()
348             String modelVersion = resourceInputObj.getResourceModelInfo().getModelVersion()
349             String resourceInputPrameters = resourceInputObj.getResourceParameters()
350             String networkInputParametersJson = jsonUtil.getJsonValue(resourceInputPrameters, "requestInputs")
351             //here convert json string to xml string
352             String netowrkInputParameters = XML.toString(new JSONObject(customizeResourceParam(networkInputParametersJson)))
353             // 1. prepare assign topology via SDNC Adapter SUBFLOW call
354             String sdncTopologyCreateRequest = ""
355
356             String modelType = resourceInputObj.getResourceModelInfo().getModelType()
357
358             switch (modelType) {
359                 case "VNF" :
360                                         if(modelName.contains("UNI") && "MDONS_OTN".equals(serviceType)){
361                                                 source = "SO"
362                                                 sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
363                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
364                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
365                                  <sdncadapter:RequestHeader>
366                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
367                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
368                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
369                                     <sdncadapter:SvcOperation>optical-service-create</sdncadapter:SvcOperation>
370                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
371                                     <sdncadapter:MsoAction>opticalservice</sdncadapter:MsoAction>
372                                  </sdncadapter:RequestHeader>
373                                  <sdncadapterworkflow:SDNCRequestData>
374                                     <request-id>${msoUtils.xmlEscape(serviceInstanceId)}</request-id>
375                                     <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
376                                     <service-type>${msoUtils.xmlEscape(serviceType)}</service-type>
377                                     <notification-url>sdncCallback</notification-url>
378                                     <source>${msoUtils.xmlEscape(source)}</source>
379                                     <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
380                                      <payload>
381                                          $netowrkInputParameters
382                                      </payload>
383                                 </sdncadapterworkflow:SDNCRequestData>
384                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
385                                         } else{
386                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
387                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
388                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
389                                  <sdncadapter:RequestHeader>
390                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
391                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
392                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
393                                     <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
394                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
395                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
396                                  </sdncadapter:RequestHeader>
397                                  <sdncadapterworkflow:SDNCRequestData>
398                                      <request-information>
399                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
400                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
401                                         <source>${msoUtils.xmlEscape(source)}</source>
402                                         <notification-url></notification-url>
403                                         <order-number></order-number>
404                                         <order-version></order-version>
405                                      </request-information>
406                                      <service-information>
407                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
408                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
409                                         <onap-model-information>
410                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
411                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
412                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
413                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
414                                         </onap-model-information>
415                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
416                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
417                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
418                                      </service-information>
419                                      <vnf-information>
420                                         <vnf-type></vnf-type>
421                                         <onap-model-information>
422                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
423                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
424                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
425                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
426                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
427                                         </onap-model-information>
428                                      </vnf-information>
429                                      <vnf-request-input>
430                                          <vnf-input-parameters>
431                                            $netowrkInputParameters
432                                          </vnf-input-parameters>
433                                          <request-version></request-version>
434                                          <vnf-name></vnf-name>
435                                          <vnf-networks>
436                                         </vnf-networks>
437                                       </vnf-request-input>
438                                 </sdncadapterworkflow:SDNCRequestData>
439                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
440                                         }
441                     break
442                 case "GROUP" :
443                     String vnfid = resourceInputObj.getVnfId()
444                     ModelInfo vfModelInfo = resourceInputObj.getVfModelInfo()
445                     String vnfmodelInvariantUuid = vfModelInfo.getModelInvariantUuid()
446                     String vnfmodelCustomizationUuid = vfModelInfo.getModelCustomizationUuid()
447                     String vnfmodelUuid = vfModelInfo.getModelUuid()
448                     String vnfmodelVersion = vfModelInfo.getModelVersion()
449                     String vnfmodelName = vfModelInfo.getModelName()
450                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
451                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
452                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
453                                  <sdncadapter:RequestHeader>
454                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
455                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
456                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
457                                     <sdncadapter:SvcOperation>vf-module-topology-operation</sdncadapter:SvcOperation>
458                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
459                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
460                                  </sdncadapter:RequestHeader>
461                                  <sdncadapterworkflow:SDNCRequestData>
462                                      <request-information>
463                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
464                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
465                                         <source>${msoUtils.xmlEscape(source)}</source>
466                                         <notification-url></notification-url>
467                                         <order-number></order-number>
468                                         <order-version></order-version>
469                                      </request-information>
470                                      <service-information>
471                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
472                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
473                                         <onap-model-information>
474                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
475                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
476                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
477                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
478                                         </onap-model-information>
479                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
480                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
481                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
482                                      </service-information>
483                                      <vnf-information>
484                                         <onap-model-information>
485                                              <model-invariant-uuid>${msoUtils.xmlEscape(vnfmodelInvariantUuid)}</model-invariant-uuid>
486                                              <model-customization-uuid>${msoUtils.xmlEscape(vnfmodelCustomizationUuid)}</model-customization-uuid>
487                                              <model-uuid>${msoUtils.xmlEscape(vnfmodelUuid)}</model-uuid>
488                                              <model-version>${msoUtils.xmlEscape(vnfmodelVersion)}</model-version>
489                                              <model-name>${msoUtils.xmlEscape(vnfmodelName)}</model-name>
490                                         </onap-model-information>
491                                         <vnf-id>${msoUtils.xmlEscape(vnfid)}</vnf-id>
492                                      </vnf-information>
493                                      <vf-module-information>
494                                         <from-preload>false</from-preload>
495                                         <onap-model-information>
496                                             <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
497                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
498                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
499                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
500                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
501                                         </onap-model-information>
502                                      </vf-module-information>
503                                      <vf-module-request-input>
504                                          <vf-module-input-parameters>
505                                            $netowrkInputParameters
506                                          </vf-module-input-parameters>
507                                       </vf-module-request-input>
508                                 </sdncadapterworkflow:SDNCRequestData>
509                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
510                     break
511
512                 // sdwanvpnattachment or sotnvpnattachment
513                 case "ALLOTTED_RESOURCE" :
514                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
515                                                               xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
516                                                               xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
517                                  <sdncadapter:RequestHeader>
518                                     <sdncadapter:RequestId>${msoUtils.xmlEscape(hdrRequestId)}</sdncadapter:RequestId>
519                                     <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
520                                     <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
521                                     <sdncadapter:SvcOperation>connection-attachment-topology-operation</sdncadapter:SvcOperation>
522                                     <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
523                                     <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
524                                  </sdncadapter:RequestHeader>
525                                  <sdncadapterworkflow:SDNCRequestData>
526                                      <request-information>
527                                         <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
528                                         <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
529                                         <source>${msoUtils.xmlEscape(source)}</source>
530                                         <notification-url></notification-url>
531                                         <order-number></order-number>
532                                         <order-version></order-version>
533                                      </request-information>
534                                      <service-information>
535                                         <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
536                                         <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
537                                         <onap-model-information>
538                                              <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
539                                              <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
540                                              <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
541                                              <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
542                                         </onap-model-information>
543                                         <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
544                                         <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
545                                         <subscriber-name>${msoUtils.xmlEscape(globalCustomerId)}</subscriber-name>
546                                      </service-information>
547                                      <allotted-resource-information>
548                                         <allotted-resource-id></allotted-resource-id>
549                                         <allotted-resource-type></allotted-resource-type>
550                                         <parent-service-instance-id>$parentServiceInstanceId</parent-service-instance-id>
551                                         <onap-model-information>
552                                              <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
553                                              <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
554                                              <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
555                                              <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
556                                              <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
557                                         </onap-model-information>
558                                      </allotted-resource-information>
559                                      <connection-attachment-request-input>
560                                        $netowrkInputParameters
561                                      </connection-attachment-request-input>
562                                 </sdncadapterworkflow:SDNCRequestData>
563                              </aetgt:SDNCAdapterWorkflowRequest>""".trim()
564
565                     break
566
567                 // for SDWANConnectivity and SOTNConnectivity:
568                 default:
569                     sdncTopologyCreateRequest = """<aetgt:SDNCAdapterWorkflowRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
570                                                xmlns:sdncadapter="http://org.onap.so/workflow/sdnc/adapter/schema/v1"
571                                                xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1">
572                                   <sdncadapter:RequestHeader>
573                                      <sdncadapter:RequestId>${hdrRequestId}</sdncadapter:RequestId>
574                                      <sdncadapter:SvcInstanceId>${msoUtils.xmlEscape(serviceInstanceId)}</sdncadapter:SvcInstanceId>
575                                      <sdncadapter:SvcAction>${msoUtils.xmlEscape(sdnc_svcAction)}</sdncadapter:SvcAction>
576                                      <sdncadapter:SvcOperation>network-topology-operation</sdncadapter:SvcOperation>
577                                      <sdncadapter:CallbackUrl>sdncCallback</sdncadapter:CallbackUrl>
578                                      <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
579                                   </sdncadapter:RequestHeader>
580                                   <sdncadapterworkflow:SDNCRequestData>
581                                       <request-information>
582                                          <request-id>${msoUtils.xmlEscape(hdrRequestId)}</request-id>
583                                          <request-action>${msoUtils.xmlEscape(sdnc_requestAction)}</request-action>
584                                          <source>${msoUtils.xmlEscape(source)}</source>
585                                          <notification-url></notification-url>
586                                          <order-number></order-number>
587                                          <order-version></order-version>
588                                       </request-information>
589                                       <service-information>
590                                          <service-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-id>
591                                          <subscription-service-type>${msoUtils.xmlEscape(serviceType)}</subscription-service-type>
592                                          <onap-model-information>
593                                               <model-invariant-uuid>${msoUtils.xmlEscape(serviceModelInvariantUuid)}</model-invariant-uuid>
594                                               <model-uuid>${msoUtils.xmlEscape(serviceModelUuid)}</model-uuid>
595                                               <model-version>${msoUtils.xmlEscape(serviceModelVersion)}</model-version>
596                                               <model-name>${msoUtils.xmlEscape(serviceModelName)}</model-name>
597                                          </onap-model-information>
598                                          <service-instance-id>${msoUtils.xmlEscape(serviceInstanceId)}</service-instance-id>
599                                          <global-customer-id>${msoUtils.xmlEscape(globalCustomerId)}</global-customer-id>
600                                       </service-information>
601                                       <network-information>
602                                          <onap-model-information>
603                                               <model-invariant-uuid>${msoUtils.xmlEscape(modelInvariantUuid)}</model-invariant-uuid>
604                                               <model-customization-uuid>${msoUtils.xmlEscape(modelCustomizationUuid)}</model-customization-uuid>
605                                               <model-uuid>${msoUtils.xmlEscape(modelUuid)}</model-uuid>
606                                               <model-version>${msoUtils.xmlEscape(modelVersion)}</model-version>
607                                               <model-name>${msoUtils.xmlEscape(modelName)}</model-name>
608                                          </onap-model-information>
609                                       </network-information>
610                                       <network-request-input>
611                                         <network-input-parameters>$netowrkInputParameters</network-input-parameters>
612                                       </network-request-input>
613                                  </sdncadapterworkflow:SDNCRequestData>
614                               </aetgt:SDNCAdapterWorkflowRequest>""".trim()
615
616
617             }
618
619             String sndcTopologyCreateRequesAsString = utils.formatXml(sdncTopologyCreateRequest)
620             execution.setVariable("sdncAdapterWorkflowRequest", sndcTopologyCreateRequesAsString)
621             logger.debug("sdncAdapterWorkflowRequest - " + "\n" +  sndcTopologyCreateRequesAsString)
622
623         } catch (Exception ex) {
624             String exceptionMessage = " Bpmn error encountered in CreateSDNCCNetworkResource flow. prepareSDNCRequest() - " + ex.getMessage()
625             logger.debug(exceptionMessage)
626             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, exceptionMessage)
627
628         }
629         logger.info(" ***** Exit prepareSDNCRequest *****")
630     }
631
632     private void setProgressUpdateVariables(DelegateExecution execution, String body) {
633         def dbAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.openecomp.db.endpoint", execution)
634         execution.setVariable("CVFMI_dbAdapterEndpoint", dbAdapterEndpoint)
635         execution.setVariable("CVFMI_updateResOperStatusRequest", body)
636     }
637
638     public void prepareUpdateBeforeCreateSDNCResource(DelegateExecution execution) {
639         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
640         String operType = resourceInputObj.getOperationType()
641         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
642         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
643         String operationId = resourceInputObj.getOperationId()
644         String progress = "20"
645         String status = "processing"
646         String statusDescription = "SDCN resource creation invoked"
647
648         execution.getVariable("operationId")
649
650         String body = """
651                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
652                         xmlns:ns="http://org.onap.so/requestsdb">
653                         <soapenv:Header/>
654                 <soapenv:Body>
655                     <ns:updateResourceOperationStatus>
656                                <operType>${msoUtils.xmlEscape(operType)}</operType>
657                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
658                                <progress>${msoUtils.xmlEscape(progress)}</progress>
659                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
660                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
661                                <status>${msoUtils.xmlEscape(status)}</status>
662                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
663                     </ns:updateResourceOperationStatus>
664                 </soapenv:Body>
665                 </soapenv:Envelope>"""
666
667         setProgressUpdateVariables(execution, body)
668
669     }
670
671     public void prepareUpdateAfterCreateSDNCResource(execution) {
672         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
673         String operType = resourceInputObj.getOperationType()
674         String resourceCustomizationUuid = resourceInputObj.getResourceModelInfo().getModelCustomizationUuid()
675         String ServiceInstanceId = resourceInputObj.getServiceInstanceId()
676         String operationId = resourceInputObj.getOperationId()
677         String progress = "100"
678         String status = "finished"
679         String statusDescription = "SDCN resource creation and activation completed"
680
681         execution.getVariable("operationId")
682
683         String body = """
684                 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
685                         xmlns:ns="http://org.onap.so/requestsdb">
686                         <soapenv:Header/>
687                 <soapenv:Body>
688                     <ns:updateResourceOperationStatus>
689                                <operType>${msoUtils.xmlEscape(operType)}</operType>
690                                <operationId>${msoUtils.xmlEscape(operationId)}</operationId>
691                                <progress>${msoUtils.xmlEscape(progress)}</progress>
692                                <resourceTemplateUUID>${msoUtils.xmlEscape(resourceCustomizationUuid)}</resourceTemplateUUID>
693                                <serviceId>${msoUtils.xmlEscape(ServiceInstanceId)}</serviceId>
694                                <status>${msoUtils.xmlEscape(status)}</status>
695                                <statusDescription>${msoUtils.xmlEscape(statusDescription)}</statusDescription>
696                     </ns:updateResourceOperationStatus>
697                 </soapenv:Body>
698                 </soapenv:Envelope>"""
699
700         setProgressUpdateVariables(execution, body)
701     }
702
703     public void afterCreateSDNCCall(DelegateExecution execution){
704         logger.info(" ***** Started prepareSDNCRequest *****")
705         String responseCode = execution.getVariable(Prefix + "sdncCreateReturnCode")
706         String responseObj = execution.getVariable(Prefix + "SuccessIndicator")
707
708         def instnaceId = getInstanceId(execution)
709         execution.setVariable("resourceInstanceId", instnaceId)
710
711         logger.info("response from sdnc, response code :" + responseCode + "  response object :" + responseObj)
712         logger.info(" ***** Exit prepareSDNCRequest *****")
713     }
714
715     private def getInstanceId(DelegateExecution execution) {
716         def response  = new XmlSlurper().parseText(execution.getVariable("CRENWKI_createSDNCResponse"))
717
718         ResourceInput resourceInputObj = ResourceRequestBuilder.getJsonObject(execution.getVariable(Prefix + "resourceInput"), ResourceInput.class)
719         String modelName = resourceInputObj.getResourceModelInfo().getModelName()
720         def val = ""
721
722         String modelType = resourceInputObj.getResourceModelInfo().getModelType()
723         switch (modelType) {
724             case "VNF" :
725                 val = response."response-data"."RequestData"."output"."vnf-response-information"."instance-id"
726                 break
727             case "GROUP":
728                 val = response."response-data"."RequestData"."output"."vf-module-response-information"."instance-id"
729                 break
730             case "ALLOTTED_RESOURCE":
731                 // sdwanvpnattachment or sotnvpnattachment
732                 val = response."response-data"."RequestData"."output"."connection-attachment-response-information"."instance-id"
733                 break
734             default:
735                 // SDWANConnectivity or SOTN Connectivity
736                 val = response."response-data"."RequestData"."output"."network-response-information"."instance-id"
737                 break
738         }
739         return val.toString()
740     }
741
742     public void sendSyncResponse (DelegateExecution execution) {
743         logger.debug(" *** sendSyncResponse *** ")
744
745         try {
746             String operationStatus = "finished"
747             // RESTResponse for main flow
748             String vnfid=execution.getVariable("resourceInstanceId")
749             String resourceOperationResp = """{"operationStatus":"${operationStatus}","vnf-id":"${vnfid}"}""".trim()
750             logger.debug(" sendSyncResponse to APIH:" + "\n" + resourceOperationResp)
751             sendWorkflowResponse(execution, 202, resourceOperationResp)
752             execution.setVariable("sentSyncResponse", true)
753
754         } catch (Exception ex) {
755             String msg = "Exception in sendSyncResponse:" + ex.getMessage()
756             logger.debug(msg)
757             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
758         }
759         logger.debug(" ***** Exit sendSyncResponse *****")
760     }
761 }