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