Support Allocate feature for NSMF based TN slices
[so.git] / bpmn / so-bpmn-infrastructure-common / src / main / groovy / org / onap / so / bpmn / infrastructure / scripts / DoAllocateNSIandNSSI.groovy
index 159f4c4..2317e98 100644 (file)
 
 package org.onap.so.bpmn.infrastructure.scripts
 
+import org.onap.aai.domain.yang.NetworkRoute
+import org.onap.so.beans.nsmf.ConnectionLink
+import org.onap.so.beans.nsmf.EndPoint
 import org.onap.so.beans.nsmf.NsiInfo
 import org.onap.so.beans.nsmf.SliceProfileAdapter
+import org.onap.so.beans.nsmf.TransportSliceNetwork
 import org.onap.so.beans.nsmf.oof.SubnetType
 import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
 import javax.ws.rs.NotFoundException
@@ -30,6 +34,7 @@ import org.camunda.bpm.engine.delegate.DelegateExecution
 import org.onap.aai.domain.yang.Relationship
 import org.onap.aai.domain.yang.ServiceInstance
 import org.onap.aai.domain.yang.SliceProfile
+import org.onap.aaiclient.client.aai.AAINamespaceConstants
 import org.onap.aaiclient.client.aai.AAIResourcesClient
 import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
 import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
@@ -49,6 +54,7 @@ import org.onap.so.bpmn.core.json.JsonUtils
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 import static org.apache.commons.lang3.StringUtils.isBlank
+import org.onap.aaiclient.client.aai.AAIObjectType
 
 class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
 
@@ -58,6 +64,8 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
 
     JsonUtils jsonUtil = new JsonUtils()
 
+    AnNssmfUtils anNssmfUtils = new AnNssmfUtils()
+
     AAIResourcesClient client = getAAIClient()
 
     /**
@@ -71,6 +79,13 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         String msg = ""
         logger.trace("Enter preProcessRequest()")
         Map<String, Object> nssiMap = new HashMap<>()
+        int nsstCount=execution.getVariable("nsstCount") as int
+        if(nsstCount==6){
+            execution.setVariable("processFHandMH", true)
+        }
+        else{
+            execution.setVariable("processFHandMH", false)
+        }
         execution.setVariable("nssiMap", nssiMap)
         boolean isMoreNSSTtoProcess = true
         execution.setVariable("isMoreNSSTtoProcess", isMoreNSSTtoProcess)
@@ -116,16 +131,17 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
 
         //set new nsiId to sliceParams suggestNsiId
-        sliceParams.setSuggestNsiId(sliceInstanceId)
-
         ServiceInstance nsi = new ServiceInstance()
 
-
         String sliceInstanceName = "nsi_"+execution.getVariable("sliceServiceInstanceName")
-        String serviceType = execution.getVariable("serviceType")
+        String serviceType = sliceParams.serviceProfile.get("sST")
         String serviceStatus = "deactivated"
         String modelInvariantUuid = sliceParams.getNSTInfo().invariantUUID
         String modelUuid = sliceParams.getNSTInfo().UUID
+        String serviceFunction = sliceParams.serviceProfile.get("resourceSharingLevel")
+
+        sliceParams.setSuggestNsiId(sliceInstanceId)
+        sliceParams.setSuggestNsiName(sliceInstanceName)
 
         String uuiRequest = execution.getVariable("uuiRequest")
         String serviceInstanceLocationid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.plmnIdList")
@@ -140,6 +156,7 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         nsi.setModelVersionId(modelUuid)
         nsi.setServiceInstanceLocationId(serviceInstanceLocationid)
         nsi.setServiceRole(serviceRole)
+        nsi.setServiceFunction(serviceFunction)
         String msg
         try {
 
@@ -259,9 +276,10 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
+        String sliceProfileName = "sliceprofile_an_" + sliceParams.serviceName
 
         // create slice profile
-        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
+        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
 
         //timestamp format YYYY-MM-DD hh:mm:ss
         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
@@ -295,8 +313,25 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
 
         SliceProfile sliceProfile = new SliceProfile()
         sliceProfile.setProfileId(profileId)
-        sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList)
-        //todo:...
+        sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList as String)
+        sliceProfile.setMaxNumberOfUEs(anSliceProfile.maxNumberOfUEs)
+        sliceProfile.setLatency(anSliceProfile.latency)
+        sliceProfile.setMaxNumberOfPDUSession(anSliceProfile.maxNumberOfPDUSession)
+        sliceProfile.setExpDataRateDL(anSliceProfile.expDataRateDL)
+        sliceProfile.setExpDataRateUL(anSliceProfile.expDataRateUL)
+        sliceProfile.setAreaTrafficCapDL(anSliceProfile.areaTrafficCapDL)
+        sliceProfile.setAreaTrafficCapUL(anSliceProfile.areaTrafficCapUL)
+        sliceProfile.setOverallUserDensity(anSliceProfile.overallUserDensity)
+        sliceProfile.setActivityFactor(anSliceProfile.activityFactor)
+        sliceProfile.setUeMobilityLevel(anSliceProfile.ueMobilityLevel)
+        sliceProfile.setResourceSharingLevel(anSliceProfile.resourceSharingLevel)
+        sliceProfile.setCsAvailabilityTarget(anSliceProfile.csAvailabilityTarget)
+        sliceProfile.setCsReliabilityMeanTime(anSliceProfile.csReliabilityMeanTime)
+        sliceProfile.setExpDataRate(anSliceProfile.expDataRate)
+        sliceProfile.setMsgSizeByte(anSliceProfile.msgSizeByte)
+        sliceProfile.setTransferIntervalTarget(anSliceProfile.transferIntervalTarget)
+        sliceProfile.setSurvivalTime(anSliceProfile.survivalTime)
+
         AAIResourceUri uri = AAIUriFactory.createResourceUri(
             AAIFluentTypeBuilder.business().customer(globalSubscriberId)
             .serviceSubscription(subscriptionServiceType)
@@ -307,6 +342,59 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         execution.setVariable("sliceTaskParams", sliceParams)
     }
 
+    void createANEndpoint(DelegateExecution execution){
+        logger.debug("Enter createANEndpoint in DoAllocateNSIandNSSI()")
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
+
+        NetworkRoute route = new NetworkRoute()
+        String routeId = UUID.randomUUID().toString()
+        route.setRouteId(routeId)
+        route.setType("endpoint")
+        route.setRole("AN")
+        route.setFunction("3gppTransportEP")
+        route.setIpAddress( sliceTaskInfo.sliceProfile.ipAddress)
+        route.setNextHop(sliceTaskInfo.sliceProfile.nextHopInfo)
+        route.setLogicalInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
+        route.setAddressFamily("ipv4")
+        route.setPrefixLength(24)
+        sliceTaskInfo.setEndPointId(routeId)
+
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(routeId))
+        client.create(uri, route)
+        execution.setVariable("sliceTaskParams", sliceParams)
+        logger.info("an endpointId:" + sliceParams.anSliceTaskInfo.endPointId)
+    }
+
+
+    void createCNEndpoint(DelegateExecution execution){
+        logger.debug("Enter createCNNetworkRoute in DoAllocateNSIandNSSI()")
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
+
+        NetworkRoute route = new NetworkRoute()
+        String routeId = UUID.randomUUID().toString()
+        route.setRouteId(routeId)
+        route.setType("endpoint")
+        route.setRole("CN")
+        route.setFunction("3gppTransportEP")
+        route.setIpAddress( sliceTaskInfo.sliceProfile.ipAddress)
+        route.setNextHop(sliceTaskInfo.sliceProfile.nextHopInfo)
+        route.setLogicalInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
+        route.setAddressFamily("ipv4")
+        route.setPrefixLength(24)
+
+        sliceTaskInfo.setEndPointId(routeId)
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(routeId))
+        client.create(uri, route)
+
+        execution.setVariable("cnEndpointId", routeId)
+        execution.setVariable("sliceTaskParams", sliceParams)
+        logger.info("cn endpointId:" + sliceParams.cnSliceTaskInfo.endPointId)
+    }
+
     /**
      * prepare AllocateAnNssi
      * @param execution
@@ -316,34 +404,48 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         //todo:
         SliceTaskParamsAdapter sliceParams =
                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
-        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.anSliceTaskInfo
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.getAnSliceTaskInfo()
 
         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
 
         AllocateAnNssi allocateAnNssi = new AllocateAnNssi()
-        allocateAnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2AnProfile()
-        allocateAnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
-        allocateAnNssi.nssiId = sliceTaskInfo.suggestNssiId
-        allocateAnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
+        allocateAnNssi.setSliceProfile(sliceTaskInfo.getSliceProfile().trans2AnProfile())
+        allocateAnNssi.getSliceProfile().setSliceProfileId(sliceTaskInfo.getSliceInstanceId())
+        allocateAnNssi.setNsstId(sliceTaskInfo.getNSSTInfo().getUUID())
+        allocateAnNssi.setNssiId(sliceTaskInfo.getSuggestNssiId())
+        allocateAnNssi.setNssiName("nssi_an" + execution.getVariable("sliceServiceInstanceName") as String)
+        allocateAnNssi.setScriptName(sliceTaskInfo.getScriptName())
         NsiInfo nsiInfo = new NsiInfo()
-        nsiInfo.nsiId = sliceParams.suggestNsiId
-        allocateAnNssi.nsiInfo = nsiInfo
+        nsiInfo.setNsiId(sliceParams.getSuggestNsiId())
+        nsiInfo.setNsiName(sliceParams.getSuggestNsiName())
+        allocateAnNssi.setNsiInfo(nsiInfo)
+        //endPoint
+        EndPoint endPoint = new EndPoint()
+        endPoint.setIpAddress(sliceTaskInfo.getSliceProfile().getIpAddress())
+        endPoint.setLogicInterfaceId(sliceTaskInfo.getSliceProfile().getLogicInterfaceId())
+        endPoint.setNextHopInfo(sliceTaskInfo.getSliceProfile().getNextHopInfo())
+        allocateAnNssi.setEndPoint(endPoint)
 
         EsrInfo esrInfo = new EsrInfo()
         //todo: vendor and network
         esrInfo.setVendor(sliceTaskInfo.getVendor())
         esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
 
-        String globalSubscriberId = execution.getVariable("globalSubscriberId")
-        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+        String globalSubscriberId = execution.getVariable("globalSubscriberId") as String
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType") as String
 
         //todo: service info
-        ServiceInfo serviceInfo = new ServiceInfo()
-        serviceInfo.globalSubscriberId = globalSubscriberId
-        serviceInfo.subscriptionServiceType = subscriptionServiceType
-        serviceInfo.nsiId = sliceParams.suggestNsiId
-        serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
-        serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
+        ServiceInfo serviceInfo = ServiceInfo.builder()
+                .globalSubscriberId(globalSubscriberId)
+                .subscriptionServiceType(subscriptionServiceType)
+                .nsiId(sliceParams.getSuggestNsiId())
+                .serviceInvariantUuid(sliceTaskInfo.getNSSTInfo().getInvariantUUID())
+                .serviceUuid(sliceTaskInfo.getNSSTInfo().getUUID())
+                .sST(sliceTaskInfo.getSliceProfile().getSST() ?: sliceParams.getServiceProfile().get("sST") as String)
+                .nssiName(sliceTaskInfo.getSuggestNssiId() ? sliceTaskInfo.getNSSTInfo().getName() : allocateAnNssi.getNssiName())
+                .nssiId(sliceTaskInfo.getSuggestNssiId())
+                .resourceSharingLevel(sliceParams.serviceProfile.get("resourceSharingLevel") as String)
+                .build()
 
         nbiRequest.setServiceInfo(serviceInfo)
         nbiRequest.setEsrInfo(esrInfo)
@@ -372,9 +474,10 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
                 execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
         SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.cnSliceTaskInfo
         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
+        String sliceProfileName = "sliceprofile_cn_"+sliceParams.serviceName
 
         // create slice profile
-        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
+        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
 
         //timestamp format YYYY-MM-DD hh:mm:ss
         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
@@ -411,7 +514,24 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         SliceProfile sliceProfile = new SliceProfile()
         sliceProfile.setProfileId(profileId)
         sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
-        //todo:...
+        sliceProfile.setMaxNumberOfUEs(cnSliceProfile.maxNumberOfUEs)
+        sliceProfile.setLatency(cnSliceProfile.latency)
+        sliceProfile.setMaxNumberOfPDUSession(cnSliceProfile.maxNumberOfPDUSession)
+        sliceProfile.setExpDataRateDL(cnSliceProfile.expDataRateDL)
+        sliceProfile.setExpDataRateUL(cnSliceProfile.expDataRateUL)
+        sliceProfile.setAreaTrafficCapDL(cnSliceProfile.areaTrafficCapDL)
+        sliceProfile.setAreaTrafficCapUL(cnSliceProfile.areaTrafficCapUL)
+        sliceProfile.setOverallUserDensity(cnSliceProfile.overallUserDensity)
+        sliceProfile.setActivityFactor(cnSliceProfile.activityFactor)
+        sliceProfile.setUeMobilityLevel(cnSliceProfile.ueMobilityLevel)
+        sliceProfile.setResourceSharingLevel(cnSliceProfile.resourceSharingLevel)
+        sliceProfile.setCsAvailabilityTarget(cnSliceProfile.csAvailabilityTarget)
+        sliceProfile.setCsReliabilityMeanTime(cnSliceProfile.csReliabilityMeanTime)
+        sliceProfile.setExpDataRate(cnSliceProfile.expDataRate)
+        sliceProfile.setMsgSizeByte(cnSliceProfile.msgSizeByte)
+        sliceProfile.setTransferIntervalTarget(cnSliceProfile.transferIntervalTarget)
+        sliceProfile.setSurvivalTime(cnSliceProfile.survivalTime)
+
         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
                 .customer(globalSubscriberId)
                 .serviceSubscription(subscriptionServiceType)
@@ -437,11 +557,21 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
         allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
         allocateCnNssi.nssiId = sliceTaskInfo.suggestNssiId
-        allocateCnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
+        allocateCnNssi.nssiName = "nssi_cn" + execution.getVariable("sliceServiceInstanceName")
         allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile.trans2CnProfile()
+        allocateCnNssi.sliceProfile.sliceProfileId = sliceTaskInfo.sliceInstanceId
+        allocateCnNssi.scriptName = sliceTaskInfo.getScriptName()
+
         NsiInfo nsiInfo = new NsiInfo()
         nsiInfo.nsiId = sliceParams.suggestNsiId
+        nsiInfo.nsiName = sliceParams.suggestNsiName
         allocateCnNssi.nsiInfo = nsiInfo
+        // endPoint
+        EndPoint endPoint = new EndPoint()
+        endPoint.setIpAddress(sliceTaskInfo.sliceProfile.ipAddress)
+        endPoint.setLogicInterfaceId(sliceTaskInfo.sliceProfile.logicInterfaceId)
+        endPoint.setNextHopInfo(sliceTaskInfo.sliceProfile.nextHopInfo)
+        allocateCnNssi.setEndPoint(endPoint)
 
         EsrInfo esrInfo = new EsrInfo()
         //todo: vendor and network
@@ -459,6 +589,9 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId //if shared
+        serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
+        serviceInfo.nssiName = allocateCnNssi.nssiName
+        serviceInfo.resourceSharingLevel = sliceParams.serviceProfile.get("resourceSharingLevel")
 
         nbiRequest.setServiceInfo(serviceInfo)
         nbiRequest.setEsrInfo(esrInfo)
@@ -487,10 +620,11 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         String serviceInstanceId = UUID.randomUUID().toString()
 
         sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
+        String sliceProfileName = "sliceprofile_tn_" + sliceParams.serviceName
         //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
 
         // create slice profile
-        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, oStatus)
+        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
 
         //timestamp format YYYY-MM-DD hh:mm:ss
         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
@@ -526,7 +660,10 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
 
         SliceProfile sliceProfile = new SliceProfile()
         sliceProfile.setProfileId(profileId)
-        //todo:...
+        sliceProfile.setLatency(tnSliceProfile.latency)
+        sliceProfile.setMaxBandwidth(tnSliceProfile.maxBandwidth)
+        sliceProfile.setJitter(tnSliceProfile.jitter)
+
         AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
                 .customer(globalSubscriberId)
                 .serviceSubscription(subscriptionServiceType)
@@ -551,12 +688,28 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
 
         AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
+        allocateTnNssi.setNssiId(sliceTaskInfo.suggestNssiId)
+        allocateTnNssi.scriptName = sliceTaskInfo.getScriptName()
         //todo: AllocateTnNssi
-        //todo: endpointId -> set into tn
-        allocateTnNssi.setTransportSliceNetworks()
-        allocateTnNssi.setNetworkSliceInfos()
-
+        //todo: endPointId -> set into tn
+        List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
+        TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
+        List<ConnectionLink> connectionLinks = new ArrayList<>()
+        ConnectionLink connectionLink = new ConnectionLink()
+        connectionLink.setTransportEndpointA(sliceParams.anSliceTaskInfo.endPointId)
+        connectionLink.setTransportEndpointB(sliceParams.cnSliceTaskInfo.endPointId)
+        connectionLinks.add(connectionLink)
+        transportSliceNetwork.setConnectionLinks(connectionLinks)
+        transportSliceNetworks.add(transportSliceNetwork)
+        allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
 
+        allocateTnNssi.setNetworkSliceInfos()
+        allocateTnNssi.setSliceProfile(sliceTaskInfo.sliceProfile.trans2TnProfile())
+        allocateTnNssi.getSliceProfile().setDomainType(sliceTaskInfo.subnetType.subnetType)
+        NsiInfo nsiInfo = new NsiInfo()
+        nsiInfo.setNsiId(sliceParams.suggestNsiId)
+        nsiInfo.setNsiName(sliceParams.suggestNsiName)
+        allocateTnNssi.setNsiInfo(nsiInfo)
 
         //allocateTnNssi.networkSliceInfos
 
@@ -574,6 +727,9 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
         serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
         serviceInfo.nssiId = sliceTaskInfo.suggestNssiId
+        serviceInfo.sST = sliceTaskInfo.sliceProfile.sST ?: sliceParams.serviceProfile.get("sST")
+        serviceInfo.nssiName = "nssi_tn" + execution.getVariable("sliceServiceInstanceName")
+        serviceInfo.resourceSharingLevel = sliceParams.serviceProfile.get("resourceSharingLevel")
 
         nbiRequest.setServiceInfo(serviceInfo)
         nbiRequest.setEsrInfo(esrInfo)
@@ -603,17 +759,21 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         String nsiId = sliceParams.getSuggestNsiId()
         String sliceProfileInstanceId = sliceParams.anSliceTaskInfo.sliceInstanceId
         String serviceProfileInstanceId = sliceParams.serviceId
+        String epId = sliceParams.anSliceTaskInfo.endPointId
         //nsi id
-        //todo: aai -> nssi -> relationship -> endpointId -> set into tn
-        String endPointId = getEndpointIdFromAAI(execution, nssiId)
-        execution.setVariable("endPointIdAn", endPointId)
-
+        //todo: aai -> nssi -> relationship -> endPointId -> set into tn
+        //String endPointId = getEndpointIdFromAAI(execution, nssiId)
+        //execution.setVariable("endPointIdAn", endPointId)
         updateRelationship(execution, nsiId, nssiId)
 
         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
 
         updateRelationship(execution, sliceProfileInstanceId, nssiId)
 
+        updateEPRelationship(execution, nssiId, epId)
+
+        updateEPRelationship(execution, sliceProfileInstanceId, epId)
+
         sliceParams.anSliceTaskInfo.suggestNssiId = nssiId
         execution.setVariable("sliceTaskParams", sliceParams)
     }
@@ -637,16 +797,21 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         String nsiId = sliceParams.getSuggestNsiId()
         String sliceProfileInstanceId = sliceParams.cnSliceTaskInfo.sliceInstanceId
         String serviceProfileInstanceId = sliceParams.serviceId
+        String epId = sliceParams.cnSliceTaskInfo.endPointId
         //nsi id
-        //todo: aai -> nssi -> relationship -> endpointId -> set into tn
-        String endPointId = getEndpointIdFromAAI(execution, nssiId)
-        execution.setVariable("endPointIdCn", endPointId)
+        //todo: aai -> nssi -> relationship -> endPointId -> set into tn
+//        String endPointId = getEndpointIdFromAAI(execution, nssiId)
+//        execution.setVariable("endPointIdCn", endPointId)
 
         updateRelationship(execution, nsiId, nssiId)
 
         updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
 
-        updateRelationship(execution,sliceProfileInstanceId, nssiId)
+        updateRelationship(execution, sliceProfileInstanceId, nssiId)
+
+        updateEPRelationship(execution, nssiId, epId)
+
+        updateEPRelationship(execution, sliceProfileInstanceId, epId)
 
         sliceParams.cnSliceTaskInfo.suggestNssiId = nssiId
         execution.setVariable("sliceTaskParams", sliceParams)
@@ -682,7 +847,7 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
                 exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
             } else {
                 ServiceInstance nssiInstance = si.get()
-                //todo: handle relationship and return endpointId
+                //todo: handle relationship and return endPointId
                 if (nssiInstance.relationshipList == null) {
                     String msg = "relationshipList of " + nssiId + " is null"
                     logger.debug(msg)
@@ -751,7 +916,7 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
                 .serviceSubscription(execution.getVariable("subscriptionServiceType"))
                 .serviceInstance(targetId))
 
-        logger.info("Creating relationship, targetInstanceUri: " + targetInstanceUri)
+        logger.debug("Creating relationship, targetInstanceUri: " + targetInstanceUri)
 
         relationship.setRelatedLink(targetInstanceUri.build().toString())
 
@@ -763,22 +928,493 @@ class DoAllocateNSIandNSSI extends AbstractServiceTaskProcessor{
         client.create(sourceInstanceUri, relationship)
     }
 
-    static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String oStatus) {
+    /**
+     * update endpoint relationship
+     * @param execution
+     * @param sourceId
+     * @param targetId
+     */
+    void updateEPRelationship(DelegateExecution execution, String sourceId, String endpointId) {
+        //relation ship
+        Relationship relationship = new Relationship()
+
+        AAIResourceUri endpointUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(endpointId))
+
+        logger.debug("Creating relationship, endpoint Uri: " + endpointUri + ",endpointId: " + endpointId)
+
+        relationship.setRelatedLink(endpointUri.build().toString())
+
+        AAIResourceUri sourceInstanceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(execution.getVariable("globalSubscriberId"))
+                .serviceSubscription(execution.getVariable("subscriptionServiceType"))
+                .serviceInstance(sourceId))
+                .relationshipAPI()
+        client.create(sourceInstanceUri, relationship)
+    }
+
+    static def createSliceProfileInstance(SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo, String sliceProfileName, String oStatus) {
         // create slice profile
         ServiceInstance rspi = new ServiceInstance()
-        rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
+        rspi.setServiceInstanceName(sliceProfileName)
         rspi.setServiceType(sliceTaskInfo.sliceProfile.getSST())
-        rspi.setServiceRole("slice-profile-instance")
+        rspi.setServiceRole("slice-profile")
         rspi.setOrchestrationStatus(oStatus)
         rspi.setServiceInstanceLocationId(sliceTaskInfo.sliceProfile.getPLMNIdList())
         rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
         rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
         rspi.setWorkloadContext(sliceTaskInfo.subnetType.subnetType)
         rspi.setEnvironmentContext(sliceTaskInfo.sliceProfile.getSNSSAIList())
+        rspi.setServiceFunction(sliceTaskInfo.sliceProfile.getResourceSharingLevel())
 
         //timestamp format YYYY-MM-DD hh:mm:ss
         rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
         return rspi
     }
 
+    public void createTNEndPoints(DelegateExecution execution) {
+        String type = "endpoint"
+        String function = "transport_EP"
+        int prefixLength = 24
+        String addressFamily = "ipv4"
+        //BH RAN end point update
+        //set BH end point
+        String sliceParams = execution.getVariable("sliceParams")
+        List<String> BH_endPoints = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "endPoints"))
+        logger.debug("BH end points list : "+BH_endPoints)
+        if(BH_endPoints.empty) {
+            String msg = "End point info is empty"
+            logger.debug(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+        }
+        String bh_routeId = UUID.randomUUID().toString()
+        execution.setVariable("tranportEp_ID_bh", bh_routeId)
+        String role = "CU"
+        String CU_IpAddress = jsonUtil.getJsonValue(bh_endpoint, "IpAddress")
+        String LogicalLinkId = jsonUtil.getJsonValue(bh_endpoint, "LogicalLinkId")
+        String nextHopInfo = jsonUtil.getJsonValue(bh_endpoint, "nextHopInfo")
+        NetworkRoute bh_ep = new NetworkRoute()
+        bh_ep.setRouteId(bh_routeId)
+        bh_ep.setFunction(function)
+        bh_ep.setRole(role)
+        bh_ep.setType(type)
+        bh_ep.setIpAddress(CU_IpAddress)
+        bh_ep.setLogicalInterfaceId(LogicalLinkId)
+        bh_ep.setNextHop(nextHopInfo)
+        bh_ep.setPrefixLength(prefixLength)
+        bh_ep.setAddressFamily(addressFamily)
+        //FH RAN end points update
+        //RU
+        String RU_routeId = UUID.randomUUID().toString()
+        execution.setVariable("tranportEp_ID_RU", RU_routeId)
+        role = "RU"
+        NetworkRoute RU_ep = new NetworkRoute()
+        RU_ep.setRouteId(RU_routeId)
+        RU_ep.setFunction(function)
+        RU_ep.setRole(role)
+        RU_ep.setType(type)
+        RU_ep.setIpAddress("192.168.100.4")
+        RU_ep.setLogicalInterfaceId("1234")
+        RU_ep.setNextHop("Host1")
+        RU_ep.setPrefixLength(prefixLength)
+        RU_ep.setAddressFamily(addressFamily)
+        //DU Ingress
+        String DUIN_routeId = UUID.randomUUID().toString()
+        execution.setVariable("tranportEp_ID_DUIN", DUIN_routeId)
+        role = "DU"
+        NetworkRoute DU_ep = new NetworkRoute()
+        DU_ep.setRouteId(DUIN_routeId)
+        DU_ep.setFunction(function)
+        DU_ep.setRole(role)
+        DU_ep.setType(type)
+        DU_ep.setIpAddress("192.168.100.5")
+        DU_ep.setLogicalInterfaceId("1234")
+        DU_ep.setNextHop("Host2")
+        DU_ep.setPrefixLength(prefixLength)
+        DU_ep.setAddressFamily(addressFamily)
+        //MH RAN end point update
+        //DUEG
+        String DUEG_routeId = UUID.randomUUID().toString()
+        execution.setVariable("tranportEp_ID_DUEG", DUEG_routeId)
+        NetworkRoute DUEG_ep = new NetworkRoute()
+        DUEG_ep.setRouteId(DUEG_routeId)
+        DUEG_ep.setFunction(function)
+        DUEG_ep.setRole(role)
+        DUEG_ep.setType(type)
+        DUEG_ep.setIpAddress("192.168.100.5")
+        DUEG_ep.setLogicalInterfaceId("1234")
+        DUEG_ep.setPrefixLength(prefixLength)
+        DUEG_ep.setAddressFamily(addressFamily)
+        DUEG_ep.setNextHop("Host3")
+        //CUIN
+        String CUIN_routeId = UUID.randomUUID().toString()
+        execution.setVariable("tranportEp_ID_CUIN", CUIN_routeId)
+        NetworkRoute CUIN_ep = new NetworkRoute()
+        CUIN_ep.setRouteId(CUIN_routeId)
+        CUIN_ep.setFunction(function)
+        CUIN_ep.setRole(role)
+        CUIN_ep.setType(type)
+        CUIN_ep.setIpAddress("192.168.100.6")
+        CUIN_ep.setLogicalInterfaceId("1234")
+        CUIN_ep.setNextHop("Host4")
+        CUIN_ep.setPrefixLength(prefixLength)
+        CUIN_ep.setAddressFamily(addressFamily)
+        try {
+            AAIResourcesClient client = new AAIResourcesClient()
+            logger.debug("creating bh endpoint . ID : "+bh_routeId+" node details : "+bh_ep.toString())
+            AAIResourceUri networkRouteUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(bh_routeId))
+            client.create(networkRouteUri, bh_ep)
+            logger.debug("creating RU endpoint . ID : "+RU_routeId+" node details : "+RU_ep.toString())
+            networkRouteUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(RU_routeId))
+            client.create(networkRouteUri, RU_ep)
+            logger.debug("creating DUIN endpoint . ID : "+DUIN_routeId+" node details : "+DU_ep.toString())
+            networkRouteUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(DUIN_routeId))
+            client.create(networkRouteUri, DU_ep)
+            logger.debug("creating DUEG endpoint . ID : "+DUEG_routeId+" node details : "+DUEG_ep.toString())
+            networkRouteUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(DUEG_routeId))
+            client.create(networkRouteUri, DUEG_ep)
+            logger.debug("creating CUIN endpoint . ID : "+CUIN_routeId+" node details : "+CUIN_ep.toString())
+            networkRouteUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.network().networkRoute(CUIN_routeId))
+            client.create(networkRouteUri, CUIN_ep)
+            //relationship b/w bh_ep and RAN NSSI
+            def AN_NSSI = execution.getVariable("RANServiceInstanceId")
+            Relationship relationship = new Relationship()
+            String relatedLink = "aai/v21/network/network-routes/network-route/${bh_routeId}"
+            relationship.setRelatedLink(relatedLink)
+            relationship.setRelatedTo("network-route")
+            relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+            anNssmfUtils.createRelationShipInAAI(execution, relationship, AN_NSSI)
+            def ANNF_serviceInstanceId = execution.getVariable("RANNFServiceInstanceId")
+            relatedLink = "aai/v21/network/network-routes/network-route/${RU_routeId}"
+            relationship.setRelatedLink(relatedLink)
+            anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
+            relatedLink = "aai/v21/network/network-routes/network-route/${DUIN_routeId}"
+            relationship.setRelatedLink(relatedLink)
+            anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
+            relatedLink = "aai/v21/network/network-routes/network-route/${DUEG_routeId}"
+            relationship.setRelatedLink(relatedLink)
+            anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
+            relatedLink = "aai/v21/network/network-routes/network-route/${CUIN_routeId}"
+            relationship.setRelatedLink(relatedLink)
+            anNssmfUtils.createRelationShipInAAI(execution, relationship, ANNF_serviceInstanceId)
+        } catch (BpmnError e) {
+            throw e
+        } catch (Exception ex) {
+            String msg = "Exception in createEndPointsInAai " + ex.getMessage()
+            logger.info(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+        }
+    }
+
+    /**
+     * create TN Slice Profile Instance
+     * @param execution
+     */
+    void createTnFHSliceProfileInstance(DelegateExecution execution) {
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+        String oStatus = "deactivated"
+
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnFHSliceTaskInfo
+        String serviceInstanceId = UUID.randomUUID().toString()
+
+        sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
+        String sliceProfileName = "tn_fh" + sliceParams.serviceName
+        //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
+
+        // create slice profile
+        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
+
+        //timestamp format YYYY-MM-DD hh:mm:ss
+        rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
+
+        execution.setVariable("communicationServiceInstance", rspi)
+
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId)
+                .serviceSubscription(subscriptionServiceType)
+                .serviceInstance(serviceInstanceId))
+        client.create(uri, rspi)
+
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
+
+    /**
+     * create Tn Slice Profile
+     * @param execution
+     */
+    void createTnFHSliceProfile(DelegateExecution execution) {
+
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnFHSliceTaskInfo
+
+        SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
+        String profileId = UUID.randomUUID().toString()
+        tnSliceProfile.setSliceProfileId(profileId)
+
+        SliceProfile sliceProfile = new SliceProfile()
+        sliceProfile.setProfileId(profileId)
+        sliceProfile.setLatency(tnSliceProfile.latency)
+        sliceProfile.setMaxBandwidth(tnSliceProfile.maxBandwidth)
+        sliceProfile.setJitter(tnSliceProfile.jitter)
+
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId)
+                .serviceSubscription(subscriptionServiceType)
+                .serviceInstance(sliceTaskInfo.sliceInstanceId)
+                .sliceProfile(profileId))
+        client.create(uri, sliceProfile)
+
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
+
+    /**
+     * prepare AllocateCnNssi
+     * @param execution
+     */
+    void prepareAllocateTnFHNssi(DelegateExecution execution) {
+
+        //todo:
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.getTnFHSliceTaskInfo()
+
+        NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
+
+        AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
+        allocateTnNssi.setNssiId(sliceTaskInfo.getSuggestNssiId())
+        //todo: AllocateTnNssi
+        //todo: endPointId -> set into tn
+        List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
+        TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
+        List<ConnectionLink> connectionLinks = new ArrayList<>()
+        ConnectionLink connectionLink = new ConnectionLink()
+        connectionLink.setTransportEndpointA(UUID.randomUUID().toString())
+        connectionLink.setTransportEndpointB(UUID.randomUUID().toString())
+        connectionLinks.add(connectionLink)
+        transportSliceNetwork.setConnectionLinks(connectionLinks)
+        transportSliceNetworks.add(transportSliceNetwork)
+        allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
+
+        allocateTnNssi.setSliceProfile(sliceTaskInfo.getSliceProfile().trans2TnProfile())
+        NsiInfo nsiInfo = new NsiInfo()
+        nsiInfo.setNsiId(sliceParams.getSuggestNsiId())
+        nsiInfo.setNsiName(sliceParams.getSuggestNsiName())
+        allocateTnNssi.setNsiInfo(nsiInfo)
+
+        EsrInfo esrInfo = new EsrInfo()
+        esrInfo.setVendor(sliceTaskInfo.getVendor())
+        esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
+
+        String globalSubscriberId = execution.getVariable("globalSubscriberId") as String
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType") as String
+
+        ServiceInfo serviceInfo = ServiceInfo.builder()
+                .globalSubscriberId(globalSubscriberId)
+                .subscriptionServiceType(subscriptionServiceType)
+                .nsiId(sliceParams.getSuggestNsiId())
+                .serviceInvariantUuid(sliceTaskInfo.getNSSTInfo().getInvariantUUID())
+                .serviceUuid(sliceTaskInfo.getNSSTInfo().getUUID())
+                .nssiId(sliceTaskInfo.getSuggestNssiId())
+                .sST(sliceTaskInfo.getSliceProfile().getSST() ?: sliceParams.getServiceProfile().get("sST"))
+                .nssiName("nssi_tn_fh_" + execution.getVariable("sliceServiceInstanceName") as String)
+                .build()
+
+        nbiRequest.setServiceInfo(serviceInfo)
+        nbiRequest.setEsrInfo(esrInfo)
+        nbiRequest.setAllocateTnNssi(allocateTnNssi)
+
+        execution.setVariable("TnFHAllocateNssiNbiRequest", nbiRequest)
+        execution.setVariable("tnFHSliceTaskInfo", sliceTaskInfo)
+        execution.setVariable("tnFHSubnetType", SubnetType.TN_FH)
+    }
+
+    /**
+     * Update relationship between
+     * 1. NSI and NSSI
+     * 2. Slice Profile and Service Profile
+     * 3. SliceProfile and NSSI
+     *
+     * @param execution
+     */
+    public void updateTnFHRelationship(DelegateExecution execution) {
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        NssiResponse result = execution.getVariable("tnFHNssiAllocateResult") as NssiResponse
+        String nssiId = result.getNssiId()
+        String nsiId = sliceParams.getSuggestNsiId()
+        String sliceProfileInstanceId = sliceParams.tnFHSliceTaskInfo.sliceInstanceId
+        String serviceProfileInstanceId = sliceParams.serviceId
+
+        updateRelationship(execution, nsiId, nssiId)
+
+        updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
+
+        updateRelationship(execution,sliceProfileInstanceId, nssiId)
+
+        sliceParams.tnFHSliceTaskInfo.suggestNssiId = nssiId
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
+
+    /**
+     * create TN Slice Profile Instance
+     * @param execution
+     */
+    void createTnMHSliceProfileInstance(DelegateExecution execution) {
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+        String oStatus = "deactivated"
+
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnMHSliceTaskInfo
+        String serviceInstanceId = UUID.randomUUID().toString()
+
+        sliceTaskInfo.setSliceInstanceId(serviceInstanceId)
+        String sliceProfileName = "tn_mh_" + sliceParams.serviceName
+        ServiceInstance rspi = createSliceProfileInstance(sliceTaskInfo, sliceProfileName, oStatus)
+
+        rspi.setCreatedAt(new Date(System.currentTimeMillis()).format("yyyy-MM-dd HH:mm:ss", TimeZone.getDefault()))
+
+        execution.setVariable("communicationServiceInstance", rspi)
+
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId)
+                .serviceSubscription(subscriptionServiceType)
+                .serviceInstance(serviceInstanceId))
+        client.create(uri, rspi)
+
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
+
+    /**
+     * create Tn Slice Profile
+     * @param execution
+     */
+    void createTnMHSliceProfile(DelegateExecution execution) {
+
+        String globalSubscriberId = execution.getVariable("globalSubscriberId")
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.tnMHSliceTaskInfo
+
+        SliceProfileAdapter tnSliceProfile = sliceTaskInfo.sliceProfile
+        String profileId = UUID.randomUUID().toString()
+        tnSliceProfile.setSliceProfileId(profileId)
+
+        SliceProfile sliceProfile = new SliceProfile()
+        sliceProfile.setProfileId(profileId)
+        sliceProfile.setLatency(tnSliceProfile.latency)
+        sliceProfile.setMaxBandwidth(tnSliceProfile.maxBandwidth)
+        sliceProfile.setJitter(tnSliceProfile.jitter)
+
+        AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business()
+                .customer(globalSubscriberId)
+                .serviceSubscription(subscriptionServiceType)
+                .serviceInstance(sliceTaskInfo.sliceInstanceId)
+                .sliceProfile(profileId))
+        client.create(uri, sliceProfile)
+
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
+
+    /**
+     * prepare AllocateCnNssi
+     * @param execution
+     */
+    void prepareAllocateTnMHNssi(DelegateExecution execution) {
+
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+        SliceTaskInfo<SliceProfileAdapter> sliceTaskInfo = sliceParams.getTnMHSliceTaskInfo()
+
+        NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
+
+        AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
+        allocateTnNssi.setNssiId(sliceTaskInfo.getSuggestNssiId())
+        List<TransportSliceNetwork> transportSliceNetworks = new ArrayList<>()
+        TransportSliceNetwork transportSliceNetwork = new TransportSliceNetwork()
+        List<ConnectionLink> connectionLinks = new ArrayList<>()
+        ConnectionLink connectionLink = new ConnectionLink()
+        connectionLink.setTransportEndpointA(UUID.randomUUID().toString())
+        connectionLink.setTransportEndpointB(UUID.randomUUID().toString())
+        connectionLinks.add(connectionLink)
+        transportSliceNetwork.setConnectionLinks(connectionLinks)
+        transportSliceNetworks.add(transportSliceNetwork)
+        allocateTnNssi.setTransportSliceNetworks(transportSliceNetworks)
+
+        allocateTnNssi.setSliceProfile(sliceTaskInfo.getSliceProfile().trans2TnProfile())
+        NsiInfo nsiInfo = new NsiInfo()
+        nsiInfo.setNsiId(sliceParams.getSuggestNsiId())
+        nsiInfo.setNsiName(sliceParams.getSuggestNsiName())
+        allocateTnNssi.setNsiInfo(nsiInfo)
+
+        EsrInfo esrInfo = new EsrInfo()
+        esrInfo.setVendor(sliceTaskInfo.getVendor())
+        esrInfo.setNetworkType(sliceTaskInfo.getNetworkType())
+
+        String globalSubscriberId = execution.getVariable("globalSubscriberId") as String
+        String subscriptionServiceType = execution.getVariable("subscriptionServiceType") as String
+
+        ServiceInfo serviceInfo = ServiceInfo.builder()
+                .globalSubscriberId(globalSubscriberId)
+                .subscriptionServiceType(subscriptionServiceType)
+                .nsiId(sliceParams.getSuggestNsiId())
+                .serviceInvariantUuid(sliceTaskInfo.getNSSTInfo().getInvariantUUID())
+                .serviceUuid(sliceTaskInfo.getNSSTInfo().getUUID())
+                .nssiId(sliceTaskInfo.getSuggestNssiId())
+                .sST(sliceTaskInfo.getSliceProfile().getSST() ?: sliceParams.getServiceProfile().get("sST"))
+                .nssiName("nssi_tn_mh_" + execution.getVariable("sliceServiceInstanceName") as String)
+                .build()
+
+        nbiRequest.setServiceInfo(serviceInfo)
+        nbiRequest.setEsrInfo(esrInfo)
+        nbiRequest.setAllocateTnNssi(allocateTnNssi)
+
+        execution.setVariable("TnMHAllocateNssiNbiRequest", nbiRequest)
+        execution.setVariable("tnMHSliceTaskInfo", sliceTaskInfo)
+        execution.setVariable("tnMHSubnetType", SubnetType.TN_MH)
+    }
+
+    /**
+     * Update relationship between
+     * 1. NSI and NSSI
+     * 2. Slice Profile and Service Profile
+     * 3. SliceProfile and NSSI
+     *
+     * @param execution
+     */
+    public void updateTnMHRelationship(DelegateExecution execution) {
+        SliceTaskParamsAdapter sliceParams =
+                execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+        NssiResponse result = execution.getVariable("tnMHNssiAllocateResult") as NssiResponse
+        String nssiId = result.getNssiId()
+        String nsiId = sliceParams.getSuggestNsiId()
+        String sliceProfileInstanceId = sliceParams.tnMHSliceTaskInfo.sliceInstanceId
+        String serviceProfileInstanceId = sliceParams.serviceId
+
+        updateRelationship(execution, nsiId, nssiId)
+
+        updateRelationship(execution, serviceProfileInstanceId, sliceProfileInstanceId)
+
+        updateRelationship(execution,sliceProfileInstanceId, nssiId)
+
+        sliceParams.tnMHSliceTaskInfo.suggestNssiId = nssiId
+        execution.setVariable("sliceTaskParams", sliceParams)
+    }
 }