2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  # Copyright (c) 2020, CMCC Technologies Co., Ltd.
 
   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
 
  11  #       http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.onap.so.bpmn.infrastructure.scripts
 
  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
 
  57 class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
 
  59     private static final Logger logger = LoggerFactory.getLogger(DoAllocateNSIandNSSI.class);
 
  61     ExceptionUtil exceptionUtil = new ExceptionUtil()
 
  63     JsonUtils jsonUtil = new JsonUtils()
 
  65     AAIResourcesClient client = getAAIClient()
 
  68      * Pre Process the BPMN Flow Request
 
  70      * generate the nsOperationKey
 
  71      * generate the nsParameters
 
  74     void preProcessRequest (DelegateExecution execution) {
 
  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")
 
  90     void retriveSliceOption(DelegateExecution execution) {
 
  91         logger.trace("Enter retriveSliceOption() of DoAllocateNSIandNSSI")
 
  93         boolean isNSIOptionAvailable
 
  95         SliceTaskParamsAdapter sliceParams =
 
  96                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
  98         if(isBlank(sliceParams.getSuggestNsiId())) {
 
  99             isNSIOptionAvailable = false
 
 102             isNSIOptionAvailable = true
 
 103             execution.setVariable('nsiServiceInstanceId', sliceParams.getSuggestNsiId())
 
 104             execution.setVariable('nsiServiceInstanceName', sliceParams.getSuggestNsiName())
 
 106         execution.setVariable("isNSIOptionAvailable", isNSIOptionAvailable)
 
 107         logger.trace("Exit retriveSliceOption() of DoAllocateNSIandNSSI")
 
 112      * create nsi instance in aai
 
 115     void createNSIinAAI(DelegateExecution execution) {
 
 116         logger.debug("Enter CreateNSIinAAI in DoAllocateNSIandNSSI()")
 
 118         String sliceInstanceId = UUID.randomUUID().toString()
 
 119         SliceTaskParamsAdapter sliceParams =
 
 120                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 122         //set new nsiId to sliceParams suggestNsiId
 
 123         sliceParams.setSuggestNsiId(sliceInstanceId)
 
 125         ServiceInstance nsi = new ServiceInstance()
 
 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
 
 134         String uuiRequest = execution.getVariable("uuiRequest")
 
 135         String serviceInstanceLocationid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.plmnIdList")
 
 136         String serviceRole = "nsi"
 
 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)
 
 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)
 
 156             execution.setVariable("nsiServiceUri", nsiServiceUri)
 
 158         } catch (BpmnError e) {
 
 160         } catch (Exception ex) {
 
 161             msg = "Exception in DoAllocateNSIandNSSI.createNSIinAAI: " + ex.getMessage()
 
 163             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 165         execution.setVariable("sliceTaskParams", sliceParams)
 
 167         logger.debug("Exit CreateNSIinAAI in DoAllocateNSIandNSSI()")
 
 172      * create relationship between nsi and service profile instance
 
 175     void createRelationship(DelegateExecution execution) {
 
 177         logger.debug("Enter createRelationship in DoAllocateNSIandNSSI")
 
 178         //String allottedResourceId = execution.getVariable("allottedResourceId")
 
 179         //SliceTaskParamsAdapter sliceParams =
 
 180         //        execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 184             AAIResourceUri nsiServiceUri = execution.getVariable("nsiServiceUri") as AAIResourceUri
 
 185             logger.debug("Creating Allotted resource relationship, nsiServiceUri: " + nsiServiceUri.toString())
 
 187             //AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(execution.getVariable("globalSubscriberId")).serviceSubscription(execution.getVariable("subscriptionServiceType")).serviceInstance(sliceParams.suggestNsiId).allottedResource(allottedResourceId))
 
 189             AAIResourceUri allottedResourceUri = execution.getVariable("allottedResourceUri") as AAIResourceUri
 
 190             logger.debug("Creating Allotted resource relationship, allottedResourceUri: " + allottedResourceUri.toString())
 
 192             client.connect(allottedResourceUri, nsiServiceUri)
 
 193         } catch (BpmnError e) {
 
 195         } catch (Exception ex) {
 
 196             msg = "Exception in DoAllocateNSIandNSSI.createRelationship. " + ex.getMessage()
 
 198             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 200         logger.debug("Exit createRelationship in DoAllocateNSIandNSSI")
 
 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
 
 213         SliceTaskParamsAdapter sliceParams =
 
 214                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 216         String nsiServiceInstanceID = sliceParams.getSuggestNsiId()
 
 217         //sliceParams.setServiceId(nsiServiceInstanceID)
 
 219         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 220                 .customer(execution.getVariable("globalSubscriberId"))
 
 221                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
 
 222                 .serviceInstance(nsiServiceInstanceID))
 
 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
 
 230                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 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)
 
 238             execution.setVariable("sliceTaskParams", sliceParams)
 
 239         }catch(BpmnError e) {
 
 241         }catch (Exception ex){
 
 242             String msg = "NSI suggested in the option doesn't exist. " + nsiServiceInstanceID
 
 244             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 246         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
 
 250      * create RAN Slice Profile Instance
 
 253     void createAnSliceProfileInstance(DelegateExecution execution) {
 
 255         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 256         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 257         String serviceInstanceId = UUID.randomUUID().toString()
 
 258         execution.setVariable("ranSliceProfileInstanceId", serviceInstanceId) //todo:
 
 260         String oStatus = "deactivated"
 
 262         SliceTaskParamsAdapter sliceParams =
 
 263                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 264         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
 
 265         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
 
 267         // create slice profile
 
 268         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
 
 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()))
 
 273         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 274                 .customer(globalSubscriberId)
 
 275                 .serviceSubscription(subscriptionServiceType)
 
 276                 .serviceInstance(serviceInstanceId))
 
 277         client.create(uri, rspi)
 
 279         execution.setVariable("sliceTaskParams", sliceParams)
 
 283      * create An Slice Profile
 
 286     void createAnSliceProfile(DelegateExecution execution) {
 
 288         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 289         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 290         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
 
 292         SliceTaskParamsAdapter sliceParams =
 
 293                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 294         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
 
 295         SliceProfileAdapter anSliceProfile = sliceTaskInfo.sliceProfile
 
 297         String profileId = UUID.randomUUID().toString()
 
 298         anSliceProfile.setSliceProfileId(profileId)
 
 300         SliceProfile sliceProfile = new SliceProfile()
 
 301         sliceProfile.setProfileId(profileId)
 
 302         sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList)
 
 304         AAIResourceUri uri = AAIUriFactory.createResourceUri(
 
 305             AAIFluentTypeBuilder.business().customer(globalSubscriberId)
 
 306             .serviceSubscription(subscriptionServiceType)
 
 307             .serviceInstance(sliceTaskInfo.sliceInstanceId)
 
 308             .sliceProfile(profileId)
 
 310         client.create(uri, sliceProfile)
 
 311         execution.setVariable("sliceTaskParams", sliceParams)
 
 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
 
 320         NetworkRoute route = new NetworkRoute()
 
 321         String routeId = UUID.randomUUID().toString()
 
 322         route.setRouteId(routeId)
 
 323         route.setType("endpoint")
 
 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)
 
 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)
 
 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
 
 345         NetworkRoute route = new NetworkRoute()
 
 346         String routeId = UUID.randomUUID().toString()
 
 347         route.setRouteId(routeId)
 
 348         route.setType("endpoint")
 
 350         route.setFunction("3gppTransportEP")
 
 351         route.setIpAddress( sliceTaskInfo.sliceProfile.ipAddress)
 
 352         route.setNextHop(sliceTaskInfo.sliceProfile.nextHopInfo)
 
 353         route.setAddressFamily("ipv4")
 
 354         route.setPrefixLength(24)
 
 356         sliceTaskInfo.setEndPointId(routeId)
 
 357         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(routeId))
 
 358         client.create(uri, route)
 
 360         execution.setVariable("cnEndpointId", routeId)
 
 361         execution.setVariable("sliceTaskParams", sliceParams)
 
 362         logger.info("cn endpointId:" + sliceParams.cnSliceTaskInfo.endPointId)
 
 366      * prepare AllocateAnNssi
 
 369     void prepareAllocateAnNssi(DelegateExecution execution) {
 
 372         SliceTaskParamsAdapter sliceParams =
 
 373                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 374         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
 
 376         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
 
 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
 
 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)
 
 394         EsrInfo esrInfo = new EsrInfo()
 
 395         //todo: vendor and network
 
 396         esrInfo.setVendor(sliceTaskInfo.getVendor())
 
 397         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
 
 399         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 400         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 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
 
 412         nbiRequest.setServiceInfo(serviceInfo)
 
 413         nbiRequest.setEsrInfo(esrInfo)
 
 414         nbiRequest.setAllocateAnNssi(allocateAnNssi)
 
 416         execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
 
 417         execution.setVariable("anSliceTaskInfo", sliceTaskInfo)
 
 418         execution.setVariable("anSubnetType", SubnetType.AN)
 
 423      * create RAN Slice Profile Instance
 
 426     void createCnSliceProfileInstance(DelegateExecution execution) {
 
 428         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 429         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 430         String serviceInstanceId = UUID.randomUUID().toString()
 
 431         execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
 
 433         String oStatus = "deactivated"
 
 435         SliceTaskParamsAdapter sliceParams =
 
 436                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 437         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
 
 438         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
 
 440         // create slice profile
 
 441         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
 
 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()))
 
 446         execution.setVariable("communicationServiceInstance", rspi)
 
 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)
 
 457      * create Cn Slice Profile
 
 460     void createCnSliceProfile(DelegateExecution execution) {
 
 462         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 463         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 464         //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
 
 466         SliceTaskParamsAdapter sliceParams =
 
 467                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 469         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
 
 470         SliceProfileAdapter cnSliceProfile = sliceTaskInfo.sliceProfile
 
 472         String profileId = UUID.randomUUID().toString()
 
 473         cnSliceProfile.setSliceProfileId(profileId)
 
 475         SliceProfile sliceProfile = new SliceProfile()
 
 476         sliceProfile.setProfileId(profileId)
 
 477         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
 
 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)
 
 489      * prepare AllocateCnNssi
 
 492     void prepareAllocateCnNssi(DelegateExecution execution) {
 
 495         SliceTaskParamsAdapter sliceParams =
 
 496                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 497         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
 
 499         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
 
 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
 
 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)
 
 517         EsrInfo esrInfo = new EsrInfo()
 
 518         //todo: vendor and network
 
 519         esrInfo.setVendor(sliceTaskInfo.getVendor())
 
 520         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
 
 522         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 523         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 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
 
 536         nbiRequest.setServiceInfo(serviceInfo)
 
 537         nbiRequest.setEsrInfo(esrInfo)
 
 538         nbiRequest.setAllocateCnNssi(allocateCnNssi)
 
 540         execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
 
 541         execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
 
 542         execution.setVariable("cnSubnetType", SubnetType.CN)
 
 547      * create TN Slice Profile Instance
 
 550     void createTnBHSliceProfileInstance(DelegateExecution execution) {
 
 551         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 552         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 554         String oStatus = "deactivated"
 
 556         SliceTaskParamsAdapter sliceParams =
 
 557                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 559         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
 
 560         String serviceInstanceId = UUID.randomUUID().toString()
 
 562         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
 
 563         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
 
 565         // create slice profile
 
 566         ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
 
 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()))
 
 571         execution.setVariable("communicationServiceInstance", rspi)
 
 573         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 574                 .customer(globalSubscriberId)
 
 575                 .serviceSubscription(subscriptionServiceType)
 
 576                 .serviceInstance(serviceInstanceId))
 
 577         client.create(uri, rspi)
 
 579         execution.setVariable("sliceTaskParams", sliceParams)
 
 583      * create Tn Slice Profile
 
 586     void createTnBHSliceProfile(DelegateExecution execution) {
 
 588         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 589         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 591         SliceTaskParamsAdapter sliceParams =
 
 592                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 594         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
 
 596         SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
 
 597         String profileId = UUID.randomUUID().toString()
 
 598         tnSliceProfile.setSliceProfileId(profileId)
 
 600         SliceProfile sliceProfile = new SliceProfile()
 
 601         sliceProfile.setProfileId(profileId)
 
 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)
 
 610         execution.setVariable("sliceTaskParams", sliceParams)
 
 614      * prepare AllocateCnNssi
 
 617     void prepareAllocateTnBHNssi(DelegateExecution execution) {
 
 620         SliceTaskParamsAdapter sliceParams =
 
 621                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 622         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
 
 624         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
 
 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)
 
 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)
 
 647         //allocateTnNssi.networkSliceInfos
 
 649         EsrInfo esrInfo = new EsrInfo()
 
 650         esrInfo.setVendor(sliceTaskInfo.getVendor())
 
 651         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
 
 653         String globalSubscriberId = execution.getVariable("globalSubscriberId")
 
 654         String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
 
 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")
 
 665         nbiRequest.setServiceInfo(serviceInfo)
 
 666         nbiRequest.setEsrInfo(esrInfo)
 
 667         nbiRequest.setAllocateTnNssi(allocateTnNssi)
 
 669         execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
 
 670         execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
 
 671         execution.setVariable("tnBHSubnetType", SubnetType.TN_BH)
 
 675      * Update relationship between
 
 677      * 2. Slice Profile and Service Profile
 
 678      * 3. SliceProfile and NSSI
 
 679      * 4. sliceProfile and endpoint
 
 683     public void updateAnRelationship(DelegateExecution execution) {
 
 685         SliceTaskParamsAdapter sliceParams =
 
 686                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 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
 
 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)
 
 700         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
 
 702         updateRelationship(execution, sliceProfileInstanceId, nssiId)
 
 704         updateEPRelationship(execution, nssiId, epId)
 
 706         updateEPRelationship(execution, sliceProfileInstanceId, epId)
 
 708         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
 
 709         execution.setVariable("sliceTaskParams", sliceParams)
 
 714      * Update relationship between
 
 716      * 2. Slice Profile and Service Profile
 
 717      * 3. SliceProfile and NSSI
 
 721     public void updateCnRelationship(DelegateExecution execution) {
 
 723         SliceTaskParamsAdapter sliceParams =
 
 724                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 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
 
 733         //todo: aai -> nssi -> relationship -> endPointId -> set into tn
 
 734 //        String endPointId = getEndpointIdFromAAI(execution, nssiId)
 
 735 //        execution.setVariable("endPointIdCn", endPointId)
 
 737         updateRelationship(execution, nsiId, nssiId)
 
 739         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
 
 741         updateRelationship(execution, sliceProfileInstanceId, nssiId)
 
 743         updateEPRelationship(execution, nssiId, epId)
 
 745         updateEPRelationship(execution, sliceProfileInstanceId, epId)
 
 747         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
 
 748         execution.setVariable("sliceTaskParams", sliceParams)
 
 752      * get endpoint Id from AAI by nssi id
 
 757     private String getEndpointIdFromAAI(DelegateExecution execution, String nssiId) {
 
 758         logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
 
 759         //todo: allottedResourceId
 
 761         SliceTaskParamsAdapter sliceParams =
 
 762                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 764         //sliceParams.setServiceId(nsiServiceInstanceID)
 
 765         AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 766                 .customer(execution.getVariable("globalSubscriberId"))
 
 767                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
 
 768                 .serviceInstance(nssiId))
 
 770         String endpointId = null
 
 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
 
 778                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 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"
 
 787                 for (Relationship relationship : nssiInstance.relationshipList.getRelationship()) {
 
 788                     if (relationship.relationshipLabel){
 
 789                         endpointId = relationship //todo
 
 796         }catch(BpmnError e) {
 
 798         }catch (Exception ex){
 
 799             String msg = "Exception: " + ex
 
 801             exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
 
 803         logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
 
 807      * Update relationship between
 
 809      * 2. Slice Profile and Service Profile
 
 810      * 3. SliceProfile and NSSI
 
 814     public void updateTnBHRelationship(DelegateExecution execution) {
 
 815         SliceTaskParamsAdapter sliceParams =
 
 816                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
 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
 
 825         updateRelationship(execution, nsiId, nssiId)
 
 827         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
 
 829         updateRelationship(execution,sliceProfileInstanceId, nssiId)
 
 831         sliceParams.tnBHSliceTaskInfo.suggestNssiId = nssiId
 
 832         execution.setVariable("sliceTaskParams", sliceParams)
 
 836      * sourceId -> targetId
 
 841     void updateRelationship(DelegateExecution execution, String sourceId, String targetId) {
 
 843         Relationship relationship = new Relationship()
 
 845         AAIResourceUri targetInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 846                 .customer(execution.getVariable("globalSubscriberId"))
 
 847                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
 
 848                 .serviceInstance(targetId))
 
 850         logger.debug("Creating relationship, targetInstanceUri: " + targetInstanceUri)
 
 852         relationship.setRelatedLink(targetInstanceUri.build().toString())
 
 854         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 855                 .customer(execution.getVariable("globalSubscriberId"))
 
 856                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
 
 857                 .serviceInstance(sourceId))
 
 859         client.create(sourceInstanceUri, relationship)
 
 863      * update endpoint relationship
 
 868     void updateEPRelationship(DelegateExecution execution, String sourceId, String endpointId) {
 
 870         Relationship relationship = new Relationship()
 
 872         AAIResourceUri endpointUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(endpointId))
 
 874         logger.debug("Creating relationship, endpoint Uri: " + endpointUri + ",endpointId: " + endpointId)
 
 876         relationship.setRelatedLink(endpointUri.build().toString())
 
 878         AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
 
 879                 .customer(execution.getVariable("globalSubscriberId"))
 
 880                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
 
 881                 .serviceInstance(sourceId))
 
 883         client.create(sourceInstanceUri, relationship)
 
 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())
 
 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()))