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