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