Merge "Further changes for cnf-adpter in bpmn infra"
[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         allocateAnNssi.nsiInfo = nsiInfo
334         //endPoint
335         EndPoint endPoint = new EndPoint()
336         endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
337         endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
338         endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
339         allocateAnNssi.setEndPoint(endPoint)
340
341         EsrInfo esrInfo = new EsrInfo()
342         //todo: vendor and network
343         esrInfo.setVendor(sliceTaskInfo.getVendor())
344         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
345
346         String globalSubscriberId = execution.getVariable("globalSubscriberId")
347         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
348
349         //todo: service info
350         ServiceInfo serviceInfo = new ServiceInfo()
351         serviceInfo.globalSubscriberId = globalSubscriberId
352         serviceInfo.subscriptionServiceType = subscriptionServiceType
353         serviceInfo.nsiId = sliceParams.suggestNsiId
354         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
355         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
356
357         nbiRequest.setServiceInfo(serviceInfo)
358         nbiRequest.setEsrInfo(esrInfo)
359         nbiRequest.setAllocateAnNssi(allocateAnNssi)
360
361         execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
362         execution.setVariable("anSliceTaskInfo", sliceTaskInfo)
363         execution.setVariable("anSubnetType", SubnetType.AN)
364     }
365
366
367     /**
368      * create RAN Slice Profile Instance
369      * @param execution
370      */
371     void createCnSliceProfileInstance(DelegateExecution execution) {
372
373         String globalSubscriberId = execution.getVariable("globalSubscriberId")
374         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
375         String serviceInstanceId = UUID.randomUUID().toString()
376         execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
377
378         String oStatus = "deactivated"
379
380         SliceTaskParamsAdapter sliceParams =
381                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
382         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
383         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
384
385         // create slice profile
386         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
387
388         //timestamp format YYYY-MM-DD hh:mm:ss
389         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
390
391         execution.setVariable("communicationServiceInstance", rspi)
392
393         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
394                 .customer(globalSubscriberId)
395                 .serviceSubscription(subscriptionServiceType)
396                 .serviceInstance(serviceInstanceId))
397         client.create(uri, rspi)
398         execution.setVariable("sliceTaskParams", sliceParams)
399     }
400
401     /**
402      * create Cn Slice Profile
403      * @param execution
404      */
405     void createCnSliceProfile(DelegateExecution execution) {
406
407         String globalSubscriberId = execution.getVariable("globalSubscriberId")
408         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
409         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
410
411         SliceTaskParamsAdapter sliceParams =
412                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
413
414         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
415         SliceProfileAdapter cnSliceProfile = sliceTaskInfo.sliceProfile
416
417         String profileId = UUID.randomUUID().toString()
418         cnSliceProfile.setSliceProfileId(profileId)
419
420         SliceProfile sliceProfile = new SliceProfile()
421         sliceProfile.setProfileId(profileId)
422         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
423         //todo:...
424         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
425                 .customer(globalSubscriberId)
426                 .serviceSubscription(subscriptionServiceType)
427                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
428                 .sliceProfile(profileId))
429         client.create(uri, sliceProfile)
430         execution.setVariable("sliceTaskParams", sliceParams)
431     }
432
433     /**
434      * prepare AllocateCnNssi
435      * @param execution
436      */
437     void prepareAllocateCnNssi(DelegateExecution execution) {
438
439         //todo:
440         SliceTaskParamsAdapter sliceParams =
441                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
442         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
443
444         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
445
446         AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
447         allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
448         allocateCnNssi.nssiId = sliceTaskInfo.suggestNssiId
449         allocateCnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
450         allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2CnProfile()
451         NsiInfo nsiInfo = new NsiInfo()
452         nsiInfo.nsiId = sliceParams.suggestNsiId
453         allocateCnNssi.nsiInfo = nsiInfo
454         // endPoint
455         EndPoint endPoint = new EndPoint()
456         endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
457         endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
458         endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
459         allocateCnNssi.setEndPoint(endPoint)
460
461         EsrInfo esrInfo = new EsrInfo()
462         //todo: vendor and network
463         esrInfo.setVendor(sliceTaskInfo.getVendor())
464         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
465
466         String globalSubscriberId = execution.getVariable("globalSubscriberId")
467         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
468
469         //todo: service info
470         ServiceInfo serviceInfo = new ServiceInfo()
471         serviceInfo.globalSubscriberId = globalSubscriberId
472         serviceInfo.subscriptionServiceType = subscriptionServiceType
473         serviceInfo.nsiId = sliceParams.suggestNsiId
474         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
475         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
476         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId //if shared
477
478         nbiRequest.setServiceInfo(serviceInfo)
479         nbiRequest.setEsrInfo(esrInfo)
480         nbiRequest.setAllocateCnNssi(allocateCnNssi)
481
482         execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
483         execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
484         execution.setVariable("cnSubnetType", SubnetType.CN)
485     }
486
487
488     /**
489      * create TN Slice Profile Instance
490      * @param execution
491      */
492     void createTnBHSliceProfileInstance(DelegateExecution execution) {
493         String globalSubscriberId = execution.getVariable("globalSubscriberId")
494         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
495
496         String oStatus = "deactivated"
497
498         SliceTaskParamsAdapter sliceParams =
499                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
500
501         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
502         String serviceInstanceId = UUID.randomUUID().toString()
503
504         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
505         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
506
507         // create slice profile
508         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
509
510         //timestamp format YYYY-MM-DD hh:mm:ss
511         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
512
513         execution.setVariable("communicationServiceInstance", rspi)
514
515         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
516                 .customer(globalSubscriberId)
517                 .serviceSubscription(subscriptionServiceType)
518                 .serviceInstance(serviceInstanceId))
519         client.create(uri, rspi)
520
521         execution.setVariable("sliceTaskParams", sliceParams)
522     }
523
524     /**
525      * create Tn Slice Profile
526      * @param execution
527      */
528     void createTnBHSliceProfile(DelegateExecution execution) {
529
530         String globalSubscriberId = execution.getVariable("globalSubscriberId")
531         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
532
533         SliceTaskParamsAdapter sliceParams =
534                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
535
536         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
537
538         SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
539         String profileId = UUID.randomUUID().toString()
540         tnSliceProfile.setSliceProfileId(profileId)
541
542         SliceProfile sliceProfile = new SliceProfile()
543         sliceProfile.setProfileId(profileId)
544         //todo:...
545         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
546                 .customer(globalSubscriberId)
547                 .serviceSubscription(subscriptionServiceType)
548                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
549                 .sliceProfile(profileId))
550         client.create(uri, sliceProfile)
551
552         execution.setVariable("sliceTaskParams", sliceParams)
553     }
554
555     /**
556      * prepare AllocateCnNssi
557      * @param execution
558      */
559     void prepareAllocateTnBHNssi(DelegateExecution execution) {
560
561         //todo:
562         SliceTaskParamsAdapter sliceParams =
563                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
564         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
565
566         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
567
568         AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
569         //todo: AllocateTnNssi
570         //todo: endPointId -> set into tn
571         List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
572         TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
573         List<ConnectionLink> connectionLinks = new ArrayList<>()
574         ConnectionLink connectionLink = new ConnectionLink()
575         connectionLink.setTransportEndpointA(sliceParams.anSliceTaskInfo.endPointId)
576         connectionLink.setTransportEndpointB(sliceParams.cnSliceTaskInfo.endPointId)
577         connectionLinks.add(connectionLink)
578         transportSliceNetwork.setConnectionLinks(connectionLinks)
579         transportSliceNetworks.add(transportSliceNetwork)
580         allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
581
582         allocateTnNssi.setNetworkSliceInfos()
583         allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
584         NsiInfo nsiInfo = new NsiInfo()
585         nsiInfo.setNsiId(sliceParams.suggestNsiId)
586         nsiInfo.setNsiName(sliceParams.suggestNsiName)
587         allocateTnNssi.setNsiInfo(nsiInfo)
588
589         //allocateTnNssi.networkSliceInfos
590
591         EsrInfo esrInfo = new EsrInfo()
592         esrInfo.setVendor(sliceTaskInfo.getVendor())
593         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
594
595         String globalSubscriberId = execution.getVariable("globalSubscriberId")
596         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
597
598         ServiceInfo serviceInfo = new ServiceInfo()
599         serviceInfo.globalSubscriberId = globalSubscriberId
600         serviceInfo.subscriptionServiceType = subscriptionServiceType
601         serviceInfo.nsiId = sliceParams.suggestNsiId
602         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
603         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
604         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
605
606         nbiRequest.setServiceInfo(serviceInfo)
607         nbiRequest.setEsrInfo(esrInfo)
608         nbiRequest.setAllocateTnNssi(allocateTnNssi)
609
610         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
611         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
612         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
613     }
614
615     /**
616      * Update relationship between
617      * 1. NSI and NSSI
618      * 2. Slice Profile and Service Profile
619      * 3. SliceProfile and NSSI
620      * 4. sliceProfile and endpoint
621      *
622      * @param execution
623      */
624     public void updateAnRelationship(DelegateExecution execution) {
625         //todo:
626         SliceTaskParamsAdapter sliceParams =
627                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
628
629         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
630         String nssiId = result.getNssiId()
631         String nsiId = sliceParams.getSuggestNsiId()
632         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.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("endPointIdAn", endPointId)
638
639         updateRelationship(execution, nsiId, nssiId)
640
641         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
642
643         updateRelationship(execution, sliceProfileInstanceId, nssiId)
644
645         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
646         execution.setVariable("sliceTaskParams", sliceParams)
647     }
648
649
650     /**
651      * Update relationship between
652      * 1. NSI and NSSI
653      * 2. Slice Profile and Service Profile
654      * 3. SliceProfile and NSSI
655      *
656      * @param execution
657      */
658     public void updateCnRelationship(DelegateExecution execution) {
659         //todo:
660         SliceTaskParamsAdapter sliceParams =
661                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
662
663         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
664         String nssiId = result.getNssiId()
665         String nsiId = sliceParams.getSuggestNsiId()
666         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
667         String serviceProfileInstanceId = sliceParams.serviceId
668         //nsi id
669         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
670         String endPointId = getEndpointIdFromAAI(execution, nssiId)
671         execution.setVariable("endPointIdCn", endPointId)
672
673         updateRelationship(execution, nsiId, nssiId)
674
675         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
676
677         updateRelationship(execution,sliceProfileInstanceId, nssiId)
678
679         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
680         execution.setVariable("sliceTaskParams", sliceParams)
681     }
682
683     /**
684      * get endpoint Id from AAI by nssi id
685      * @param execution
686      * @param nssiId
687      * @return
688      */
689     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
690         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
691         //todo: allottedResourceId
692
693         SliceTaskParamsAdapter sliceParams =
694                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
695
696         //sliceParams.setServiceId(nsiServiceInstanceID)
697         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
698                 .customer(execution.getVariable("globalSubscriberId"))
699                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
700                 .serviceInstance(nssiId))
701
702         String endpointId = null
703
704         try {
705             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
706             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
707             if (!si.isPresent()) {
708                 String msg = "NSSI in the option doesn't exist. " + nssiId
709                 logger.debug(msg)
710                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
711             } else {
712                 ServiceInstance nssiInstance = si.get()
713                 //todo: handle relationship and return endPointId
714                 if (nssiInstance.relationshipList == null) {
715                     String msg = "relationshipList of " + nssiId + " is null"
716                     logger.debug(msg)
717                     return null
718                 }
719                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
720                     if (relationship.relationshipLabel){
721                         endpointId = relationship //todo
722                     }
723                 }
724
725                 return endpointId
726             }
727
728         }catch(BpmnError e) {
729             throw e
730         }catch (Exception ex){
731             String msg = "Exception: " + ex
732             logger.debug(msg)
733             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
734         }
735         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
736     }
737
738     /**
739      * Update relationship between
740      * 1. NSI and NSSI
741      * 2. Slice Profile and Service Profile
742      * 3. SliceProfile and NSSI
743      *
744      * @param execution
745      */
746     public void updateTnBHRelationship(DelegateExecution execution) {
747         SliceTaskParamsAdapter sliceParams =
748                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
749
750         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
751         String nssiId = result.getNssiId()
752         String nsiId = sliceParams.getSuggestNsiId()
753         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
754         String serviceProfileInstanceId = sliceParams.serviceId
755         //nsi id
756
757         updateRelationship(execution, nsiId, nssiId)
758
759         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
760
761         updateRelationship(execution,sliceProfileInstanceId, nssiId)
762
763         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
764         execution.setVariable("sliceTaskParams", sliceParams)
765     }
766
767     /**
768      * sourceId -> targetId
769      * @param execution
770      * @param sourceId
771      * @param targetId
772      */
773     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
774         //relation ship
775         Relationship relationship = new Relationship()
776
777         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
778                 .customer(execution.getVariable("globalSubscriberId"))
779                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
780                 .serviceInstance(targetId))
781
782         logger.info("Creating relationship, targetInstanceUri: " + targetInstanceUri)
783
784         relationship.setRelatedLink(targetInstanceUri.build().toString())
785
786         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
787                 .customer(execution.getVariable("globalSubscriberId"))
788                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
789                 .serviceInstance(sourceId))
790                 .relationshipAPI()
791         client.create(sourceInstanceUri, relationship)
792     }
793
794     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String oStatus) {
795         // create slice profile
796         ServiceInstance rspi = new ServiceInstance()
797         rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
798         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
799         rspi.setServiceRole("slice-profile")
800         rspi.setOrchestrationStatus(oStatus)
801         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
802         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
803         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
804         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
805         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
806
807         //timestamp format YYYY-MM-DD hh:mm:ss
808         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
809         return rspi
810     }
811
812 }