Merge "remove network soap and dead code"
[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         allocateTnNssi.setNssiId(sliceTaskInfo.suggestNssiId)
673         //todo: AllocateTnNssi
674         //todo: endPointId -> set into tn
675         List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
676         TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
677         List<ConnectionLink> connectionLinks = new ArrayList<>()
678         ConnectionLink connectionLink = new ConnectionLink()
679         connectionLink.setTransportEndpointA(sliceParams.anSliceTaskInfo.endPointId)
680         connectionLink.setTransportEndpointB(sliceParams.cnSliceTaskInfo.endPointId)
681         connectionLinks.add(connectionLink)
682         transportSliceNetwork.setConnectionLinks(connectionLinks)
683         transportSliceNetworks.add(transportSliceNetwork)
684         allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
685
686         allocateTnNssi.setNetworkSliceInfos()
687         allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
688         NsiInfo nsiInfo = new NsiInfo()
689         nsiInfo.setNsiId(sliceParams.suggestNsiId)
690         nsiInfo.setNsiName(sliceParams.suggestNsiName)
691         allocateTnNssi.setNsiInfo(nsiInfo)
692
693         //allocateTnNssi.networkSliceInfos
694
695         EsrInfo esrInfo = new EsrInfo()
696         esrInfo.setVendor(sliceTaskInfo.getVendor())
697         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
698
699         String globalSubscriberId = execution.getVariable("globalSubscriberId")
700         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
701
702         ServiceInfo serviceInfo = new ServiceInfo()
703         serviceInfo.globalSubscriberId = globalSubscriberId
704         serviceInfo.subscriptionServiceType = subscriptionServiceType
705         serviceInfo.nsiId = sliceParams.suggestNsiId
706         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
707         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
708         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
709         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
710         serviceInfo.nssiName = "nssi_tn" + execution.getVariable("sliceServiceInstanceName")
711
712         nbiRequest.setServiceInfo(serviceInfo)
713         nbiRequest.setEsrInfo(esrInfo)
714         nbiRequest.setAllocateTnNssi(allocateTnNssi)
715
716         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
717         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
718         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
719     }
720
721     /**
722      * Update relationship between
723      * 1. NSI and NSSI
724      * 2. Slice Profile and Service Profile
725      * 3. SliceProfile and NSSI
726      * 4. sliceProfile and endpoint
727      *
728      * @param execution
729      */
730     public void updateAnRelationship(DelegateExecution execution) {
731         //todo:
732         SliceTaskParamsAdapter sliceParams =
733                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
734
735         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
736         String nssiId = result.getNssiId()
737         String nsiId = sliceParams.getSuggestNsiId()
738         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
739         String serviceProfileInstanceId = sliceParams.serviceId
740         String epId = sliceParams.anSliceTaskInfo.endPointId
741         //nsi id
742         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
743         //String endPointId = getEndpointIdFromAAI(execution, nssiId)
744         //execution.setVariable("endPointIdAn", endPointId)
745         updateRelationship(execution, nsiId, nssiId)
746
747         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
748
749         updateRelationship(execution, sliceProfileInstanceId, nssiId)
750
751         updateEPRelationship(execution, nssiId, epId)
752
753         updateEPRelationship(execution, sliceProfileInstanceId, epId)
754
755         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
756         execution.setVariable("sliceTaskParams", sliceParams)
757     }
758
759
760     /**
761      * Update relationship between
762      * 1. NSI and NSSI
763      * 2. Slice Profile and Service Profile
764      * 3. SliceProfile and NSSI
765      *
766      * @param execution
767      */
768     public void updateCnRelationship(DelegateExecution execution) {
769         //todo:
770         SliceTaskParamsAdapter sliceParams =
771                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
772
773         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
774         String nssiId = result.getNssiId()
775         String nsiId = sliceParams.getSuggestNsiId()
776         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
777         String serviceProfileInstanceId = sliceParams.serviceId
778         String epId = sliceParams.cnSliceTaskInfo.endPointId
779         //nsi id
780         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
781 //        String endPointId = getEndpointIdFromAAI(execution, nssiId)
782 //        execution.setVariable("endPointIdCn", endPointId)
783
784         updateRelationship(execution, nsiId, nssiId)
785
786         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
787
788         updateRelationship(execution, sliceProfileInstanceId, nssiId)
789
790         updateEPRelationship(execution, nssiId, epId)
791
792         updateEPRelationship(execution, sliceProfileInstanceId, epId)
793
794         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
795         execution.setVariable("sliceTaskParams", sliceParams)
796     }
797
798     /**
799      * get endpoint Id from AAI by nssi id
800      * @param execution
801      * @param nssiId
802      * @return
803      */
804     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
805         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
806         //todo: allottedResourceId
807
808         SliceTaskParamsAdapter sliceParams =
809                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
810
811         //sliceParams.setServiceId(nsiServiceInstanceID)
812         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
813                 .customer(execution.getVariable("globalSubscriberId"))
814                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
815                 .serviceInstance(nssiId))
816
817         String endpointId = null
818
819         try {
820             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
821             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
822             if (!si.isPresent()) {
823                 String msg = "NSSI in the option doesn't exist. " + nssiId
824                 logger.debug(msg)
825                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
826             } else {
827                 ServiceInstance nssiInstance = si.get()
828                 //todo: handle relationship and return endPointId
829                 if (nssiInstance.relationshipList == null) {
830                     String msg = "relationshipList of " + nssiId + " is null"
831                     logger.debug(msg)
832                     return null
833                 }
834                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
835                     if (relationship.relationshipLabel){
836                         endpointId = relationship //todo
837                     }
838                 }
839
840                 return endpointId
841             }
842
843         }catch(BpmnError e) {
844             throw e
845         }catch (Exception ex){
846             String msg = "Exception: " + ex
847             logger.debug(msg)
848             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
849         }
850         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
851     }
852
853     /**
854      * Update relationship between
855      * 1. NSI and NSSI
856      * 2. Slice Profile and Service Profile
857      * 3. SliceProfile and NSSI
858      *
859      * @param execution
860      */
861     public void updateTnBHRelationship(DelegateExecution execution) {
862         SliceTaskParamsAdapter sliceParams =
863                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
864
865         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
866         String nssiId = result.getNssiId()
867         String nsiId = sliceParams.getSuggestNsiId()
868         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
869         String serviceProfileInstanceId = sliceParams.serviceId
870         //nsi id
871
872         updateRelationship(execution, nsiId, nssiId)
873
874         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
875
876         updateRelationship(execution,sliceProfileInstanceId, nssiId)
877
878         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
879         execution.setVariable("sliceTaskParams", sliceParams)
880     }
881
882     /**
883      * sourceId -> targetId
884      * @param execution
885      * @param sourceId
886      * @param targetId
887      */
888     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
889         //relation ship
890         Relationship relationship = new Relationship()
891
892         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
893                 .customer(execution.getVariable("globalSubscriberId"))
894                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
895                 .serviceInstance(targetId))
896
897         logger.debug("Creating relationship, targetInstanceUri: " + targetInstanceUri)
898
899         relationship.setRelatedLink(targetInstanceUri.build().toString())
900
901         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
902                 .customer(execution.getVariable("globalSubscriberId"))
903                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
904                 .serviceInstance(sourceId))
905                 .relationshipAPI()
906         client.create(sourceInstanceUri, relationship)
907     }
908
909     /**
910      * update endpoint relationship
911      * @param execution
912      * @param sourceId
913      * @param targetId
914      */
915     void updateEPRelationship(DelegateExecution execution, String sourceId, String endpointId) {
916         //relation ship
917         Relationship relationship = new Relationship()
918
919         AAIResourceUri endpointUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(endpointId))
920
921         logger.debug("Creating relationship, endpoint Uri: " + endpointUri + ",endpointId: " + endpointId)
922
923         relationship.setRelatedLink(endpointUri.build().toString())
924
925         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
926                 .customer(execution.getVariable("globalSubscriberId"))
927                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
928                 .serviceInstance(sourceId))
929                 .relationshipAPI()
930         client.create(sourceInstanceUri, relationship)
931     }
932
933     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String sliceProfileName, String oStatus) {
934         // create slice profile
935         ServiceInstance rspi = new ServiceInstance()
936         rspi.setServiceInstanceName(sliceProfileName)
937         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
938         rspi.setServiceRole("slice-profile")
939         rspi.setOrchestrationStatus(oStatus)
940         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
941         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
942         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
943         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
944         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
945
946         //timestamp format YYYY-MM-DD hh:mm:ss
947         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
948         return rspi
949     }
950
951 }