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