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