Merge "added in fix for new vnfc model id populate in"
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoAllocateNSIandNSSI.groovy
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  # Copyright (c) 2020, CMCC Technologies Co., Ltd.
6  #
7  # Licensed under the Apache License, Version 2.0 (the "License")
8  # you may not use this file except in compliance with the License.
9  # You may obtain a copy of the License at
10  #
11  #       http://www.apache.org/licenses/LICENSE-2.0
12  #
13  # Unless required by applicable law or agreed to in writing, software
14  # distributed under the License is distributed on an "AS IS" BASIS,
15  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  # See the License for the specific language governing permissions and
17  # limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.so.bpmn.infrastructure.scripts
22
23 import org.onap.so.beans.nsmf.NsiInfo
24 import org.onap.so.beans.nsmf.SliceProfileAdapter
25 import org.onap.so.beans.nsmf.oof.SubnetType
26 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
27 import javax.ws.rs.NotFoundException
28 import org.camunda.bpm.engine.delegate.BpmnError
29 import org.camunda.bpm.engine.delegate.DelegateExecution
30 import org.onap.aai.domain.yang.Relationship
31 import org.onap.aai.domain.yang.ServiceInstance
32 import org.onap.aai.domain.yang.SliceProfile
33 import org.onap.aaiclient.client.aai.AAIResourcesClient
34 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
35 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
36 import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
37 import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder
38 import org.onap.so.beans.nsmf.AllocateAnNssi
39 import org.onap.so.beans.nsmf.AllocateCnNssi
40 import org.onap.so.beans.nsmf.AllocateTnNssi
41 import org.onap.so.beans.nsmf.EsrInfo
42 import org.onap.so.beans.nsmf.NssiResponse
43 import org.onap.so.beans.nsmf.NssmfAdapterNBIRequest
44 import org.onap.so.beans.nsmf.ServiceInfo
45 import org.onap.so.beans.nsmf.SliceTaskInfo
46 import org.onap.so.beans.nsmf.SliceTaskParamsAdapter
47 import org.onap.so.bpmn.common.scripts.ExceptionUtil
48 import org.onap.so.bpmn.core.json.JsonUtils
49 import org.slf4j.Logger
50 import org.slf4j.LoggerFactory
51 import static org.apache.commons.lang3.StringUtils.isBlank
52
53 class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
54
55     private static final Logger logger = LoggerFactory.getLogger(DoAllocateNSIandNSSI.class);
56
57     ExceptionUtil exceptionUtil = new ExceptionUtil()
58
59     JsonUtils jsonUtil = new JsonUtils()
60
61     AAIResourcesClient client = getAAIClient()
62
63     /**
64      * Pre Process the BPMN Flow Request
65      * Inclouds:
66      * generate the nsOperationKey
67      * generate the nsParameters
68      */
69
70     void preProcessRequest (DelegateExecution execution) {
71         String msg = ""
72         logger.trace("Enter preProcessRequest()")
73         Map<String, Object> nssiMap = new HashMap<>()
74         execution.setVariable("nssiMap", nssiMap)
75         boolean isMoreNSSTtoProcess = true
76         execution.setVariable("isMoreNSSTtoProcess", isMoreNSSTtoProcess)
77         List<String> nsstSequence = new ArrayList<>(Arrays.asList("cn"))
78         execution.setVariable("nsstSequence", nsstSequence)
79         logger.trace("Exit preProcessRequest")
80     }
81
82     /**
83      * Process NSI options
84      * @param execution
85      */
86     void retriveSliceOption(DelegateExecution execution) {
87         logger.trace("Enter retriveSliceOption() of DoAllocateNSIandNSSI")
88
89         boolean isNSIOptionAvailable
90
91         SliceTaskParamsAdapter sliceParams =
92                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
93
94         if(isBlank(sliceParams.getSuggestNsiId())) {
95             isNSIOptionAvailable = false
96         }
97         else {
98             isNSIOptionAvailable = true
99             execution.setVariable('nsiServiceInstanceId', sliceParams.getSuggestNsiId())
100             execution.setVariable('nsiServiceInstanceName', sliceParams.getSuggestNsiName())
101         }
102         execution.setVariable("isNSIOptionAvailable", isNSIOptionAvailable)
103         logger.trace("Exit retriveSliceOption() of DoAllocateNSIandNSSI")
104     }
105
106
107     /**
108      * create nsi instance in aai
109      * @param execution
110      */
111     void createNSIinAAI(DelegateExecution execution) {
112         logger.debug("Enter CreateNSIinAAI in DoAllocateNSIandNSSI()")
113
114         String sliceInstanceId = UUID.randomUUID().toString()
115         SliceTaskParamsAdapter sliceParams =
116                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
117
118         //set new nsiId to sliceParams suggestNsiId
119         sliceParams.setSuggestNsiId(sliceInstanceId)
120
121         ServiceInstance nsi = new ServiceInstance()
122
123
124         String sliceInstanceName = "nsi_"+execution.getVariable("sliceServiceInstanceName")
125         String serviceType = execution.getVariable("serviceType")
126         String serviceStatus = "deactivated"
127         String modelInvariantUuid = sliceParams.getNSTInfo().invariantUUID
128         String modelUuid = sliceParams.getNSTInfo().UUID
129
130         String uuiRequest = execution.getVariable("uuiRequest")
131         String serviceInstanceLocationid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.plmnIdList")
132         String serviceRole = "nsi"
133
134         execution.setVariable("sliceInstanceId", sliceInstanceId)
135         nsi.setServiceInstanceId(sliceInstanceId)
136         nsi.setServiceInstanceName(sliceInstanceName)
137         nsi.setServiceType(serviceType)
138         nsi.setOrchestrationStatus(serviceStatus)
139         nsi.setModelInvariantId(modelInvariantUuid)
140         nsi.setModelVersionId(modelUuid)
141         nsi.setServiceInstanceLocationId(serviceInstanceLocationid)
142         nsi.setServiceRole(serviceRole)
143         String msg
144         try {
145
146             AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
147                     .customer(execution.getVariable("globalSubscriberId"))
148                     .serviceSubscription(execution.getVariable("subscriptionServiceType"))
149                     .serviceInstance(sliceInstanceId))
150             client.create(nsiServiceUri, nsi)
151
152             execution.setVariable("nsiServiceUri", nsiServiceUri)
153
154         } catch (BpmnError e) {
155             throw e
156         } catch (Exception ex) {
157             msg = "Exception in DoAllocateNSIandNSSI.createNSIinAAI: " + ex.getMessage()
158             logger.info(msg)
159             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
160         }
161         execution.setVariable("sliceTaskParams", sliceParams)
162
163         logger.debug("Exit CreateNSIinAAI in DoAllocateNSIandNSSI()")
164     }
165
166
167     /**
168      * create relationship between nsi and service profile instance
169      * @param execution
170      */
171     void createRelationship(DelegateExecution execution) {
172         //relation ship
173         logger.debug("Enter createRelationship in DoAllocateNSIandNSSI")
174         //String allottedResourceId = execution.getVariable("allottedResourceId")
175         //SliceTaskParamsAdapter sliceParams =
176         //        execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
177         String msg
178         try {
179
180             AAIResourceUri nsiServiceUri = execution.getVariable("nsiServiceUri") as AAIResourceUri
181             logger.debug("Creating Allotted resource relationship, nsiServiceUri: " + nsiServiceUri.toString())
182
183             //AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(execution.getVariable("subscriptionServiceType")).serviceInstance(sliceParams.suggestNsiId).allottedResource(allottedResourceId))
184
185             AAIResourceUri allottedResourceUri = execution.getVariable("allottedResourceUri") as AAIResourceUri
186             logger.debug("Creating Allotted resource relationship, allottedResourceUri: " + allottedResourceUri.toString())
187
188             client.connect(allottedResourceUri, nsiServiceUri)
189         } catch (BpmnError e) {
190             throw e
191         } catch (Exception ex) {
192             msg = "Exception in DoAllocateNSIandNSSI.createRelationship. " + ex.getMessage()
193             logger.info(msg)
194             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
195         }
196         logger.debug("Exit createRelationship in DoAllocateNSIandNSSI")
197     }
198
199     /**
200      *
201      * @param execution
202      */
203     void updateRelationship(DelegateExecution execution) {
204         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
205         //todo: allottedResourceId
206         String allottedResourceId = execution.getVariable("allottedResourceId")
207         //Need to check whether nsi exist : Begin
208
209         SliceTaskParamsAdapter sliceParams =
210                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
211
212         String nsiServiceInstanceID = sliceParams.getSuggestNsiId()
213         //sliceParams.setServiceId(nsiServiceInstanceID)
214
215         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
216                 .customer(execution.getVariable("globalSubscriberId"))
217                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
218                 .serviceInstance(nsiServiceInstanceID))
219
220         try {
221             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
222             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
223             if (!si.isPresent()) {
224                 String msg = "NSI suggested in the option doesn't exist. " + nsiServiceInstanceID
225                 logger.debug(msg)
226                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
227             }
228
229             //AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(execution.getVariable("subscriptionServiceType")).serviceInstance(sliceParams.suggestNsiId).allottedResource(allottedResourceId))
230             AAIResourceUri allottedResourceUri = execution.getVariable("allottedResourceUri") as AAIResourceUri
231             logger.debug("updateRelationship Allotted resource relationship, allottedResourceUri: " + allottedResourceUri.toString())
232             client.connect(allottedResourceUri, nsiServiceUri)
233
234             execution.setVariable("sliceTaskParams", sliceParams)
235         }catch(BpmnError e) {
236             throw e
237         }catch (Exception ex){
238             String msg = "NSI suggested in the option doesn't exist. " + nsiServiceInstanceID
239             logger.debug(msg)
240             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
241         }
242         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
243     }
244
245     /**
246      * create RAN Slice Profile Instance
247      * @param execution
248      */
249     void createAnSliceProfileInstance(DelegateExecution execution) {
250
251         String globalSubscriberId = execution.getVariable("globalSubscriberId")
252         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
253         String serviceInstanceId = UUID.randomUUID().toString()
254         execution.setVariable("ranSliceProfileInstanceId", serviceInstanceId) //todo:
255
256         String oStatus = "deactivated"
257
258         SliceTaskParamsAdapter sliceParams =
259                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
260         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
261         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
262
263         // create slice profile
264         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
265
266         //timestamp format YYYY-MM-DD hh:mm:ss
267         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
268
269         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
270                 .customer(globalSubscriberId)
271                 .serviceSubscription(subscriptionServiceType)
272                 .serviceInstance(serviceInstanceId))
273         client.create(uri, rspi)
274
275         execution.setVariable("sliceTaskParams", sliceParams)
276     }
277
278     /**
279      * create An Slice Profile
280      * @param execution
281      */
282     void createAnSliceProfile(DelegateExecution execution) {
283
284         String globalSubscriberId = execution.getVariable("globalSubscriberId")
285         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
286         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
287
288         SliceTaskParamsAdapter sliceParams =
289                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
290         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
291         SliceProfileAdapter anSliceProfile = sliceTaskInfo.sliceProfile
292
293         String profileId = UUID.randomUUID().toString()
294         anSliceProfile.setSliceProfileId(profileId)
295
296         SliceProfile sliceProfile = new SliceProfile()
297         sliceProfile.setProfileId(profileId)
298         sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList)
299         //todo:...
300         AAIResourceUri uri = AAIUriFactory.createResourceUri(
301             AAIFluentTypeBuilder.business().customer(globalSubscriberId)
302             .serviceSubscription(subscriptionServiceType)
303             .serviceInstance(sliceTaskInfo.sliceInstanceId)
304             .sliceProfile(profileId)
305         )
306         client.create(uri, sliceProfile)
307         execution.setVariable("sliceTaskParams", sliceParams)
308     }
309
310     /**
311      * prepare AllocateAnNssi
312      * @param execution
313      */
314     void prepareAllocateAnNssi(DelegateExecution execution) {
315
316         //todo:
317         SliceTaskParamsAdapter sliceParams =
318                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
319         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
320
321         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
322
323         AllocateAnNssi allocateAnNssi = new AllocateAnNssi()
324         allocateAnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2AnProfile()
325         allocateAnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
326         allocateAnNssi.nssiId = sliceTaskInfo.suggestNssiId
327         allocateAnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
328         NsiInfo nsiInfo = new NsiInfo()
329         nsiInfo.nsiId = sliceParams.suggestNsiId
330         allocateAnNssi.nsiInfo = nsiInfo
331
332         EsrInfo esrInfo = new EsrInfo()
333         //todo: vendor and network
334         esrInfo.setVendor(sliceTaskInfo.getVendor())
335         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
336
337         String globalSubscriberId = execution.getVariable("globalSubscriberId")
338         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
339
340         //todo: service info
341         ServiceInfo serviceInfo = new ServiceInfo()
342         serviceInfo.globalSubscriberId = globalSubscriberId
343         serviceInfo.subscriptionServiceType = subscriptionServiceType
344         serviceInfo.nsiId = sliceParams.suggestNsiId
345         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
346         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
347
348         nbiRequest.setServiceInfo(serviceInfo)
349         nbiRequest.setEsrInfo(esrInfo)
350         nbiRequest.setAllocateAnNssi(allocateAnNssi)
351
352         execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
353         execution.setVariable("anSliceTaskInfo", sliceTaskInfo)
354         execution.setVariable("anSubnetType", SubnetType.AN)
355     }
356
357
358     /**
359      * create RAN Slice Profile Instance
360      * @param execution
361      */
362     void createCnSliceProfileInstance(DelegateExecution execution) {
363
364         String globalSubscriberId = execution.getVariable("globalSubscriberId")
365         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
366         String serviceInstanceId = UUID.randomUUID().toString()
367         execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
368
369         String oStatus = "deactivated"
370
371         SliceTaskParamsAdapter sliceParams =
372                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
373         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
374         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
375
376         // create slice profile
377         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
378
379         //timestamp format YYYY-MM-DD hh:mm:ss
380         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
381
382         execution.setVariable("communicationServiceInstance", rspi)
383
384         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
385                 .customer(globalSubscriberId)
386                 .serviceSubscription(subscriptionServiceType)
387                 .serviceInstance(serviceInstanceId))
388         client.create(uri, rspi)
389         execution.setVariable("sliceTaskParams", sliceParams)
390     }
391
392     /**
393      * create Cn Slice Profile
394      * @param execution
395      */
396     void createCnSliceProfile(DelegateExecution execution) {
397
398         String globalSubscriberId = execution.getVariable("globalSubscriberId")
399         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
400         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
401
402         SliceTaskParamsAdapter sliceParams =
403                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
404
405         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
406         SliceProfileAdapter cnSliceProfile = sliceTaskInfo.sliceProfile
407
408         String profileId = UUID.randomUUID().toString()
409         cnSliceProfile.setSliceProfileId(profileId)
410
411         SliceProfile sliceProfile = new SliceProfile()
412         sliceProfile.setProfileId(profileId)
413         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
414         //todo:...
415         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
416                 .customer(globalSubscriberId)
417                 .serviceSubscription(subscriptionServiceType)
418                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
419                 .sliceProfile(profileId))
420         client.create(uri, sliceProfile)
421         execution.setVariable("sliceTaskParams", sliceParams)
422     }
423
424     /**
425      * prepare AllocateCnNssi
426      * @param execution
427      */
428     void prepareAllocateCnNssi(DelegateExecution execution) {
429
430         //todo:
431         SliceTaskParamsAdapter sliceParams =
432                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
433         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
434
435         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
436
437         AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
438         allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
439         allocateCnNssi.nssiId = sliceTaskInfo.suggestNssiId
440         allocateCnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
441         allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2CnProfile()
442         NsiInfo nsiInfo = new NsiInfo()
443         nsiInfo.nsiId = sliceParams.suggestNsiId
444         allocateCnNssi.nsiInfo = nsiInfo
445
446         EsrInfo esrInfo = new EsrInfo()
447         //todo: vendor and network
448         esrInfo.setVendor(sliceTaskInfo.getVendor())
449         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
450
451         String globalSubscriberId = execution.getVariable("globalSubscriberId")
452         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
453
454         //todo: service info
455         ServiceInfo serviceInfo = new ServiceInfo()
456         serviceInfo.globalSubscriberId = globalSubscriberId
457         serviceInfo.subscriptionServiceType = subscriptionServiceType
458         serviceInfo.nsiId = sliceParams.suggestNsiId
459         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
460         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
461         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId //if shared
462
463         nbiRequest.setServiceInfo(serviceInfo)
464         nbiRequest.setEsrInfo(esrInfo)
465         nbiRequest.setAllocateCnNssi(allocateCnNssi)
466
467         execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
468         execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
469         execution.setVariable("cnSubnetType", SubnetType.CN)
470     }
471
472
473     /**
474      * create TN Slice Profile Instance
475      * @param execution
476      */
477     void createTnBHSliceProfileInstance(DelegateExecution execution) {
478         String globalSubscriberId = execution.getVariable("globalSubscriberId")
479         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
480
481         String oStatus = "deactivated"
482
483         SliceTaskParamsAdapter sliceParams =
484                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
485
486         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
487         String serviceInstanceId = UUID.randomUUID().toString()
488
489         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
490         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
491
492         // create slice profile
493         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
494
495         //timestamp format YYYY-MM-DD hh:mm:ss
496         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
497
498         execution.setVariable("communicationServiceInstance", rspi)
499
500         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
501                 .customer(globalSubscriberId)
502                 .serviceSubscription(subscriptionServiceType)
503                 .serviceInstance(serviceInstanceId))
504         client.create(uri, rspi)
505
506         execution.setVariable("sliceTaskParams", sliceParams)
507     }
508
509     /**
510      * create Tn Slice Profile
511      * @param execution
512      */
513     void createTnBHSliceProfile(DelegateExecution execution) {
514
515         String globalSubscriberId = execution.getVariable("globalSubscriberId")
516         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
517
518         SliceTaskParamsAdapter sliceParams =
519                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
520
521         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
522
523         SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
524         String profileId = UUID.randomUUID().toString()
525         tnSliceProfile.setSliceProfileId(profileId)
526
527         SliceProfile sliceProfile = new SliceProfile()
528         sliceProfile.setProfileId(profileId)
529         //todo:...
530         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
531                 .customer(globalSubscriberId)
532                 .serviceSubscription(subscriptionServiceType)
533                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
534                 .sliceProfile(profileId))
535         client.create(uri, sliceProfile)
536
537         execution.setVariable("sliceTaskParams", sliceParams)
538     }
539
540     /**
541      * prepare AllocateCnNssi
542      * @param execution
543      */
544     void prepareAllocateTnBHNssi(DelegateExecution execution) {
545
546         //todo:
547         SliceTaskParamsAdapter sliceParams =
548                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
549         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
550
551         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
552
553         AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
554         //todo: AllocateTnNssi
555         //todo: endpointId -> set into tn
556         allocateTnNssi.setTransportSliceNetworks()
557         allocateTnNssi.setNetworkSliceInfos()
558
559
560
561         //allocateTnNssi.networkSliceInfos
562
563         EsrInfo esrInfo = new EsrInfo()
564         esrInfo.setVendor(sliceTaskInfo.getVendor())
565         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
566
567         String globalSubscriberId = execution.getVariable("globalSubscriberId")
568         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
569
570         ServiceInfo serviceInfo = new ServiceInfo()
571         serviceInfo.globalSubscriberId = globalSubscriberId
572         serviceInfo.subscriptionServiceType = subscriptionServiceType
573         serviceInfo.nsiId = sliceParams.suggestNsiId
574         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
575         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
576         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
577
578         nbiRequest.setServiceInfo(serviceInfo)
579         nbiRequest.setEsrInfo(esrInfo)
580         nbiRequest.setAllocateTnNssi(allocateTnNssi)
581
582         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
583         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
584         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
585     }
586
587     /**
588      * Update relationship between
589      * 1. NSI and NSSI
590      * 2. Slice Profile and Service Profile
591      * 3. SliceProfile and NSSI
592      * 4. sliceProfile and endpoint
593      *
594      * @param execution
595      */
596     public void updateAnRelationship(DelegateExecution execution) {
597         //todo:
598         SliceTaskParamsAdapter sliceParams =
599                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
600
601         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
602         String nssiId = result.getNssiId()
603         String nsiId = sliceParams.getSuggestNsiId()
604         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
605         String serviceProfileInstanceId = sliceParams.serviceId
606         //nsi id
607         //todo: aai -> nssi -> relationship -> endpointId -> set into tn
608         String endPointId = getEndpointIdFromAAI(execution, nssiId)
609         execution.setVariable("endPointIdAn", endPointId)
610
611         updateRelationship(execution, nsiId, nssiId)
612
613         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
614
615         updateRelationship(execution, sliceProfileInstanceId, nssiId)
616
617         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
618         execution.setVariable("sliceTaskParams", sliceParams)
619     }
620
621
622     /**
623      * Update relationship between
624      * 1. NSI and NSSI
625      * 2. Slice Profile and Service Profile
626      * 3. SliceProfile and NSSI
627      *
628      * @param execution
629      */
630     public void updateCnRelationship(DelegateExecution execution) {
631         //todo:
632         SliceTaskParamsAdapter sliceParams =
633                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
634
635         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
636         String nssiId = result.getNssiId()
637         String nsiId = sliceParams.getSuggestNsiId()
638         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
639         String serviceProfileInstanceId = sliceParams.serviceId
640         //nsi id
641         //todo: aai -> nssi -> relationship -> endpointId -> set into tn
642         String endPointId = getEndpointIdFromAAI(execution, nssiId)
643         execution.setVariable("endPointIdCn", endPointId)
644
645         updateRelationship(execution, nsiId, nssiId)
646
647         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
648
649         updateRelationship(execution,sliceProfileInstanceId, nssiId)
650
651         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
652         execution.setVariable("sliceTaskParams", sliceParams)
653     }
654
655     /**
656      * get endpoint Id from AAI by nssi id
657      * @param execution
658      * @param nssiId
659      * @return
660      */
661     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
662         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
663         //todo: allottedResourceId
664
665         SliceTaskParamsAdapter sliceParams =
666                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
667
668         //sliceParams.setServiceId(nsiServiceInstanceID)
669         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
670                 .customer(execution.getVariable("globalSubscriberId"))
671                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
672                 .serviceInstance(nssiId))
673
674         String endpointId = null
675
676         try {
677             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
678             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
679             if (!si.isPresent()) {
680                 String msg = "NSSI in the option doesn't exist. " + nssiId
681                 logger.debug(msg)
682                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
683             } else {
684                 ServiceInstance nssiInstance = si.get()
685                 //todo: handle relationship and return endpointId
686                 if (nssiInstance.relationshipList == null) {
687                     String msg = "relationshipList of " + nssiId + " is null"
688                     logger.debug(msg)
689                     return null
690                 }
691                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
692                     if (relationship.relationshipLabel){
693                         endpointId = relationship //todo
694                     }
695                 }
696
697                 return endpointId
698             }
699
700         }catch(BpmnError e) {
701             throw e
702         }catch (Exception ex){
703             String msg = "Exception: " + ex
704             logger.debug(msg)
705             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
706         }
707         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
708     }
709
710     /**
711      * Update relationship between
712      * 1. NSI and NSSI
713      * 2. Slice Profile and Service Profile
714      * 3. SliceProfile and NSSI
715      *
716      * @param execution
717      */
718     public void updateTnBHRelationship(DelegateExecution execution) {
719         SliceTaskParamsAdapter sliceParams =
720                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
721
722         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
723         String nssiId = result.getNssiId()
724         String nsiId = sliceParams.getSuggestNsiId()
725         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
726         String serviceProfileInstanceId = sliceParams.serviceId
727         //nsi id
728
729         updateRelationship(execution, nsiId, nssiId)
730
731         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
732
733         updateRelationship(execution,sliceProfileInstanceId, nssiId)
734
735         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
736         execution.setVariable("sliceTaskParams", sliceParams)
737     }
738
739     /**
740      * sourceId -> targetId
741      * @param execution
742      * @param sourceId
743      * @param targetId
744      */
745     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
746         //relation ship
747         Relationship relationship = new Relationship()
748
749         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
750                 .customer(execution.getVariable("globalSubscriberId"))
751                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
752                 .serviceInstance(targetId))
753
754         logger.info("Creating relationship, targetInstanceUri: " + targetInstanceUri)
755
756         relationship.setRelatedLink(targetInstanceUri.build().toString())
757
758         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
759                 .customer(execution.getVariable("globalSubscriberId"))
760                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
761                 .serviceInstance(sourceId))
762                 .relationshipAPI()
763         client.create(sourceInstanceUri, relationship)
764     }
765
766     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String oStatus) {
767         // create slice profile
768         ServiceInstance rspi = new ServiceInstance()
769         rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
770         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
771         rspi.setServiceRole("slice-profile-instance")
772         rspi.setOrchestrationStatus(oStatus)
773         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
774         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
775         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
776         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
777         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
778
779         //timestamp format YYYY-MM-DD hh:mm:ss
780         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
781         return rspi
782     }
783
784 }