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