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