Merge "version upgrades plus cleanup"
[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         sliceParams.setSuggestNsiId(sliceInstanceId)
124
125         ServiceInstance nsi = new ServiceInstance()
126
127
128         String sliceInstanceName = "nsi_"+execution.getVariable("sliceServiceInstanceName")
129         String serviceType = sliceParams.serviceProfile.get("sST")
130         String serviceStatus = "deactivated"
131         String modelInvariantUuid = sliceParams.getNSTInfo().invariantUUID
132         String modelUuid = sliceParams.getNSTInfo().UUID
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 = allocateAnNssi.nssiName
432
433         nbiRequest.setServiceInfo(serviceInfo)
434         nbiRequest.setEsrInfo(esrInfo)
435         nbiRequest.setAllocateAnNssi(allocateAnNssi)
436
437         execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
438         execution.setVariable("anSliceTaskInfo", sliceTaskInfo)
439         execution.setVariable("anSubnetType", SubnetType.AN)
440     }
441
442
443     /**
444      * create RAN Slice Profile Instance
445      * @param execution
446      */
447     void createCnSliceProfileInstance(DelegateExecution execution) {
448
449         String globalSubscriberId = execution.getVariable("globalSubscriberId")
450         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
451         String serviceInstanceId = UUID.randomUUID().toString()
452         execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
453
454         String oStatus = "deactivated"
455
456         SliceTaskParamsAdapter sliceParams =
457                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
458         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
459         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
460         String sliceProfileName = "cn_"+sliceParams.serviceName
461
462         // create slice profile
463         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
464
465         //timestamp format YYYY-MM-DD hh:mm:ss
466         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
467
468         execution.setVariable("communicationServiceInstance", rspi)
469
470         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
471                 .customer(globalSubscriberId)
472                 .serviceSubscription(subscriptionServiceType)
473                 .serviceInstance(serviceInstanceId))
474         client.create(uri, rspi)
475         execution.setVariable("sliceTaskParams", sliceParams)
476     }
477
478     /**
479      * create Cn Slice Profile
480      * @param execution
481      */
482     void createCnSliceProfile(DelegateExecution execution) {
483
484         String globalSubscriberId = execution.getVariable("globalSubscriberId")
485         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
486         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
487
488         SliceTaskParamsAdapter sliceParams =
489                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
490
491         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
492         SliceProfileAdapter cnSliceProfile = sliceTaskInfo.sliceProfile
493
494         String profileId = UUID.randomUUID().toString()
495         cnSliceProfile.setSliceProfileId(profileId)
496
497         SliceProfile sliceProfile = new SliceProfile()
498         sliceProfile.setProfileId(profileId)
499         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
500         sliceProfile.setMaxNumberOfUEs(cnSliceProfile.maxNumberOfUEs)
501         sliceProfile.setLatency(cnSliceProfile.latency)
502         sliceProfile.setMaxNumberOfPDUSession(cnSliceProfile.maxNumberOfPDUSession)
503         sliceProfile.setExpDataRateDL(cnSliceProfile.expDataRateDL)
504         sliceProfile.setExpDataRateUL(cnSliceProfile.expDataRateUL)
505         sliceProfile.setAreaTrafficCapDL(cnSliceProfile.areaTrafficCapDL)
506         sliceProfile.setAreaTrafficCapUL(cnSliceProfile.areaTrafficCapUL)
507         sliceProfile.setOverallUserDensity(cnSliceProfile.overallUserDensity)
508         sliceProfile.setActivityFactor(cnSliceProfile.activityFactor)
509         sliceProfile.setUeMobilityLevel(cnSliceProfile.ueMobilityLevel)
510         sliceProfile.setResourceSharingLevel(cnSliceProfile.resourceSharingLevel)
511         sliceProfile.setCsAvailabilityTarget(cnSliceProfile.csAvailabilityTarget)
512         sliceProfile.setCsReliabilityMeanTime(cnSliceProfile.csReliabilityMeanTime)
513         sliceProfile.setExpDataRate(cnSliceProfile.expDataRate)
514         sliceProfile.setMsgSizeByte(cnSliceProfile.msgSizeByte)
515         sliceProfile.setTransferIntervalTarget(cnSliceProfile.transferIntervalTarget)
516         sliceProfile.setSurvivalTime(cnSliceProfile.survivalTime)
517
518         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
519                 .customer(globalSubscriberId)
520                 .serviceSubscription(subscriptionServiceType)
521                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
522                 .sliceProfile(profileId))
523         client.create(uri, sliceProfile)
524         execution.setVariable("sliceTaskParams", sliceParams)
525     }
526
527     /**
528      * prepare AllocateCnNssi
529      * @param execution
530      */
531     void prepareAllocateCnNssi(DelegateExecution execution) {
532
533         //todo:
534         SliceTaskParamsAdapter sliceParams =
535                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
536         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
537
538         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
539
540         AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
541         allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
542         allocateCnNssi.nssiId = sliceTaskInfo.suggestNssiId
543         allocateCnNssi.nssiName = "nssi_cn" + execution.getVariable("sliceServiceInstanceName")
544         allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2CnProfile()
545         allocateCnNssi.sliceProfile.sliceProfileId = sliceTaskInfo.sliceInstanceId
546
547         NsiInfo nsiInfo = new NsiInfo()
548         nsiInfo.nsiId = sliceParams.suggestNsiId
549         nsiInfo.nsiName = sliceParams.suggestNsiName
550         allocateCnNssi.nsiInfo = nsiInfo
551         // endPoint
552         EndPoint endPoint = new EndPoint()
553         endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
554         endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
555         endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
556         allocateCnNssi.setEndPoint(endPoint)
557
558         EsrInfo esrInfo = new EsrInfo()
559         //todo: vendor and network
560         esrInfo.setVendor(sliceTaskInfo.getVendor())
561         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
562
563         String globalSubscriberId = execution.getVariable("globalSubscriberId")
564         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
565
566         //todo: service info
567         ServiceInfo serviceInfo = new ServiceInfo()
568         serviceInfo.globalSubscriberId = globalSubscriberId
569         serviceInfo.subscriptionServiceType = subscriptionServiceType
570         serviceInfo.nsiId = sliceParams.suggestNsiId
571         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
572         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
573         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId //if shared
574         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
575         serviceInfo.nssiName = allocateCnNssi.nssiName
576
577         nbiRequest.setServiceInfo(serviceInfo)
578         nbiRequest.setEsrInfo(esrInfo)
579         nbiRequest.setAllocateCnNssi(allocateCnNssi)
580
581         execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
582         execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
583         execution.setVariable("cnSubnetType", SubnetType.CN)
584     }
585
586
587     /**
588      * create TN Slice Profile Instance
589      * @param execution
590      */
591     void createTnBHSliceProfileInstance(DelegateExecution execution) {
592         String globalSubscriberId = execution.getVariable("globalSubscriberId")
593         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
594
595         String oStatus = "deactivated"
596
597         SliceTaskParamsAdapter sliceParams =
598                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
599
600         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
601         String serviceInstanceId = UUID.randomUUID().toString()
602
603         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
604         String sliceProfileName = "tn_" + sliceParams.serviceName
605         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
606
607         // create slice profile
608         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
609
610         //timestamp format YYYY-MM-DD hh:mm:ss
611         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
612
613         execution.setVariable("communicationServiceInstance", rspi)
614
615         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
616                 .customer(globalSubscriberId)
617                 .serviceSubscription(subscriptionServiceType)
618                 .serviceInstance(serviceInstanceId))
619         client.create(uri, rspi)
620
621         execution.setVariable("sliceTaskParams", sliceParams)
622     }
623
624     /**
625      * create Tn Slice Profile
626      * @param execution
627      */
628     void createTnBHSliceProfile(DelegateExecution execution) {
629
630         String globalSubscriberId = execution.getVariable("globalSubscriberId")
631         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
632
633         SliceTaskParamsAdapter sliceParams =
634                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
635
636         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
637
638         SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
639         String profileId = UUID.randomUUID().toString()
640         tnSliceProfile.setSliceProfileId(profileId)
641
642         SliceProfile sliceProfile = new SliceProfile()
643         sliceProfile.setProfileId(profileId)
644         sliceProfile.setLatency(tnSliceProfile.latency)
645         sliceProfile.setMaxBandwidth(tnSliceProfile.maxBandwidth)
646         sliceProfile.setJitter(tnSliceProfile.jitter)
647
648         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
649                 .customer(globalSubscriberId)
650                 .serviceSubscription(subscriptionServiceType)
651                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
652                 .sliceProfile(profileId))
653         client.create(uri, sliceProfile)
654
655         execution.setVariable("sliceTaskParams", sliceParams)
656     }
657
658     /**
659      * prepare AllocateCnNssi
660      * @param execution
661      */
662     void prepareAllocateTnBHNssi(DelegateExecution execution) {
663
664         //todo:
665         SliceTaskParamsAdapter sliceParams =
666                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
667         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
668
669         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
670
671         AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
672         //todo: AllocateTnNssi
673         //todo: endPointId -> set into tn
674         List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
675         TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
676         List<ConnectionLink> connectionLinks = new ArrayList<>()
677         ConnectionLink connectionLink = new ConnectionLink()
678         connectionLink.setTransportEndpointA(sliceParams.anSliceTaskInfo.endPointId)
679         connectionLink.setTransportEndpointB(sliceParams.cnSliceTaskInfo.endPointId)
680         connectionLinks.add(connectionLink)
681         transportSliceNetwork.setConnectionLinks(connectionLinks)
682         transportSliceNetworks.add(transportSliceNetwork)
683         allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
684
685         allocateTnNssi.setNetworkSliceInfos()
686         allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
687         NsiInfo nsiInfo = new NsiInfo()
688         nsiInfo.setNsiId(sliceParams.suggestNsiId)
689         nsiInfo.setNsiName(sliceParams.suggestNsiName)
690         allocateTnNssi.setNsiInfo(nsiInfo)
691
692         //allocateTnNssi.networkSliceInfos
693
694         EsrInfo esrInfo = new EsrInfo()
695         esrInfo.setVendor(sliceTaskInfo.getVendor())
696         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
697
698         String globalSubscriberId = execution.getVariable("globalSubscriberId")
699         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
700
701         ServiceInfo serviceInfo = new ServiceInfo()
702         serviceInfo.globalSubscriberId = globalSubscriberId
703         serviceInfo.subscriptionServiceType = subscriptionServiceType
704         serviceInfo.nsiId = sliceParams.suggestNsiId
705         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
706         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
707         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
708         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
709         serviceInfo.nssiName = "nssi_tn" + execution.getVariable("sliceServiceInstanceName")
710
711         nbiRequest.setServiceInfo(serviceInfo)
712         nbiRequest.setEsrInfo(esrInfo)
713         nbiRequest.setAllocateTnNssi(allocateTnNssi)
714
715         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
716         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
717         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
718     }
719
720     /**
721      * Update relationship between
722      * 1. NSI and NSSI
723      * 2. Slice Profile and Service Profile
724      * 3. SliceProfile and NSSI
725      * 4. sliceProfile and endpoint
726      *
727      * @param execution
728      */
729     public void updateAnRelationship(DelegateExecution execution) {
730         //todo:
731         SliceTaskParamsAdapter sliceParams =
732                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
733
734         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
735         String nssiId = result.getNssiId()
736         String nsiId = sliceParams.getSuggestNsiId()
737         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
738         String serviceProfileInstanceId = sliceParams.serviceId
739         String epId = sliceParams.anSliceTaskInfo.endPointId
740         //nsi id
741         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
742         //String endPointId = getEndpointIdFromAAI(execution, nssiId)
743         //execution.setVariable("endPointIdAn", endPointId)
744         updateRelationship(execution, nsiId, nssiId)
745
746         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
747
748         updateRelationship(execution, sliceProfileInstanceId, nssiId)
749
750         updateEPRelationship(execution, nssiId, epId)
751
752         updateEPRelationship(execution, sliceProfileInstanceId, epId)
753
754         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
755         execution.setVariable("sliceTaskParams", sliceParams)
756     }
757
758
759     /**
760      * Update relationship between
761      * 1. NSI and NSSI
762      * 2. Slice Profile and Service Profile
763      * 3. SliceProfile and NSSI
764      *
765      * @param execution
766      */
767     public void updateCnRelationship(DelegateExecution execution) {
768         //todo:
769         SliceTaskParamsAdapter sliceParams =
770                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
771
772         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
773         String nssiId = result.getNssiId()
774         String nsiId = sliceParams.getSuggestNsiId()
775         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
776         String serviceProfileInstanceId = sliceParams.serviceId
777         String epId = sliceParams.cnSliceTaskInfo.endPointId
778         //nsi id
779         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
780 //        String endPointId = getEndpointIdFromAAI(execution, nssiId)
781 //        execution.setVariable("endPointIdCn", endPointId)
782
783         updateRelationship(execution, nsiId, nssiId)
784
785         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
786
787         updateRelationship(execution, sliceProfileInstanceId, nssiId)
788
789         updateEPRelationship(execution, nssiId, epId)
790
791         updateEPRelationship(execution, sliceProfileInstanceId, epId)
792
793         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
794         execution.setVariable("sliceTaskParams", sliceParams)
795     }
796
797     /**
798      * get endpoint Id from AAI by nssi id
799      * @param execution
800      * @param nssiId
801      * @return
802      */
803     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
804         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
805         //todo: allottedResourceId
806
807         SliceTaskParamsAdapter sliceParams =
808                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
809
810         //sliceParams.setServiceId(nsiServiceInstanceID)
811         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
812                 .customer(execution.getVariable("globalSubscriberId"))
813                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
814                 .serviceInstance(nssiId))
815
816         String endpointId = null
817
818         try {
819             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
820             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
821             if (!si.isPresent()) {
822                 String msg = "NSSI in the option doesn't exist. " + nssiId
823                 logger.debug(msg)
824                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
825             } else {
826                 ServiceInstance nssiInstance = si.get()
827                 //todo: handle relationship and return endPointId
828                 if (nssiInstance.relationshipList == null) {
829                     String msg = "relationshipList of " + nssiId + " is null"
830                     logger.debug(msg)
831                     return null
832                 }
833                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
834                     if (relationship.relationshipLabel){
835                         endpointId = relationship //todo
836                     }
837                 }
838
839                 return endpointId
840             }
841
842         }catch(BpmnError e) {
843             throw e
844         }catch (Exception ex){
845             String msg = "Exception: " + ex
846             logger.debug(msg)
847             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
848         }
849         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
850     }
851
852     /**
853      * Update relationship between
854      * 1. NSI and NSSI
855      * 2. Slice Profile and Service Profile
856      * 3. SliceProfile and NSSI
857      *
858      * @param execution
859      */
860     public void updateTnBHRelationship(DelegateExecution execution) {
861         SliceTaskParamsAdapter sliceParams =
862                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
863
864         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
865         String nssiId = result.getNssiId()
866         String nsiId = sliceParams.getSuggestNsiId()
867         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
868         String serviceProfileInstanceId = sliceParams.serviceId
869         //nsi id
870
871         updateRelationship(execution, nsiId, nssiId)
872
873         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
874
875         updateRelationship(execution,sliceProfileInstanceId, nssiId)
876
877         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
878         execution.setVariable("sliceTaskParams", sliceParams)
879     }
880
881     /**
882      * sourceId -> targetId
883      * @param execution
884      * @param sourceId
885      * @param targetId
886      */
887     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
888         //relation ship
889         Relationship relationship = new Relationship()
890
891         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
892                 .customer(execution.getVariable("globalSubscriberId"))
893                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
894                 .serviceInstance(targetId))
895
896         logger.debug("Creating relationship, targetInstanceUri: " + targetInstanceUri)
897
898         relationship.setRelatedLink(targetInstanceUri.build().toString())
899
900         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
901                 .customer(execution.getVariable("globalSubscriberId"))
902                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
903                 .serviceInstance(sourceId))
904                 .relationshipAPI()
905         client.create(sourceInstanceUri, relationship)
906     }
907
908     /**
909      * update endpoint relationship
910      * @param execution
911      * @param sourceId
912      * @param targetId
913      */
914     void updateEPRelationship(DelegateExecution execution, String sourceId, String endpointId) {
915         //relation ship
916         Relationship relationship = new Relationship()
917
918         AAIResourceUri endpointUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(endpointId))
919
920         logger.debug("Creating relationship, endpoint Uri: " + endpointUri + ",endpointId: " + endpointId)
921
922         relationship.setRelatedLink(endpointUri.build().toString())
923
924         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
925                 .customer(execution.getVariable("globalSubscriberId"))
926                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
927                 .serviceInstance(sourceId))
928                 .relationshipAPI()
929         client.create(sourceInstanceUri, relationship)
930     }
931
932     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String sliceProfileName, String oStatus) {
933         // create slice profile
934         ServiceInstance rspi = new ServiceInstance()
935         rspi.setServiceInstanceName(sliceProfileName)
936         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
937         rspi.setServiceRole("slice-profile")
938         rspi.setOrchestrationStatus(oStatus)
939         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
940         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
941         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
942         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
943         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
944
945         //timestamp format YYYY-MM-DD hh:mm:ss
946         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
947         return rspi
948     }
949
950 }