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