add serializable to fixed cn nssi processing error
[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         allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
559         NsiInfo nsiInfo = new NsiInfo()
560         nsiInfo.setNsiId(sliceParams.suggestNsiId)
561         nsiInfo.setNsiName(sliceParams.suggestNsiName)
562         allocateTnNssi.setNsiInfo(nsiInfo)
563
564         //allocateTnNssi.networkSliceInfos
565
566         EsrInfo esrInfo = new EsrInfo()
567         esrInfo.setVendor(sliceTaskInfo.getVendor())
568         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
569
570         String globalSubscriberId = execution.getVariable("globalSubscriberId")
571         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
572
573         ServiceInfo serviceInfo = new ServiceInfo()
574         serviceInfo.globalSubscriberId = globalSubscriberId
575         serviceInfo.subscriptionServiceType = subscriptionServiceType
576         serviceInfo.nsiId = sliceParams.suggestNsiId
577         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
578         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
579         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
580
581         nbiRequest.setServiceInfo(serviceInfo)
582         nbiRequest.setEsrInfo(esrInfo)
583         nbiRequest.setAllocateTnNssi(allocateTnNssi)
584
585         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
586         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
587         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
588     }
589
590     /**
591      * Update relationship between
592      * 1. NSI and NSSI
593      * 2. Slice Profile and Service Profile
594      * 3. SliceProfile and NSSI
595      * 4. sliceProfile and endpoint
596      *
597      * @param execution
598      */
599     public void updateAnRelationship(DelegateExecution execution) {
600         //todo:
601         SliceTaskParamsAdapter sliceParams =
602                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
603
604         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
605         String nssiId = result.getNssiId()
606         String nsiId = sliceParams.getSuggestNsiId()
607         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
608         String serviceProfileInstanceId = sliceParams.serviceId
609         //nsi id
610         //todo: aai -> nssi -> relationship -> endpointId -> set into tn
611         String endPointId = getEndpointIdFromAAI(execution, nssiId)
612         execution.setVariable("endPointIdAn", endPointId)
613
614         updateRelationship(execution, nsiId, nssiId)
615
616         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
617
618         updateRelationship(execution, sliceProfileInstanceId, nssiId)
619
620         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
621         execution.setVariable("sliceTaskParams", sliceParams)
622     }
623
624
625     /**
626      * Update relationship between
627      * 1. NSI and NSSI
628      * 2. Slice Profile and Service Profile
629      * 3. SliceProfile and NSSI
630      *
631      * @param execution
632      */
633     public void updateCnRelationship(DelegateExecution execution) {
634         //todo:
635         SliceTaskParamsAdapter sliceParams =
636                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
637
638         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
639         String nssiId = result.getNssiId()
640         String nsiId = sliceParams.getSuggestNsiId()
641         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
642         String serviceProfileInstanceId = sliceParams.serviceId
643         //nsi id
644         //todo: aai -> nssi -> relationship -> endpointId -> set into tn
645         String endPointId = getEndpointIdFromAAI(execution, nssiId)
646         execution.setVariable("endPointIdCn", endPointId)
647
648         updateRelationship(execution, nsiId, nssiId)
649
650         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
651
652         updateRelationship(execution,sliceProfileInstanceId, nssiId)
653
654         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
655         execution.setVariable("sliceTaskParams", sliceParams)
656     }
657
658     /**
659      * get endpoint Id from AAI by nssi id
660      * @param execution
661      * @param nssiId
662      * @return
663      */
664     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
665         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
666         //todo: allottedResourceId
667
668         SliceTaskParamsAdapter sliceParams =
669                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
670
671         //sliceParams.setServiceId(nsiServiceInstanceID)
672         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
673                 .customer(execution.getVariable("globalSubscriberId"))
674                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
675                 .serviceInstance(nssiId))
676
677         String endpointId = null
678
679         try {
680             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
681             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
682             if (!si.isPresent()) {
683                 String msg = "NSSI in the option doesn't exist. " + nssiId
684                 logger.debug(msg)
685                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
686             } else {
687                 ServiceInstance nssiInstance = si.get()
688                 //todo: handle relationship and return endpointId
689                 if (nssiInstance.relationshipList == null) {
690                     String msg = "relationshipList of " + nssiId + " is null"
691                     logger.debug(msg)
692                     return null
693                 }
694                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
695                     if (relationship.relationshipLabel){
696                         endpointId = relationship //todo
697                     }
698                 }
699
700                 return endpointId
701             }
702
703         }catch(BpmnError e) {
704             throw e
705         }catch (Exception ex){
706             String msg = "Exception: " + ex
707             logger.debug(msg)
708             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
709         }
710         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
711     }
712
713     /**
714      * Update relationship between
715      * 1. NSI and NSSI
716      * 2. Slice Profile and Service Profile
717      * 3. SliceProfile and NSSI
718      *
719      * @param execution
720      */
721     public void updateTnBHRelationship(DelegateExecution execution) {
722         SliceTaskParamsAdapter sliceParams =
723                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
724
725         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
726         String nssiId = result.getNssiId()
727         String nsiId = sliceParams.getSuggestNsiId()
728         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
729         String serviceProfileInstanceId = sliceParams.serviceId
730         //nsi id
731
732         updateRelationship(execution, nsiId, nssiId)
733
734         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
735
736         updateRelationship(execution,sliceProfileInstanceId, nssiId)
737
738         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
739         execution.setVariable("sliceTaskParams", sliceParams)
740     }
741
742     /**
743      * sourceId -> targetId
744      * @param execution
745      * @param sourceId
746      * @param targetId
747      */
748     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
749         //relation ship
750         Relationship relationship = new Relationship()
751
752         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
753                 .customer(execution.getVariable("globalSubscriberId"))
754                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
755                 .serviceInstance(targetId))
756
757         logger.info("Creating relationship, targetInstanceUri: " + targetInstanceUri)
758
759         relationship.setRelatedLink(targetInstanceUri.build().toString())
760
761         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
762                 .customer(execution.getVariable("globalSubscriberId"))
763                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
764                 .serviceInstance(sourceId))
765                 .relationshipAPI()
766         client.create(sourceInstanceUri, relationship)
767     }
768
769     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String oStatus) {
770         // create slice profile
771         ServiceInstance rspi = new ServiceInstance()
772         rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
773         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
774         rspi.setServiceRole("slice-profile")
775         rspi.setOrchestrationStatus(oStatus)
776         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
777         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
778         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
779         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
780         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
781
782         //timestamp format YYYY-MM-DD hh:mm:ss
783         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
784         return rspi
785     }
786
787 }