Fix some deallocate nssi issues
[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
267         // create slice profile
268         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
269
270         //timestamp format YYYY-MM-DD hh:mm:ss
271         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
272
273         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
274                 .customer(globalSubscriberId)
275                 .serviceSubscription(subscriptionServiceType)
276                 .serviceInstance(serviceInstanceId))
277         client.create(uri, rspi)
278
279         execution.setVariable("sliceTaskParams", sliceParams)
280     }
281
282     /**
283      * create An Slice Profile
284      * @param execution
285      */
286     void createAnSliceProfile(DelegateExecution execution) {
287
288         String globalSubscriberId = execution.getVariable("globalSubscriberId")
289         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
290         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
291
292         SliceTaskParamsAdapter sliceParams =
293                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
294         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
295         SliceProfileAdapter anSliceProfile = sliceTaskInfo.sliceProfile
296
297         String profileId = UUID.randomUUID().toString()
298         anSliceProfile.setSliceProfileId(profileId)
299
300         SliceProfile sliceProfile = new SliceProfile()
301         sliceProfile.setProfileId(profileId)
302         sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList)
303         sliceProfile.setMaxNumberOfUEs(anSliceProfile.maxNumberOfUEs)
304         sliceProfile.setLatency(anSliceProfile.latency)
305         sliceProfile.setMaxNumberOfPDUSession(anSliceProfile.maxNumberOfPDUSession)
306         sliceProfile.setExpDataRateDL(anSliceProfile.expDataRateDL)
307         sliceProfile.setExpDataRateUL(anSliceProfile.expDataRateUL)
308         sliceProfile.setAreaTrafficCapDL(anSliceProfile.areaTrafficCapDL)
309         sliceProfile.setAreaTrafficCapUL(anSliceProfile.areaTrafficCapUL)
310         sliceProfile.setOverallUserDensity(anSliceProfile.overallUserDensity)
311         sliceProfile.setActivityFactor(anSliceProfile.activityFactor)
312         sliceProfile.setUeMobilityLevel(anSliceProfile.ueMobilityLevel)
313         sliceProfile.setResourceSharingLevel(anSliceProfile.resourceSharingLevel)
314         sliceProfile.setCsAvailabilityTarget(anSliceProfile.csAvailabilityTarget)
315         sliceProfile.setCsReliabilityMeanTime(anSliceProfile.csReliabilityMeanTime)
316         sliceProfile.setExpDataRate(anSliceProfile.expDataRate)
317         sliceProfile.setMsgSizeByte(anSliceProfile.msgSizeByte)
318         sliceProfile.setTransferIntervalTarget(anSliceProfile.transferIntervalTarget)
319         sliceProfile.setSurvivalTime(anSliceProfile.survivalTime)
320
321         AAIResourceUri uri = AAIUriFactory.createResourceUri(
322             AAIFluentTypeBuilder.business().customer(globalSubscriberId)
323             .serviceSubscription(subscriptionServiceType)
324             .serviceInstance(sliceTaskInfo.sliceInstanceId)
325             .sliceProfile(profileId)
326         )
327         client.create(uri, sliceProfile)
328         execution.setVariable("sliceTaskParams", sliceParams)
329     }
330
331     void createANEndpoint(DelegateExecution execution){
332         logger.debug("Enter createANEndpoint in DoAllocateNSIandNSSI()")
333         SliceTaskParamsAdapter sliceParams =
334                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
335         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
336
337         NetworkRoute route = new NetworkRoute()
338         String routeId = UUID.randomUUID().toString()
339         route.setRouteId(routeId)
340         route.setType("endpoint")
341         route.setRole("an")
342         route.setFunction("3gppTransportEP")
343         route.setIpAddress( sliceTaskInfo.sliceProfile.ipAddress)
344         route.setNextHop(sliceTaskInfo.sliceProfile.nextHopInfo)
345         route.setAddressFamily("ipv4")
346         route.setPrefixLength(24)
347         sliceTaskInfo.setEndPointId(routeId)
348
349         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(routeId))
350         client.create(uri, route)
351         execution.setVariable("sliceTaskParams", sliceParams)
352         logger.info("an endpointId:" + sliceParams.anSliceTaskInfo.endPointId)
353     }
354
355
356     void createCNEndpoint(DelegateExecution execution){
357         logger.debug("Enter createCNNetworkRoute in DoAllocateNSIandNSSI()")
358         SliceTaskParamsAdapter sliceParams =
359                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
360         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
361
362         NetworkRoute route = new NetworkRoute()
363         String routeId = UUID.randomUUID().toString()
364         route.setRouteId(routeId)
365         route.setType("endpoint")
366         route.setRole("cn")
367         route.setFunction("3gppTransportEP")
368         route.setIpAddress( sliceTaskInfo.sliceProfile.ipAddress)
369         route.setNextHop(sliceTaskInfo.sliceProfile.nextHopInfo)
370         route.setAddressFamily("ipv4")
371         route.setPrefixLength(24)
372
373         sliceTaskInfo.setEndPointId(routeId)
374         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(routeId))
375         client.create(uri, route)
376
377         execution.setVariable("cnEndpointId", routeId)
378         execution.setVariable("sliceTaskParams", sliceParams)
379         logger.info("cn endpointId:" + sliceParams.cnSliceTaskInfo.endPointId)
380     }
381
382     /**
383      * prepare AllocateAnNssi
384      * @param execution
385      */
386     void prepareAllocateAnNssi(DelegateExecution execution) {
387
388         //todo:
389         SliceTaskParamsAdapter sliceParams =
390                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
391         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
392
393         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
394
395         AllocateAnNssi allocateAnNssi = new AllocateAnNssi()
396         allocateAnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2AnProfile()
397         allocateAnNssi.sliceProfile.sliceProfileId = sliceTaskInfo.sliceInstanceId
398         allocateAnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
399         allocateAnNssi.nssiId = sliceTaskInfo.suggestNssiId
400         allocateAnNssi.nssiName = "nssi_an" + execution.getVariable("sliceServiceInstanceName")
401         NsiInfo nsiInfo = new NsiInfo()
402         nsiInfo.nsiId = sliceParams.suggestNsiId
403         nsiInfo.nsiName = sliceParams.suggestNsiName
404         allocateAnNssi.nsiInfo = nsiInfo
405         //endPoint
406         EndPoint endPoint = new EndPoint()
407         endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
408         endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
409         endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
410         allocateAnNssi.setEndPoint(endPoint)
411
412         EsrInfo esrInfo = new EsrInfo()
413         //todo: vendor and network
414         esrInfo.setVendor(sliceTaskInfo.getVendor())
415         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
416
417         String globalSubscriberId = execution.getVariable("globalSubscriberId")
418         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
419
420         //todo: service info
421         ServiceInfo serviceInfo = new ServiceInfo()
422         serviceInfo.globalSubscriberId = globalSubscriberId
423         serviceInfo.subscriptionServiceType = subscriptionServiceType
424         serviceInfo.nsiId = sliceParams.suggestNsiId
425         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
426         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
427         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
428         serviceInfo.nssiName = allocateAnNssi.nssiName
429
430         nbiRequest.setServiceInfo(serviceInfo)
431         nbiRequest.setEsrInfo(esrInfo)
432         nbiRequest.setAllocateAnNssi(allocateAnNssi)
433
434         execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
435         execution.setVariable("anSliceTaskInfo", sliceTaskInfo)
436         execution.setVariable("anSubnetType", SubnetType.AN)
437     }
438
439
440     /**
441      * create RAN Slice Profile Instance
442      * @param execution
443      */
444     void createCnSliceProfileInstance(DelegateExecution execution) {
445
446         String globalSubscriberId = execution.getVariable("globalSubscriberId")
447         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
448         String serviceInstanceId = UUID.randomUUID().toString()
449         execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
450
451         String oStatus = "deactivated"
452
453         SliceTaskParamsAdapter sliceParams =
454                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
455         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
456         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
457
458         // create slice profile
459         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
460
461         //timestamp format YYYY-MM-DD hh:mm:ss
462         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
463
464         execution.setVariable("communicationServiceInstance", rspi)
465
466         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
467                 .customer(globalSubscriberId)
468                 .serviceSubscription(subscriptionServiceType)
469                 .serviceInstance(serviceInstanceId))
470         client.create(uri, rspi)
471         execution.setVariable("sliceTaskParams", sliceParams)
472     }
473
474     /**
475      * create Cn Slice Profile
476      * @param execution
477      */
478     void createCnSliceProfile(DelegateExecution execution) {
479
480         String globalSubscriberId = execution.getVariable("globalSubscriberId")
481         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
482         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
483
484         SliceTaskParamsAdapter sliceParams =
485                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
486
487         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
488         SliceProfileAdapter cnSliceProfile = sliceTaskInfo.sliceProfile
489
490         String profileId = UUID.randomUUID().toString()
491         cnSliceProfile.setSliceProfileId(profileId)
492
493         SliceProfile sliceProfile = new SliceProfile()
494         sliceProfile.setProfileId(profileId)
495         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
496         sliceProfile.setMaxNumberOfUEs(cnSliceProfile.maxNumberOfUEs)
497         sliceProfile.setLatency(cnSliceProfile.latency)
498         sliceProfile.setMaxNumberOfPDUSession(cnSliceProfile.maxNumberOfPDUSession)
499         sliceProfile.setExpDataRateDL(cnSliceProfile.expDataRateDL)
500         sliceProfile.setExpDataRateUL(cnSliceProfile.expDataRateUL)
501         sliceProfile.setAreaTrafficCapDL(cnSliceProfile.areaTrafficCapDL)
502         sliceProfile.setAreaTrafficCapUL(cnSliceProfile.areaTrafficCapUL)
503         sliceProfile.setOverallUserDensity(cnSliceProfile.overallUserDensity)
504         sliceProfile.setActivityFactor(cnSliceProfile.activityFactor)
505         sliceProfile.setUeMobilityLevel(cnSliceProfile.ueMobilityLevel)
506         sliceProfile.setResourceSharingLevel(cnSliceProfile.resourceSharingLevel)
507         sliceProfile.setCsAvailabilityTarget(cnSliceProfile.csAvailabilityTarget)
508         sliceProfile.setCsReliabilityMeanTime(cnSliceProfile.csReliabilityMeanTime)
509         sliceProfile.setExpDataRate(cnSliceProfile.expDataRate)
510         sliceProfile.setMsgSizeByte(cnSliceProfile.msgSizeByte)
511         sliceProfile.setTransferIntervalTarget(cnSliceProfile.transferIntervalTarget)
512         sliceProfile.setSurvivalTime(cnSliceProfile.survivalTime)
513
514         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
515                 .customer(globalSubscriberId)
516                 .serviceSubscription(subscriptionServiceType)
517                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
518                 .sliceProfile(profileId))
519         client.create(uri, sliceProfile)
520         execution.setVariable("sliceTaskParams", sliceParams)
521     }
522
523     /**
524      * prepare AllocateCnNssi
525      * @param execution
526      */
527     void prepareAllocateCnNssi(DelegateExecution execution) {
528
529         //todo:
530         SliceTaskParamsAdapter sliceParams =
531                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
532         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
533
534         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
535
536         AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
537         allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
538         allocateCnNssi.nssiId = sliceTaskInfo.suggestNssiId
539         allocateCnNssi.nssiName = "nssi_cn" + execution.getVariable("sliceServiceInstanceName")
540         allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2CnProfile()
541         allocateCnNssi.sliceProfile.sliceProfileId = sliceTaskInfo.sliceInstanceId
542
543         NsiInfo nsiInfo = new NsiInfo()
544         nsiInfo.nsiId = sliceParams.suggestNsiId
545         nsiInfo.nsiName = sliceParams.suggestNsiName
546         allocateCnNssi.nsiInfo = nsiInfo
547         // endPoint
548         EndPoint endPoint = new EndPoint()
549         endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
550         endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
551         endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
552         allocateCnNssi.setEndPoint(endPoint)
553
554         EsrInfo esrInfo = new EsrInfo()
555         //todo: vendor and network
556         esrInfo.setVendor(sliceTaskInfo.getVendor())
557         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
558
559         String globalSubscriberId = execution.getVariable("globalSubscriberId")
560         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
561
562         //todo: service info
563         ServiceInfo serviceInfo = new ServiceInfo()
564         serviceInfo.globalSubscriberId = globalSubscriberId
565         serviceInfo.subscriptionServiceType = subscriptionServiceType
566         serviceInfo.nsiId = sliceParams.suggestNsiId
567         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
568         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
569         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId //if shared
570         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
571         serviceInfo.nssiName = allocateCnNssi.nssiName
572
573         nbiRequest.setServiceInfo(serviceInfo)
574         nbiRequest.setEsrInfo(esrInfo)
575         nbiRequest.setAllocateCnNssi(allocateCnNssi)
576
577         execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
578         execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
579         execution.setVariable("cnSubnetType", SubnetType.CN)
580     }
581
582
583     /**
584      * create TN Slice Profile Instance
585      * @param execution
586      */
587     void createTnBHSliceProfileInstance(DelegateExecution execution) {
588         String globalSubscriberId = execution.getVariable("globalSubscriberId")
589         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
590
591         String oStatus = "deactivated"
592
593         SliceTaskParamsAdapter sliceParams =
594                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
595
596         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
597         String serviceInstanceId = UUID.randomUUID().toString()
598
599         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
600         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
601
602         // create slice profile
603         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
604
605         //timestamp format YYYY-MM-DD hh:mm:ss
606         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
607
608         execution.setVariable("communicationServiceInstance", rspi)
609
610         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
611                 .customer(globalSubscriberId)
612                 .serviceSubscription(subscriptionServiceType)
613                 .serviceInstance(serviceInstanceId))
614         client.create(uri, rspi)
615
616         execution.setVariable("sliceTaskParams", sliceParams)
617     }
618
619     /**
620      * create Tn Slice Profile
621      * @param execution
622      */
623     void createTnBHSliceProfile(DelegateExecution execution) {
624
625         String globalSubscriberId = execution.getVariable("globalSubscriberId")
626         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
627
628         SliceTaskParamsAdapter sliceParams =
629                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
630
631         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
632
633         SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
634         String profileId = UUID.randomUUID().toString()
635         tnSliceProfile.setSliceProfileId(profileId)
636
637         SliceProfile sliceProfile = new SliceProfile()
638         sliceProfile.setProfileId(profileId)
639         sliceProfile.setLatency(tnSliceProfile.latency)
640         sliceProfile.setMaxBandwidth(tnSliceProfile.maxBandwidth)
641         sliceProfile.setJitter(tnSliceProfile.jitter)
642
643         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
644                 .customer(globalSubscriberId)
645                 .serviceSubscription(subscriptionServiceType)
646                 .serviceInstance(sliceTaskInfo.sliceInstanceId)
647                 .sliceProfile(profileId))
648         client.create(uri, sliceProfile)
649
650         execution.setVariable("sliceTaskParams", sliceParams)
651     }
652
653     /**
654      * prepare AllocateCnNssi
655      * @param execution
656      */
657     void prepareAllocateTnBHNssi(DelegateExecution execution) {
658
659         //todo:
660         SliceTaskParamsAdapter sliceParams =
661                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
662         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
663
664         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
665
666         AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
667         //todo: AllocateTnNssi
668         //todo: endPointId -> set into tn
669         List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
670         TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
671         List<ConnectionLink> connectionLinks = new ArrayList<>()
672         ConnectionLink connectionLink = new ConnectionLink()
673         connectionLink.setTransportEndpointA(sliceParams.anSliceTaskInfo.endPointId)
674         connectionLink.setTransportEndpointB(sliceParams.cnSliceTaskInfo.endPointId)
675         connectionLinks.add(connectionLink)
676         transportSliceNetwork.setConnectionLinks(connectionLinks)
677         transportSliceNetworks.add(transportSliceNetwork)
678         allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
679
680         allocateTnNssi.setNetworkSliceInfos()
681         allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
682         NsiInfo nsiInfo = new NsiInfo()
683         nsiInfo.setNsiId(sliceParams.suggestNsiId)
684         nsiInfo.setNsiName(sliceParams.suggestNsiName)
685         allocateTnNssi.setNsiInfo(nsiInfo)
686
687         //allocateTnNssi.networkSliceInfos
688
689         EsrInfo esrInfo = new EsrInfo()
690         esrInfo.setVendor(sliceTaskInfo.getVendor())
691         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
692
693         String globalSubscriberId = execution.getVariable("globalSubscriberId")
694         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
695
696         ServiceInfo serviceInfo = new ServiceInfo()
697         serviceInfo.globalSubscriberId = globalSubscriberId
698         serviceInfo.subscriptionServiceType = subscriptionServiceType
699         serviceInfo.nsiId = sliceParams.suggestNsiId
700         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
701         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
702         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
703         serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
704
705         nbiRequest.setServiceInfo(serviceInfo)
706         nbiRequest.setEsrInfo(esrInfo)
707         nbiRequest.setAllocateTnNssi(allocateTnNssi)
708
709         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
710         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
711         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
712     }
713
714     /**
715      * Update relationship between
716      * 1. NSI and NSSI
717      * 2. Slice Profile and Service Profile
718      * 3. SliceProfile and NSSI
719      * 4. sliceProfile and endpoint
720      *
721      * @param execution
722      */
723     public void updateAnRelationship(DelegateExecution execution) {
724         //todo:
725         SliceTaskParamsAdapter sliceParams =
726                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
727
728         NssiResponse result = execution.getVariable("anNssiAllocateResult") as NssiResponse
729         String nssiId = result.getNssiId()
730         String nsiId = sliceParams.getSuggestNsiId()
731         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
732         String serviceProfileInstanceId = sliceParams.serviceId
733         String epId = sliceParams.anSliceTaskInfo.endPointId
734         //nsi id
735         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
736         //String endPointId = getEndpointIdFromAAI(execution, nssiId)
737         //execution.setVariable("endPointIdAn", endPointId)
738         updateRelationship(execution, nsiId, nssiId)
739
740         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
741
742         updateRelationship(execution, sliceProfileInstanceId, nssiId)
743
744         updateEPRelationship(execution, nssiId, epId)
745
746         updateEPRelationship(execution, sliceProfileInstanceId, epId)
747
748         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
749         execution.setVariable("sliceTaskParams", sliceParams)
750     }
751
752
753     /**
754      * Update relationship between
755      * 1. NSI and NSSI
756      * 2. Slice Profile and Service Profile
757      * 3. SliceProfile and NSSI
758      *
759      * @param execution
760      */
761     public void updateCnRelationship(DelegateExecution execution) {
762         //todo:
763         SliceTaskParamsAdapter sliceParams =
764                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
765
766         NssiResponse result = execution.getVariable("cnNssiAllocateResult") as NssiResponse
767         String nssiId = result.getNssiId()
768         String nsiId = sliceParams.getSuggestNsiId()
769         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
770         String serviceProfileInstanceId = sliceParams.serviceId
771         String epId = sliceParams.cnSliceTaskInfo.endPointId
772         //nsi id
773         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
774 //        String endPointId = getEndpointIdFromAAI(execution, nssiId)
775 //        execution.setVariable("endPointIdCn", endPointId)
776
777         updateRelationship(execution, nsiId, nssiId)
778
779         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
780
781         updateRelationship(execution, sliceProfileInstanceId, nssiId)
782
783         updateEPRelationship(execution, nssiId, epId)
784
785         updateEPRelationship(execution, sliceProfileInstanceId, epId)
786
787         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
788         execution.setVariable("sliceTaskParams", sliceParams)
789     }
790
791     /**
792      * get endpoint Id from AAI by nssi id
793      * @param execution
794      * @param nssiId
795      * @return
796      */
797     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
798         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
799         //todo: allottedResourceId
800
801         SliceTaskParamsAdapter sliceParams =
802                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
803
804         //sliceParams.setServiceId(nsiServiceInstanceID)
805         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
806                 .customer(execution.getVariable("globalSubscriberId"))
807                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
808                 .serviceInstance(nssiId))
809
810         String endpointId = null
811
812         try {
813             AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
814             Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
815             if (!si.isPresent()) {
816                 String msg = "NSSI in the option doesn't exist. " + nssiId
817                 logger.debug(msg)
818                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
819             } else {
820                 ServiceInstance nssiInstance = si.get()
821                 //todo: handle relationship and return endPointId
822                 if (nssiInstance.relationshipList == null) {
823                     String msg = "relationshipList of " + nssiId + " is null"
824                     logger.debug(msg)
825                     return null
826                 }
827                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
828                     if (relationship.relationshipLabel){
829                         endpointId = relationship //todo
830                     }
831                 }
832
833                 return endpointId
834             }
835
836         }catch(BpmnError e) {
837             throw e
838         }catch (Exception ex){
839             String msg = "Exception: " + ex
840             logger.debug(msg)
841             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
842         }
843         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
844     }
845
846     /**
847      * Update relationship between
848      * 1. NSI and NSSI
849      * 2. Slice Profile and Service Profile
850      * 3. SliceProfile and NSSI
851      *
852      * @param execution
853      */
854     public void updateTnBHRelationship(DelegateExecution execution) {
855         SliceTaskParamsAdapter sliceParams =
856                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
857
858         NssiResponse result = execution.getVariable("tnBHNssiAllocateResult") as NssiResponse
859         String nssiId = result.getNssiId()
860         String nsiId = sliceParams.getSuggestNsiId()
861         String sliceProfileInstanceId = sliceParams.tnBHSliceTaskInfo.sliceInstanceId
862         String serviceProfileInstanceId = sliceParams.serviceId
863         //nsi id
864
865         updateRelationship(execution, nsiId, nssiId)
866
867         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
868
869         updateRelationship(execution,sliceProfileInstanceId, nssiId)
870
871         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
872         execution.setVariable("sliceTaskParams", sliceParams)
873     }
874
875     /**
876      * sourceId -> targetId
877      * @param execution
878      * @param sourceId
879      * @param targetId
880      */
881     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
882         //relation ship
883         Relationship relationship = new Relationship()
884
885         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
886                 .customer(execution.getVariable("globalSubscriberId"))
887                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
888                 .serviceInstance(targetId))
889
890         logger.debug("Creating relationship, targetInstanceUri: " + targetInstanceUri)
891
892         relationship.setRelatedLink(targetInstanceUri.build().toString())
893
894         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
895                 .customer(execution.getVariable("globalSubscriberId"))
896                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
897                 .serviceInstance(sourceId))
898                 .relationshipAPI()
899         client.create(sourceInstanceUri, relationship)
900     }
901
902     /**
903      * update endpoint relationship
904      * @param execution
905      * @param sourceId
906      * @param targetId
907      */
908     void updateEPRelationship(DelegateExecution execution, String sourceId, String endpointId) {
909         //relation ship
910         Relationship relationship = new Relationship()
911
912         AAIResourceUri endpointUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(endpointId))
913
914         logger.debug("Creating relationship, endpoint Uri: " + endpointUri + ",endpointId: " + endpointId)
915
916         relationship.setRelatedLink(endpointUri.build().toString())
917
918         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
919                 .customer(execution.getVariable("globalSubscriberId"))
920                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
921                 .serviceInstance(sourceId))
922                 .relationshipAPI()
923         client.create(sourceInstanceUri, relationship)
924     }
925
926     static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String oStatus) {
927         // create slice profile
928         ServiceInstance rspi = new ServiceInstance()
929         rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
930         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
931         rspi.setServiceRole("slice-profile")
932         rspi.setOrchestrationStatus(oStatus)
933         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
934         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
935         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
936         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
937         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
938
939         //timestamp format YYYY-MM-DD hh:mm:ss
940         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
941         return rspi
942     }
943
944 }