summaryrefslogtreecommitdiffstats
path: root/bpmn/so-bpmn-infrastructure-common
diff options
context:
space:
mode:
Diffstat (limited to 'bpmn/so-bpmn-infrastructure-common')
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy448
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateAccessNSSI.groovy589
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssi.groovy162
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy1041
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSIV2.groovy613
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSIV2.groovy117
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOptionV2.groovy907
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy231
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeAllocateAccessNSSI.groovy556
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssi.groovy169
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy656
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy193
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy401
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnAllocateNssi.groovy339
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy244
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssiTest.groovy178
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateTnNssiTest.groovy167
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssiTest.groovy135
-rw-r--r--bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssiTest.groovy174
19 files changed, 7320 insertions, 0 deletions
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy
new file mode 100644
index 0000000000..d59f865b01
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/AnNssmfutils.groovy
@@ -0,0 +1,448 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, Wipro Limited.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.google.gson.JsonArray
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.OofUtils
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.sql.Timestamp
+import java.util.List
+import static org.apache.commons.lang3.StringUtils.isBlank
+import com.google.gson.JsonObject
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import javax.ws.rs.NotFoundException
+import org.onap.so.beans.nsmf.AllocateTnNssi
+import org.onap.so.beans.nsmf.DeAllocateNssi
+import org.onap.so.beans.nsmf.EsrInfo
+import org.onap.so.beans.nsmf.ServiceInfo
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aai.domain.yang.SliceProfile
+import org.onap.aai.domain.yang.SliceProfiles
+import org.onap.aai.domain.yang.Relationship
+
+class AnNssmfUtils {
+
+ private static final Logger logger = LoggerFactory.getLogger(AnNssmfUtils.class)
+ ObjectMapper objectMapper = new ObjectMapper();
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ public String buildSelectRANNSSIRequest(String requestId, String messageType, String UUID,String invariantUUID,
+ String name, Map<String, Object> profileInfo, List<String> nsstInfoList, JsonArray capabilitiesList, Boolean preferReuse){
+
+ def transactionId = requestId
+ logger.debug( "transactionId is: " + transactionId)
+ String correlator = requestId
+ String callbackUrl = UrnPropertiesReader.getVariable("mso.adapters.oof.callback.endpoint") + "/" + messageType + "/" + correlator
+ ObjectMapper objectMapper = new ObjectMapper();
+ String profileJson = objectMapper.writeValueAsString(profileInfo);
+ String nsstInfoListString = objectMapper.writeValueAsString(nsstInfoList);
+ //Prepare requestInfo object
+ JsonObject requestInfo = new JsonObject()
+ requestInfo.addProperty("transactionId", transactionId)
+ requestInfo.addProperty("requestId", requestId)
+ requestInfo.addProperty("callbackUrl", callbackUrl)
+ requestInfo.addProperty("sourceId","SO" )
+ requestInfo.addProperty("timeout", 600)
+ requestInfo.addProperty("numSolutions", 1)
+
+ //Prepare serviceInfo object
+ JsonObject ranNsstInfo = new JsonObject()
+ ranNsstInfo.addProperty("UUID", UUID)
+ ranNsstInfo.addProperty("invariantUUID", invariantUUID)
+ ranNsstInfo.addProperty("name", name)
+
+ JsonObject json = new JsonObject()
+ json.add("requestInfo", requestInfo)
+ json.add("NSTInfo", ranNsstInfo)
+ json.addProperty("serviceProfile", profileJson)
+ json.addProperty("NSSTInfo", nsstInfoListString)
+ json.add("subnetCapabilities", capabilitiesList)
+ json.addProperty("preferReuse", preferReuse)
+
+ return json.toString()
+}
+
+public String buildCreateTNNSSMFSubnetCapabilityRequest() {
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("TN")
+ esrInfo.setVendor("ONAP")
+
+ JsonArray subnetTypes = new JsonArray()
+ subnetTypes.add("TN_FH")
+ subnetTypes.add("TN_MH")
+ JsonObject response = new JsonObject()
+ response.add("subnetCapabilityQuery", subnetTypes)
+ response.addProperty("esrInfo", objectMapper.writeValueAsString(esrInfo))
+ return response.toString()
+}
+
+public String buildCreateANNFNSSMFSubnetCapabilityRequest() {
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("AN")
+ esrInfo.setVendor("ONAP")
+
+ JsonArray subnetTypes = new JsonArray()
+ subnetTypes.add("AN_NF")
+ JsonObject response = new JsonObject()
+ response.add("subnetCapabilityQuery", subnetTypes)
+ response.addProperty("esrInfo", objectMapper.writeValueAsString(esrInfo))
+ return response.toString()
+}
+public void createDomainWiseSliceProfiles(List<String> ranConstituentSliceProfiles, DelegateExecution execution) {
+
+ for(String profile : ranConstituentSliceProfiles) {
+ String domainType = jsonUtil.getJsonValue(profile, "domainType")
+ switch(domainType) {
+ case "AN_NF":
+ execution.setVariable("ranNfSliceProfile", profile)
+ break
+ case "TN_FH":
+ execution.setVariable("tnFhSliceProfile", profile)
+ break
+ case "TN_MH":
+ execution.setVariable("tnMhSliceProfile", profile)
+ break
+ default:
+ logger.debug("No expected match found for current domainType")
+ logger.error("No expected match found for current domainType "+ domainType)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current domainType "+ domainType)
+ }
+
+ }
+}
+
+public void createSliceProfilesInAai(DelegateExecution execution) {
+
+ org.onap.aai.domain.yang.ServiceInstance ANNF_sliceProfileInstance = new ServiceInstance();
+ org.onap.aai.domain.yang.ServiceInstance TNFH_sliceProfileInstance = new ServiceInstance();
+ org.onap.aai.domain.yang.ServiceInstance TNMH_sliceProfileInstance = new ServiceInstance();
+ //generate slice profile ids and slice profile instance ids
+ String ANNF_sliceProfileInstanceId = UUID.randomUUID().toString()
+ String ANNF_sliceProfileId = UUID.randomUUID().toString()
+ String TNFH_sliceProfileInstanceId = UUID.randomUUID().toString()
+ String TNFH_sliceProfileId = UUID.randomUUID().toString()
+ String TNMH_sliceProfileInstanceId = UUID.randomUUID().toString()
+ String TNMH_sliceProfileId = UUID.randomUUID().toString()
+ execution.setVariable("ANNF_sliceProfileInstanceId",ANNF_sliceProfileInstanceId)
+ execution.setVariable("ANNF_sliceProfileId",ANNF_sliceProfileId)
+ execution.setVariable("TNFH_sliceProfileInstanceId",TNFH_sliceProfileInstanceId)
+ execution.setVariable("TNFH_sliceProfileId",TNFH_sliceProfileId)
+ execution.setVariable("TNMH_sliceProfileInstanceId",TNMH_sliceProfileInstanceId)
+ execution.setVariable("TNMH_sliceProfileId",TNMH_sliceProfileId)
+ //slice profiles assignment
+ org.onap.aai.domain.yang.SliceProfiles ANNF_SliceProfiles = new SliceProfiles()
+ org.onap.aai.domain.yang.SliceProfiles TNFH_SliceProfiles = new SliceProfiles()
+ org.onap.aai.domain.yang.SliceProfiles TNMH_SliceProfiles = new SliceProfiles()
+ org.onap.aai.domain.yang.SliceProfile ANNF_SliceProfile = new SliceProfile()
+ org.onap.aai.domain.yang.SliceProfile TNFH_SliceProfile = new SliceProfile()
+ org.onap.aai.domain.yang.SliceProfile TNMH_SliceProfile = new SliceProfile()
+ ANNF_SliceProfile = createSliceProfile("AN-NF", execution)
+ TNFH_SliceProfile = createSliceProfile("TN-FH",execution)
+ TNMH_SliceProfile = createSliceProfile("TN-MH",execution)
+
+ ANNF_SliceProfiles.getSliceProfile().add(ANNF_SliceProfile)
+ TNFH_SliceProfiles.getSliceProfile().add(TNFH_SliceProfile)
+ TNMH_SliceProfiles.getSliceProfile().add(TNMH_SliceProfile)
+
+ logger.debug("sliceProfiles : 1. "+ANNF_SliceProfiles.toString()+"\n 2. "+TNFH_SliceProfiles.toString()+"\n 3. "+TNMH_SliceProfiles.toString())
+ //ANNF slice profile instance creation
+ ANNF_sliceProfileInstance.setServiceInstanceId(ANNF_sliceProfileInstanceId)
+ String sliceInstanceName = "sliceprofile_"+ANNF_sliceProfileId
+ ANNF_sliceProfileInstance.setServiceInstanceName(sliceInstanceName)
+ String serviceType = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "sST")
+ ANNF_sliceProfileInstance.setServiceType(serviceType)
+ String serviceStatus = "deactivated"
+ ANNF_sliceProfileInstance.setOrchestrationStatus(serviceStatus)
+ String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "plmnIdList")
+ ANNF_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ String serviceRole = "slice-profile-instance"
+ ANNF_sliceProfileInstance.setServiceRole(serviceRole)
+ List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
+ String snssai = snssaiList.get(0)
+ ANNF_sliceProfileInstance.setEnvironmentContext(snssai)
+ ANNF_sliceProfileInstance.setWorkloadContext("AN-NF")
+ ANNF_sliceProfileInstance.setSliceProfiles(ANNF_SliceProfiles)
+ logger.debug("completed ANNF sliceprofileinstance build "+ ANNF_sliceProfileInstance.toString())
+ //TNFH slice profile instance creation
+ TNFH_sliceProfileInstance.setServiceInstanceId(TNFH_sliceProfileInstanceId)
+ sliceInstanceName = "sliceprofile_"+TNFH_sliceProfileId
+ TNFH_sliceProfileInstance.setServiceInstanceName(sliceInstanceName)
+ serviceType = jsonUtil.getJsonValue(execution.getVariable("tnFhSliceProfile"), "sST")
+ TNFH_sliceProfileInstance.setServiceType(serviceType)
+ TNFH_sliceProfileInstance.setOrchestrationStatus(serviceStatus)
+ serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("tnFhSliceProfile"), "plmnIdList")
+ TNFH_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ TNFH_sliceProfileInstance.setServiceRole(serviceRole)
+ TNFH_sliceProfileInstance.setEnvironmentContext(snssai)
+ TNFH_sliceProfileInstance.setWorkloadContext("TN-FH")
+ TNFH_sliceProfileInstance.setSliceProfiles(TNFH_SliceProfiles)
+ logger.debug("completed TNFH sliceprofileinstance build "+TNFH_sliceProfileInstance)
+ //TNMH slice profile instance creation
+ TNMH_sliceProfileInstance.setServiceInstanceId(TNMH_sliceProfileInstanceId)
+ sliceInstanceName = "sliceprofile_"+TNMH_sliceProfileId
+ TNMH_sliceProfileInstance.setServiceInstanceName(sliceInstanceName)
+ serviceType = jsonUtil.getJsonValue(execution.getVariable("tnMhSliceProfile"), "sST")
+ TNMH_sliceProfileInstance.setServiceType(serviceType)
+ TNMH_sliceProfileInstance.setOrchestrationStatus(serviceStatus)
+ serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("tnMhSliceProfile"), "plmnIdList")
+ TNMH_sliceProfileInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ TNMH_sliceProfileInstance.setServiceRole(serviceRole)
+ TNMH_sliceProfileInstance.setEnvironmentContext(snssai)
+ TNMH_sliceProfileInstance.setWorkloadContext("TN-MH")
+ TNMH_sliceProfileInstance.setSliceProfiles(TNMH_SliceProfiles)
+ logger.debug("completed TNMH sliceprofileinstance build "+TNMH_sliceProfileInstance)
+ String msg = ""
+ try {
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri sliceProfileUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), ANNF_sliceProfileInstanceId)
+ client.create(sliceProfileUri, ANNF_sliceProfileInstance)
+
+ AAIResourceUri sliceProfileUri1 = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), TNFH_sliceProfileInstanceId)
+ client.create(sliceProfileUri1, TNFH_sliceProfileInstance)
+
+ AAIResourceUri sliceProfileUri2 = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), TNMH_sliceProfileInstanceId)
+ client.create(sliceProfileUri2, TNMH_sliceProfileInstance)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in AnNssmfUtils.createSliceProfilesInAai " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+}
+private SliceProfile createSliceProfile(String domainType, DelegateExecution execution) {
+
+ SliceProfile result = new SliceProfile()
+ Map<String,Object> profile
+ switch(domainType) {
+ case "AN-NF":
+ profile = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)//pending fields - maxBandwidth, sST, pLMNIdList, cSReliabilityMeanTime,
+ //msgSizeByte, maxNumberofPDUSessions,overallUserDensity,transferIntervalTarget
+ result.setJitter(profile.get("jitter"))
+ result.setLatency(profile.get("latency"))
+ result.setResourceSharingLevel(profile.get("resourceSharingLevel"))
+ result.setSNssai(profile.get("sNSSAI"))
+ result.setUeMobilityLevel(profile.get("uEMobilityLevel"))
+ result.setMaxNumberOfUEs(profile.get("maxNumberofUEs"))
+ result.setActivityFactor(profile.get("activityFactor"))
+ result.setCoverageAreaTAList(profile.get("coverageAreaTAList"))
+ result.setCsAvailability(profile.get("cSAvailabilityTarget"))
+ result.setExpDataRateDL(profile.get("expDataRateDL"))
+ result.setExpDataRateUL(profile.get("expDataRateUL"))
+ result.setSurvivalTime(profile.get("survivalTime"))
+ result.setAreaTrafficCapDL(profile.get("areaTrafficCapDL"))
+ result.setAreaTrafficCapUL(profile.get("areaTrafficCapUL"))
+ result.setExpDataRate(profile.get("expDataRate"))
+ result.setProfileId(execution.getVariable("ANNF_sliceProfileId"))
+ break
+ case "TN-FH":
+ profile = objectMapper.readValue(execution.getVariable("tnFhSliceProfile"), Map.class) //pending fields - maxBandwidth, sST, pLMNIdList
+ result.setJitter(profile.get("jitter"))
+ result.setLatency(profile.get("latency"))
+ result.setResourceSharingLevel(profile.get("resourceSharingLevel"))
+ result.setSNssai(profile.get("sNSSAI"))
+ result.setProfileId(execution.getVariable("TNFH_sliceProfileId"))
+ break
+ case "TN-MH":
+ profile = objectMapper.readValue(execution.getVariable("tnMhSliceProfile"), Map.class)//pending fields - maxBandwidth, sST, pLMNIdList
+ result.setJitter(profile.get("jitter"))
+ result.setLatency(profile.get("latency"))
+ result.setResourceSharingLevel(profile.get("resourceSharingLevel"))
+ result.setSNssai(profile.get("sNSSAI"))
+ result.setProfileId(execution.getVariable("TNMH_sliceProfileId"))
+ break
+ default:
+ logger.debug("No expected match found for current domainType")
+ logger.error("No expected match found for current domainType "+ domainType)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current domainType "+ domainType)
+ }
+ return result
+}
+
+ /**
+ * create relationship in AAI
+ */
+ public createRelationShipInAAI = { DelegateExecution execution, final Relationship relationship, String instanceId ->
+ logger.debug("createRelationShipInAAI Start")
+ String msg
+ AAIResourcesClient client = new AAIResourcesClient()
+ try {
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ instanceId).relationshipAPI()
+ client.create(uri, relationship)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in CreateCommunicationService.createRelationShipInAAI. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug("createRelationShipInAAI Exit")
+
+ }
+
+ public void processRanNfModifyRsp(DelegateExecution execution) {
+ String status = execution.getVariable("ranNfStatus")
+ if(status.equals("success")) {
+ logger.debug("completed Ran NF NSSI modification ... proceeding with the flow")
+ }
+ else {
+ logger.error("failed to modify ran Nf nssi")
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000, "modify ran nf nssi not successfull")
+ }
+ }
+
+ public String buildCreateNSSMFRequest(DelegateExecution execution, String domainType, String action) {
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("TN")
+ esrInfo.setVendor("ONAP")
+ String esrInfoString = objectMapper.writeValueAsString(esrInfo)
+ JsonObject response = new JsonObject()
+ JsonObject allocateTnNssi = new JsonObject()
+ JsonObject serviceInfo = new JsonObject()
+ JsonArray transportSliceNetworksList = new JsonArray()
+ JsonArray connectionLinksList = new JsonArray()
+ JsonObject connectionLinks = new JsonObject()
+ if(action.equals("allocate")){
+ Map<String, String> endpoints
+ if(domainType.equals("TN_FH")) {
+ serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNFH_modelInvariantUuid"))
+ serviceInfo.addProperty("serviceUuid", execution.getVariable("TNFH_modelUuid"))
+ allocateTnNssi.addProperty("nsstId", execution.getVariable("TNFH_modelUuid"))
+ allocateTnNssi.addProperty("nssiName", execution.getVariable("TNFH_modelName"))
+ Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnFhSliceProfile"), Map.class)
+ sliceProfile.put("sliceProfileId", execution.getVariable("TNFH_sliceProfileInstanceId"))
+ String sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ allocateTnNssi.addProperty("sliceProfile", sliceProfileString)
+ endpoints.put("transportEndpointA", execution.getVariable("tranportEp_ID_RU"))
+ endpoints.put("transportEndpointB", execution.getVariable("tranportEp_ID_DUIN"))
+ String endpointsString = objectMapper.writeValueAsString(endpoints)
+ connectionLinksList.add(endpointsString)
+ }else if(domainType.equals("TN_MH")) {
+ serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNMH_modelInvariantUuid"))
+ serviceInfo.addProperty("serviceUuid", execution.getVariable("TNMH_modelUuid"))
+ allocateTnNssi.addProperty("nsstId", execution.getVariable("TNMH_modelUuid"))
+ allocateTnNssi.addProperty("nssiName", execution.getVariable("TNMH_modelName"))
+ Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("tnMhSliceProfile"), Map.class)
+ sliceProfile.put("sliceProfileId", execution.getVariable("TNMH_sliceProfileInstanceId"))
+ String sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ allocateTnNssi.addProperty("sliceProfile", sliceProfileString)
+ endpoints.put("transportEndpointA", execution.getVariable("tranportEp_ID_DUEG"))
+ endpoints.put("transportEndpointB", execution.getVariable("tranportEp_ID_CUIN"))
+ String endpointsString = objectMapper.writeValueAsString(endpoints)
+ connectionLinksList.add(endpointsString)
+ }
+
+ //Connection links
+ connectionLinks.add("connectionLinks", connectionLinksList)
+ transportSliceNetworksList.add(connectionLinks)
+ allocateTnNssi.add("transportSliceNetworks", transportSliceNetworksList)
+ allocateTnNssi.addProperty("nssiId", null)
+ serviceInfo.addProperty("nssiId", null)
+ }else if(action.equals("modify-allocate")) {
+ if(domainType.equals("TN_FH")) {
+ serviceInfo.addProperty("serviceInvariantUuid", null)
+ serviceInfo.addProperty("serviceUuid", null)
+ allocateTnNssi.addProperty("nsstId", null)
+ allocateTnNssi.addProperty("nssiName", execution.getVariable("TNFH_nssiName"))
+ allocateTnNssi.addProperty("sliceProfileId", execution.getVariable("TNFH_sliceProfileInstanceId"))
+ allocateTnNssi.addProperty("nssiId", execution.getVariable("TNFH_NSSI"))
+ serviceInfo.addProperty("nssiId", execution.getVariable("TNFH_NSSI"))
+ }else if(domainType.equals("TN_MH")) {
+ serviceInfo.addProperty("serviceInvariantUuid", null)
+ serviceInfo.addProperty("serviceUuid", null)
+ allocateTnNssi.addProperty("nsstId", null)
+ allocateTnNssi.addProperty("nssiName", execution.getVariable("TNMH_nssiName"))
+ allocateTnNssi.addProperty("sliceProfileId", execution.getVariable("TNMH_sliceProfileInstanceId"))
+ allocateTnNssi.addProperty("nssiId", execution.getVariable("TNMH_NSSI"))
+ serviceInfo.addProperty("nssiId", execution.getVariable("TNMH_NSSI"))
+ }
+ }
+ String nsiInfo = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "nsiInfo")
+ allocateTnNssi.addProperty("nsiInfo", nsiInfo)
+ allocateTnNssi.addProperty("scriptName", "TN1")
+ serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
+ serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
+ serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
+ response.addProperty("esrInfo", esrInfoString)
+ response.add("serviceInfo", serviceInfo)
+ response.add("allocateTnNssi", allocateTnNssi)
+ return response.toString()
+ }
+
+ public String buildDeallocateNssiRequest(DelegateExecution execution,String domainType) {
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ JsonObject deAllocateNssi = new JsonObject()
+ deAllocateNssi.addProperty("snssaiList", execution.getVariable("snssaiList"))
+ deAllocateNssi.addProperty("nsiId", execution.getVariable("nsiId"))
+ deAllocateNssi.addProperty("modifyAction", true)
+ deAllocateNssi.addProperty("terminateNssiOption", 0)
+ deAllocateNssi.addProperty("scriptName", "TN1")
+
+ if(domainType.equals("TN_FH")) {
+ deAllocateNssi.addProperty("nssiId", execution.getVariable("TNFH_NSSI"))
+ deAllocateNssi.addProperty("sliceProfileId", execution.getVariable("TNFH_sliceProfileInstanceId"))
+ }else if(domainType.equals("TN_MH")) {
+ deAllocateNssi.addProperty("nssiId", execution.getVariable("TNMH_NSSI"))
+ deAllocateNssi.addProperty("sliceProfileId", execution.getVariable("TNMH_sliceProfileInstanceId"))
+ }
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setVendor("ONAP")
+ esrInfo.setNetworkType("TN")
+
+ JsonObject serviceInfo = new JsonObject()
+ serviceInfo.addProperty("serviceInvariantUuid", null)
+ serviceInfo.addProperty("serviceUuid", null)
+ serviceInfo.addProperty("globalSubscriberId", globalSubscriberId)
+ serviceInfo.addProperty("subscriptionServiceType", subscriptionServiceType)
+
+ JsonObject json = new JsonObject()
+ json.add("deAllocateNssi", deAllocateNssi)
+ json.addProperty("esrInfo", objectMapper.writeValueAsString(esrInfo))
+ json.add("serviceInfo", serviceInfo)
+ return json.toString()
+
+ }
+} \ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateAccessNSSI.groovy
new file mode 100644
index 0000000000..4d86fb4cd9
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateAccessNSSI.groovy
@@ -0,0 +1,589 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Wipro Limited. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+import javax.ws.rs.NotFoundException
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.Relationship
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.beans.nsmf.ActDeActNssi
+import org.onap.so.beans.nsmf.EsrInfo
+import org.onap.so.beans.nsmf.ServiceInfo
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonObject
+
+/**
+ * Internal AN NSSMF to handle NSSI Activation/Deactivation
+ *
+ */
+class DoActivateAccessNSSI extends AbstractServiceTaskProcessor {
+
+ String Prefix="DoActivateAccessNSSI"
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ ObjectMapper objectMapper = new ObjectMapper()
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ private static final Logger logger = LoggerFactory.getLogger(DoActivateAccessNSSI.class)
+ private static final String ROLE_SLICE_PROFILE = "slice-profile-instance"
+ private static final String ROLE_NSSI = "nssi"
+
+ private static final String KEY_SLICE_PROFILE = "SliceProfile"
+ private static final String KEY_NSSI = "NSSI"
+
+ private static final String AN_NF = "AN-NF"
+ private static final String TN_FH = "TN-FH"
+ private static final String TN_MH = "TN-MH"
+
+ private static final String ACTIVATE = "activateInstance"
+ private static final String DEACTIVATE = "deactivateInstance"
+
+ private static final String VENDOR_ONAP = "ONAP"
+
+ Map<String,String> orchStatusMap = new HashMap<>()
+
+ @Override
+ public void preProcessRequest(DelegateExecution execution) {
+ logger.debug("${Prefix} - Start preProcessRequest")
+
+ String sliceParams = execution.getVariable("sliceParams")
+ String sNssaiList = jsonUtil.getJsonValue(sliceParams, "snssaiList")
+ String anSliceProfileId = jsonUtil.getJsonValue(sliceParams, "sliceProfileId")
+ String nsiId = execution.getVariable("nsiId")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String anNssiId = execution.getVariable("serviceInstanceID")
+ String operationType = execution.getVariable("operationType")
+
+ if(isBlank(sNssaiList) || isBlank(anSliceProfileId) || isBlank(nsiId)) {
+ String msg = "Input fields cannot be null : Mandatory attributes : [snssaiList, sliceProfileId, nsiId]"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ if( isBlank(anNssiId) || isBlank(globalSubscriberId) || isBlank(subscriptionServiceType) || isBlank(operationType)) {
+ String msg = "Missing Input fields from main process : [serviceInstanceID, globalSubscriberId, subscriptionServiceType, operationType]"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ execution.setVariable("sNssaiList", sNssaiList)
+ execution.setVariable("anSliceProfileId", anSliceProfileId)
+ execution.setVariable("nsiId", nsiId)
+ execution.setVariable("anNssiId", anNssiId)
+
+ orchStatusMap.put(ACTIVATE, "activated")
+ orchStatusMap.put(DEACTIVATE, "deactivated")
+
+ logger.debug("${Prefix} - Preprocessing completed with sliceProfileId : ${anSliceProfileId} , nsiId : ${nsiId} , nssiId : ${anNssiId}")
+
+ }
+
+ /**
+ * Method to fetch AN NSSI Constituents and Slice Profile constituents
+ * @param execution
+ */
+ void getRelatedInstances(DelegateExecution execution) {
+ logger.debug("${Prefix} - Get Related Instances")
+ String anSliceProfileId = execution.getVariable("anSliceProfileId")
+ String anNssiId = execution.getVariable("anNssiId")
+
+ Map<String,ServiceInstance> relatedSPs = new HashMap<>()
+ execution.setVariable("relatedSPs", getRelatedInstancesByRole(execution, ROLE_SLICE_PROFILE,KEY_SLICE_PROFILE, anSliceProfileId))
+
+ Map<String,ServiceInstance> relatedNssis = new HashMap<>()
+ execution.setVariable("relatedNssis", getRelatedInstancesByRole(execution, ROLE_NSSI,KEY_NSSI, anNssiId))
+ logger.trace("${Prefix} - Exit Get Related instances")
+ }
+
+ /**
+ * Method to check Slice profile orchestration status
+ * @param execution
+ */
+ void getSPOrchStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} - Start getSPOrchStatus")
+ ServiceInstance sliceProfileInstance = execution.getVariable(KEY_SLICE_PROFILE)
+ String orchStatus = sliceProfileInstance.getOrchestrationStatus()
+ String operationType = execution.getVariable("operationType")
+ if(orchStatusMap.get(operationType).equalsIgnoreCase(orchStatus)) {
+ execution.setVariable("shouldChangeSPStatus", true)
+ }else {
+ execution.setVariable("shouldChangeSPStatus", false)
+ }
+ logger.debug("${Prefix} - SPOrchStatus : ${orchStatus}")
+ }
+
+ /**
+ * Method to check AN NF's Slice profile instance orchestration status
+ * @param execution
+ */
+ void getAnNfSPOrchStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} - getAnNfSPOrchStatus ")
+ ServiceInstance sliceProfileInstance = getInstanceByWorkloadContext(execution.getVariable("relatedSPs"), AN_NF)
+ String anNfNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), AN_NF)
+ execution.setVariable("anNfNssiId", anNfNssiId)
+ String anNfSPId = sliceProfileInstance.getServiceInstanceId()
+ execution.setVariable("anNfSPId", anNfSPId)
+
+ String orchStatus = sliceProfileInstance.getOrchestrationStatus()
+ String operationType = execution.getVariable("operationType")
+ if(orchStatusMap.get(operationType).equalsIgnoreCase(orchStatus)) {
+ execution.setVariable("shouldChangeAN_NF_SPStatus", true)
+ }else {
+ execution.setVariable("shouldChangeAN_NF_SPStatus", false)
+ }
+ logger.debug("${Prefix} - getAnNfSPOrchStatus AN_NF SP ID:${anNfSPId} : ${orchStatus}")
+ }
+
+ void prepareSdnrActivationRequest(DelegateExecution execution) {
+ logger.debug("${Prefix} - start prepareSdnrActivationRequest")
+ String operationType = execution.getVariable("operationType")
+ String action = operationType.equalsIgnoreCase(ACTIVATE) ? "activate":"deactivate"
+
+ String anNfNssiId = execution.getVariable("anNfNssiId")
+ String sNssai = execution.getVariable("sNssaiList")
+ String reqId = execution.getVariable("msoRequestId")
+ String messageType = "SDNRActivateResponse"
+ StringBuilder callbackURL = new StringBuilder(UrnPropertiesReader.getVariable("mso.workflow.message.endpoint", execution))
+ callbackURL.append("/").append(messageType).append("/").append(reqId)
+
+ JsonObject input = new JsonObject()
+ input.addProperty("RANNFNSSIId", anNfNssiId)
+ input.addProperty("callbackURL", callbackURL.toString())
+ input.addProperty("s-NSSAI", sNssai)
+
+ JsonObject Payload = new JsonObject()
+ Payload.addProperty("version", "1.0")
+ Payload.addProperty("rpc-name", "activateRANSlice")
+ Payload.addProperty("correlation-id", reqId)
+ Payload.addProperty("type", "request")
+
+ JsonObject wrapinput = new JsonObject()
+ wrapinput.addProperty("Action", action)
+
+ JsonObject CommonHeader = new JsonObject()
+ CommonHeader.addProperty("TimeStamp", new Date(System.currentTimeMillis()).format("yyyy-MM-ddTHH:mm:ss.sss", TimeZone.getDefault()))
+ CommonHeader.addProperty("APIver", "1.0")
+ CommonHeader.addProperty("RequestID", reqId)
+ CommonHeader.addProperty("SubRequestID", "1")
+
+ JsonObject body = new JsonObject()
+ body.add("input", wrapinput)
+
+ JsonObject sdnrRequest = new JsonObject()
+ Payload.add("input", input)
+ wrapinput.add("Payload", Payload)
+ wrapinput.add("CommonHeader", CommonHeader)
+ body.add("input", wrapinput)
+ sdnrRequest.add("body", body)
+
+ String json = sdnrRequest.toString()
+ execution.setVariable("sdnrRequest", sdnrRequest)
+ execution.setVariable("SDNR_messageType", messageType)
+ execution.setVariable("SDNR_timeout", "PT10M")
+
+ logger.debug("${Prefix} - prepareSdnrActivationRequest : SDNR Request : ${json}")
+ }
+
+ void processSdnrResponse(DelegateExecution execution) {
+ logger.debug("${Prefix} processing SdnrResponse")
+ Map<String, Object> resMap = objectMapper.readValue(execution.getVariable("SDNR_Response"),Map.class)
+ String status = resMap.get("status")
+ String reason = resMap.get("reason")
+ if("success".equalsIgnoreCase(status)) {
+ execution.setVariable("isANactivationSuccess", true)
+ }else {
+ execution.setVariable("isANactivationSuccess", false)
+ logger.debug("AN NF Activation/Deactivation failed with reason ${reason}")
+ }
+ logger.debug("${Prefix} processed SdnrResponse")
+ }
+
+ /**
+ * Update AN NF - NSSI and SP Instance status
+ * @param execution
+ */
+ void updateAnNfStatus(DelegateExecution execution) {
+ logger.debug("${Prefix}Start updateAnNfStatus")
+ String anNfNssiId = execution.getVariable("anNfNssiId")
+ String anNfSPId = execution.getVariable("anNfSPId")
+
+ updateOrchStatus(execution, anNfSPId)
+ updateOrchStatus(execution, anNfNssiId)
+ logger.debug("${Prefix}Exit updateAnNfStatus")
+ }
+
+ /**
+ * Method to check AN NF's Slice profile instance orchestration status
+ * @param execution
+ */
+ void getTnFhSPOrchStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} start getTnFhSPOrchStatus ")
+ ServiceInstance sliceProfileInstance = getInstanceByWorkloadContext(execution.getVariable("relatedSPs"), TN_FH)
+ String tnFhNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), TN_FH)
+ execution.setVariable("tnFhNssiId", tnFhNssiId)
+ String tnFhSPId = sliceProfileInstance.getServiceInstanceId()
+ execution.setVariable("tnFhSPId", tnFhSPId)
+
+ String orchStatus = sliceProfileInstance.getOrchestrationStatus()
+ String operationType = execution.getVariable("operationType")
+ if(orchStatusMap.get(operationType).equalsIgnoreCase(orchStatus)) {
+ execution.setVariable("shouldChangeTN_FH_SPStatus", true)
+ }else {
+ execution.setVariable("shouldChangeTN_FH_SPStatus", false)
+ }
+
+ logger.debug("${Prefix} Exit getTnFhSPOrchStatus TN_FH SP ID:${tnFhSPId} : ${orchStatus}")
+ }
+
+ void doTnFhNssiActivation(DelegateExecution execution){
+ logger.debug("Start doTnFhNssiActivation in ${Prefix}")
+ String nssmfRequest = buildTNActivateNssiRequest(execution, TN_FH)
+ String operationType = execution.getVariable("operationType")
+ String urlOpType = operationType.equalsIgnoreCase(ACTIVATE) ? "activation":"deactivation"
+
+ List<String> sNssaiList = execution.getVariable("sNssaiList")
+ String snssai = sNssaiList != null ? sNssaiList.get(0) : ""
+
+ String urlString = "/api/rest/provMns/v1/NSS/" + snssai + urlOpType
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_FH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit doTnFhNssiActivation in ${Prefix}")
+ }
+
+ void getTnMhSPOrchStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} Start getTnMhSPOrchStatus ")
+ ServiceInstance sliceProfileInstance = getInstanceByWorkloadContext(execution.getVariable("relatedSPs"), TN_MH)
+ String tnFhNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), TN_MH)
+ execution.setVariable("tnMhNssiId", tnFhNssiId)
+ String tnFhSPId = sliceProfileInstance.getServiceInstanceId()
+ execution.setVariable("tnMhSPId", tnFhSPId)
+
+ String orchStatus = sliceProfileInstance.getOrchestrationStatus()
+ String operationType = execution.getVariable("operationType")
+ if(orchStatusMap.get(operationType).equalsIgnoreCase(orchStatus)) {
+ execution.setVariable("shouldChangeTN_MH_SPStatus", true)
+ }else {
+ execution.setVariable("shouldChangeTN_MH_SPStatus", false)
+ }
+ logger.debug("${Prefix} Exit getTnMhSPOrchStatus TN_MH SP ID:${tnFhSPId} : ${orchStatus}")
+ }
+
+ void doTnMhNssiActivation(DelegateExecution execution){
+ logger.debug("Start doTnMhNssiActivation in ${Prefix}")
+ String nssmfRequest = buildTNActivateNssiRequest(execution, TN_MH)
+ String operationType = execution.getVariable("operationType")
+ String urlOpType = operationType.equalsIgnoreCase(ACTIVATE) ? "activation":"deactivation"
+
+ List<String> sNssaiList = execution.getVariable("sNssaiList")
+ String snssai = sNssaiList != null ? sNssaiList.get(0) : ""
+
+ String urlString = "/api/rest/provMns/v1/NSS/" + snssai + urlOpType
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_MH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit doTnMhNssiActivation in ${Prefix}")
+
+ }
+
+ /**
+ * Update TN FH - NSSI and SP Instance status
+ * @param execution
+ */
+ void updateTNFHStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} Start updateTNFHStatus")
+
+ String tnFhNssiId = execution.getVariable("tnFhNssiId")
+ String tnFhSPId = execution.getVariable("tnFhSPId")
+ updateOrchStatus(execution, tnFhSPId)
+ updateOrchStatus(execution, tnFhNssiId)
+
+ logger.debug("${Prefix} Exit updateTNFHStatus")
+
+ }
+
+ /**
+ * Update TN MH - NSSI and SP Instance status
+ * @param execution
+ */
+ void updateTNMHStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} Start updateTNMHStatus")
+
+ String tnMhNssiId = execution.getVariable("tnMhNssiId")
+ String tnMhSPId = execution.getVariable("tnMhSPId")
+ updateOrchStatus(execution, tnMhSPId)
+ updateOrchStatus(execution, tnMhNssiId)
+
+ logger.debug("${Prefix} Exit updateTNMHStatus")
+ }
+
+ /**
+ * Update AN - NSSI and SP Instance status
+ * @param execution
+ */
+ void updateANStatus(DelegateExecution execution) {
+ logger.debug("${Prefix} Start updateANStatus")
+ String anNssiId = execution.getVariable("anNssiId")
+ String anSliceProfileId = execution.getVariable("anSliceProfileId")
+ updateOrchStatus(execution, anNssiId)
+ updateOrchStatus(execution, anSliceProfileId)
+ logger.debug("${Prefix} Start updateANStatus")
+ }
+
+ void prepareQueryJobStatus(DelegateExecution execution,String jobId,String networkType,String instanceId) {
+ logger.debug("${Prefix} Start prepareQueryJobStatus : ${jobId}")
+ String responseId = "1"
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType(networkType)
+ esrInfo.setVendor(VENDOR_ONAP)
+
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.setNssiId(instanceId)
+ serviceInfo.setNsiId(execution.getVariable("nsiId"))
+ serviceInfo.setGlobalSubscriberId(globalSubscriberId)
+ serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
+
+ execution.setVariable("${networkType}_esrInfo", esrInfo)
+ execution.setVariable("${networkType}_responseId", responseId)
+ execution.setVariable("${networkType}_serviceInfo", serviceInfo)
+
+ }
+
+ void validateJobStatus(DelegateExecution execution,String responseDescriptor) {
+ logger.debug("validateJobStatus ${responseDescriptor}")
+ String status = jsonUtil.getJsonValue(responseDescriptor, "responseDescriptor.status")
+ String statusDescription = jsonUtil.getJsonValue(responseDescriptor, "responseDescriptor.statusDescription")
+ if("finished".equalsIgnoreCase(status)) {
+ execution.setVariable("isSuccess", true)
+ }else {
+ execution.setVariable("isSuccess", false)
+ }
+ }
+
+
+ private void updateOrchStatus(DelegateExecution execution,String serviceId) {
+ logger.debug("${Prefix} Start updateOrchStatus : ${serviceId}")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String operationType = execution.getVariable("operationType")
+
+ try {
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, serviceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai")
+ }
+ AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+ if (si.isPresent()) {
+ String orchStatus = si.get().getOrchestrationStatus()
+ logger.debug("Orchestration status of instance ${serviceId} is ${orchStatus}")
+ if (ACTIVATE.equalsIgnoreCase(operationType) && "deactivated".equalsIgnoreCase(orchStatus)) {
+ si.get().setOrchestrationStatus("activated")
+ client.update(uri, si.get())
+ } else if(DEACTIVATE.equalsIgnoreCase(operationType) && "activated".equalsIgnoreCase(orchStatus)){
+ si.get().setOrchestrationStatus("deactivated")
+ client.update(uri, si.get())
+ }
+ }
+ } catch (Exception e) {
+ logger.info("Service is already in active state")
+ String msg = "Service is already in active state, " + e.getMessage()
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug("${Prefix} Exit updateOrchStatus : ${serviceId}")
+ }
+
+ void prepareUpdateJobStatus(DelegateExecution execution,String status,String progress,String statusDescription) {
+ logger.debug("${Prefix} Start prepareUpdateJobStatus : ${statusDescription}")
+ String serviceId = execution.getVariable("anNssiId")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String operationType = execution.getVariable("operationType")
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType(operationType)
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+
+
+
+ /**
+ * Fetches a collection of service instances with the specific role and maps it based on workload context
+ * (AN-NF,TN-FH,TN-MH)
+ * @param execution
+ * @param role - nssi/slice profile instance
+ * @param key - NSSI/Sliceprofile corresponding to instanceId
+ * @param instanceId - id to which the related list to be found
+ * @return
+ */
+ private Map<String,ServiceInstance> getRelatedInstancesByRole(DelegateExecution execution,String role,String key, String instanceId) {
+ logger.debug("${Prefix} - Fetching related ${role} from AAI")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ if( isBlank(role) || isBlank(instanceId)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Role and instanceId are mandatory")
+ }
+
+ Map<String,ServiceInstance> relatedInstances = new HashMap<>()
+
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, instanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai : ${instanceId}")
+ }
+ AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+ if(si.isPresent()) {
+ execution.setVariable(key, si.get())
+ List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
+ for (Relationship relationship : relationshipList) {
+ String relatedTo = relationship.getRelatedTo()
+ if (relatedTo.toLowerCase() == "service-instance") {
+ String relatioshipurl = relationship.getRelatedLink()
+ String serviceInstanceId =
+ relatioshipurl.substring(relatioshipurl.lastIndexOf("/") + 1, relatioshipurl.length())
+ uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, serviceInstanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500,
+ "Service Instance was not found in aai: ${serviceInstanceId} related to ${instanceId}")
+ }
+ AAIResultWrapper wrapper01 = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> serviceInstance = wrapper01.asBean(ServiceInstance.class)
+ if (serviceInstance.isPresent()) {
+ ServiceInstance instance = serviceInstance.get()
+ if (role.equalsIgnoreCase(instance.getServiceRole())) {
+ relatedInstances.put(instance.getWorkloadContext(),instance)
+ }
+ }
+ }
+ }
+ }
+ logger.debug("Found ${relatedInstances.size()} ${role} related to ${instanceId} ")
+ return relatedInstances
+ }
+
+ private ServiceInstance getInstanceByWorkloadContext(Map<String,ServiceInstance> instances,String workloadContext ) {
+ ServiceInstance instance = instances.get(workloadContext)
+ if(instance == null) {
+ throw new BpmnError( 2500, "${workloadContext} Instance ID is not found.")
+ }
+ return instance
+ }
+
+ private String getInstanceIdByWorkloadContext(Map<String,ServiceInstance> instances,String workloadContext ) {
+ String instanceId = instances.get(workloadContext).getServiceInstanceId()
+ if(instanceId == null) {
+ throw new BpmnError( 2500, "${workloadContext} instance ID is not found.")
+ }
+ return instanceId
+ }
+
+
+ /**
+ * Method to handle deallocation of RAN NSSI constituents(TN_FH/TN_MH)
+ * @param execution
+ * @param serviceFunction - TN_FH/TN_MH
+ * @return
+ */
+ private String buildTNActivateNssiRequest(DelegateExecution execution,String serviceFunction) {
+ logger.debug("${Prefix} Exit buildTNActivateNssiRequest : ${serviceFunction}")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ Map<String, ServiceInstance> relatedNssis = execution.getVariable("relatedNssis")
+
+ String anNssiId = execution.getVariable("anNssiId")
+ List<String> sNssaiList = execution.getVariable("sNssaiList")
+
+ ServiceInstance tnNssi = relatedNssis.get(serviceFunction)
+ String nssiId = tnNssi.getServiceInstanceId()
+
+ Map<String, ServiceInstance> relatedSPs = execution.getVariable("relatedSPs")
+
+ ActDeActNssi actDeactNssi = new ActDeActNssi()
+ actDeactNssi.setNssiId(nssiId)
+ actDeactNssi.setNsiId(anNssiId)
+ actDeactNssi.setSliceProfileId(relatedSPs.get(serviceFunction).getServiceInstanceId())
+ actDeactNssi.setSnssaiList(sNssaiList)
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setVendor(VENDOR_ONAP)
+ esrInfo.setNetworkType("TN")
+
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.setServiceInvariantUuid(tnNssi.getModelInvariantId())
+ serviceInfo.setServiceUuid(tnNssi.getModelVersionId())
+ serviceInfo.setGlobalSubscriberId(globalSubscriberId)
+ serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
+
+ JsonObject json = new JsonObject()
+ json.addProperty("actDeActNssi", objectMapper.writeValueAsString(actDeactNssi))
+ json.addProperty("esrInfo", objectMapper.writeValueAsString(esrInfo))
+ json.addProperty("serviceInfo", objectMapper.writeValueAsString(serviceInfo))
+ return json.toString()
+
+ }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssi.groovy
new file mode 100644
index 0000000000..04fe161295
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssi.groovy
@@ -0,0 +1,162 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import groovy.json.JsonSlurper
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+public class DoActivateTnNssi extends AbstractServiceTaskProcessor {
+ String Prefix = "TNACT_"
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
+ JsonSlurper jsonSlurper = new JsonSlurper()
+ ObjectMapper objectMapper = new ObjectMapper()
+ private static final Logger logger = LoggerFactory.getLogger(DoActivateTnNssi.class)
+
+
+ public void preProcessRequest(DelegateExecution execution) {
+ logger.debug("Start preProcessRequest")
+
+ execution.setVariable("startTime", System.currentTimeMillis())
+ String msg = tnNssmfUtils.getExecutionInputParams(execution)
+ logger.debug("Activate TN NSSI input parameters: " + msg)
+
+ execution.setVariable("prefix", Prefix)
+
+ tnNssmfUtils.setSdncCallbackUrl(execution, true)
+ logger.debug("SDNC Callback URL: " + execution.getVariable("sdncCallbackUrl"))
+
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ //here modelVersion is not set, we use modelUuid to decompose the service.
+ def isDebugLogEnabled = true
+ execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+
+ String sliceServiceInstanceId = execution.getVariable("serviceInstanceID")
+ execution.setVariable("sliceServiceInstanceId", sliceServiceInstanceId)
+
+ String sliceServiceInstanceName = execution.getVariable("servicename")
+ execution.setVariable("sliceServiceInstanceName", sliceServiceInstanceName)
+
+ String operationType = execution.getVariable("operationType")
+ String actionType = operationType.equals("activateInstance") ? "activate" : "deactivate"
+ execution.setVariable("actionType", actionType)
+
+
+ logger.debug("Finish preProcessRequest")
+ }
+
+ void preprocessSdncActOrDeactTnNssiRequest(DelegateExecution execution) {
+ def method = getClass().getSimpleName() + '.preprocessSdncActivateTnNssiRequest(' +
+ 'execution=' + execution.getId() + ')'
+ def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
+ logger.trace('Entered ' + method)
+
+ try {
+ String serviceInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String actionType = execution.getVariable("actionType")
+
+ String sdncRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, actionType)
+
+ execution.setVariable("TNNSSMF_SDNCRequest", sdncRequest)
+ logger.debug("Outgoing SDNCRequest is: \n" + sdncRequest)
+
+ } catch (Exception e) {
+ logger.debug("Exception Occured Processing preprocessSdncDeallocateTnNssiRequest. Exception is:\n" + e)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessSDNCActivateRequest Method:\n" + e.getMessage())
+ }
+ logger.trace("COMPLETED preprocessSdncActivateTnNssiRequest Process")
+ }
+
+
+ void validateSDNCResponse(DelegateExecution execution, String response) {
+ tnNssmfUtils.validateSDNCResponse(execution, response, method)
+ }
+
+
+ void updateAAIOrchStatus(DelegateExecution execution) {
+ logger.debug("Start updateAAIOrchStatus")
+ String tnNssiId = execution.getVariable("tnNssiId")
+ String orchStatus = execution.getVariable("orchestrationStatus")
+
+ try {
+ ServiceInstance si = new ServiceInstance()
+ si.setOrchestrationStatus(orchStatus)
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, tnNssiId)
+ client.update(uri, si)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ logger.debug("Finish updateAAIOrchStatus")
+ }
+
+ void prepareUpdateJobStatus(DelegateExecution execution,
+ String status,
+ String progress,
+ String statusDescription) {
+ String serviceId = execution.getVariable("serviceInstanceID")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String operType = execution.getVariable("actionType")
+
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType(operType)
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+
+}
+
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy
new file mode 100644
index 0000000000..3df0d3d6f0
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateAccessNSSI.groovy
@@ -0,0 +1,1041 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, Wipro Limited.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.OofUtils
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.sql.Timestamp
+import java.util.List
+import static org.apache.commons.lang3.StringUtils.isBlank
+import com.google.gson.JsonObject
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonArray
+import org.onap.aai.domain.yang.Relationship
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.so.beans.nsmf.AllocateTnNssi
+import org.onap.so.beans.nsmf.EsrInfo
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.domain.ServiceDecomposition
+import org.onap.so.bpmn.core.domain.ServiceInstance
+import org.onap.so.bpmn.core.domain.ServiceProxy
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.aaiclient.client.aai.AAINamespaceConstants
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aai.domain.yang.NetworkPolicy
+import org.onap.aai.domain.yang.NetworkRoute
+
+class DoAllocateAccessNSSI extends AbstractServiceTaskProcessor {
+
+ String Prefix="AASS_"
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ OofUtils oofUtils = new OofUtils()
+ AnNssmfUtils anNssmfUtils = new AnNssmfUtils()
+ ObjectMapper objectMapper = new ObjectMapper();
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ private static final Logger logger = LoggerFactory.getLogger(DoAllocateAccessNSSI.class)
+
+ @Override
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug(Prefix + "preProcessRequest Start")
+ execution.setVariable("prefix", Prefix)
+ execution.setVariable("startTime", System.currentTimeMillis())
+ def msg
+ try {
+
+ logger.debug("input variables : msoRequestId - "+execution.getVariable("msoRequestId")
+ +" modelInvariantUuid - "+execution.getVariable("modelInvariantUuid")+
+ " modelUuid - "+execution.getVariable("modelUuid")+
+ " globalSubscriberId - "+execution.getVariable("globalSubscriberId")+
+ " dummyServiceId - "+ execution.getVariable("dummyServiceId")+
+ " nsiId - "+execution.getVariable("nsiId")+
+ " networkType - "+execution.getVariable("networkType")+
+ " subscriptionServiceType - "+execution.getVariable("subscriptionServiceType")+
+ " jobId - "+execution.getVariable("jobId")+
+ " sliceParams - "+execution.getVariable("sliceParams")+
+ " servicename - "+ execution.getVariable("servicename"))
+
+ //validate slice subnet inputs
+
+ String sliceParams = execution.getVariable("sliceParams")
+ String sliceProfile = jsonUtil.getJsonValue(sliceParams, "sliceProfile")
+ if (isBlank(sliceProfile)) {
+ msg = "Input sliceProfile is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfile", sliceProfile)
+ }
+ String sliceProfileId = jsonUtil.getJsonValue(sliceProfile, "sliceProfileId")
+ def snssaiList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "snssaiList"))
+ def plmnIdList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "plmnIdList"))
+ def coverageAreaTAList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "coverageAreaTAList"))
+
+ if (isBlank(sliceProfileId) || (snssaiList.empty) || (plmnIdList.empty)
+ || (coverageAreaTAList.empty)) {
+
+ msg = "Mandatory slice profile fields are empty"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfileId", sliceProfileId)
+ execution.setVariable("snssaiList", snssaiList)
+ execution.setVariable("plmnIdList", plmnIdList)
+ execution.setVariable("coverageAreaTAList", coverageAreaTAList)
+ }
+ String nsiName = jsonUtil.getJsonValue(sliceParams, "nsiInfo.nsiName")
+ String scriptName = jsonUtil.getJsonValue(sliceParams, "scriptName")
+ execution.setVariable("nsiName", nsiName)
+ execution.setVariable("scriptName", scriptName)
+ //generate RAN,RAN NF NSSIs - will be re assigned if oof returns existing NSSI
+ String RANServiceInstanceId = UUID.randomUUID().toString()
+ String RANNFServiceInstanceId = UUID.randomUUID().toString()
+ logger.debug("RAN serviceInstance Id "+RANServiceInstanceId)
+ logger.debug("RAN NF serviceInstance Id "+RANNFServiceInstanceId)
+ execution.setVariable("RANServiceInstanceId", RANServiceInstanceId)
+ execution.setVariable("RANNFServiceInstanceId", RANNFServiceInstanceId)
+ execution.setVariable("ranNssiPreferReuse", true)
+ execution.setVariable("ranNfNssiPreferReuse", true)
+ execution.setVariable("job_timeout", 10)
+
+ //set BH end point
+ List<String> BH_endPoints = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "endPoints"))
+ logger.debug("BH end points list : "+BH_endPoints)
+ if(BH_endPoints.empty) {
+ msg = "End point info is empty"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }else {
+ execution.setVariable("bh_endpoint", BH_endPoints.get(0))
+ }
+
+ } catch(BpmnError e) {
+ throw e
+ } catch(Exception ex) {
+ msg = "Exception in DoAllocateAccessNSSI.preProcessRequest " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug(Prefix + "preProcessRequest Exit")
+ }
+
+ /*
+ * Prepare request params for decomposing RAN NSST
+ */
+
+ def prepareDecomposeService = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareDecomposeService method start")
+ String RANServiceInstanceId = execution.getVariable("RANServiceInstanceId")
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+ execution.setVariable("serviceInstanceId", RANServiceInstanceId)
+ logger.debug("serviceModelInfo : "+serviceModelInfo)
+ logger.debug("Finish RAN NSST prepareDecomposeService")
+ }
+
+ /* process the decompose service(RAN NSST) response
+ *
+ */
+ def processDecomposition = { DelegateExecution execution ->
+ logger.debug(Prefix+"processDecomposition method start")
+ ServiceDecomposition ranNsstServiceDecomposition = execution.getVariable("ranNsstServiceDecomposition")
+ logger.debug("ranNsstServiceDecomposition : "+ranNsstServiceDecomposition.toString())
+ //RAN NSST decomposition
+ String ranModelVersion = ranNsstServiceDecomposition.getModelInfo().getModelVersion()
+ String ranModelName = ranNsstServiceDecomposition.getModelInfo().getModelName()
+ List<ServiceProxy> serviceProxyList = ranNsstServiceDecomposition.getServiceProxy()
+ List<String> nsstInfoList = new ArrayList<>()
+ for(ServiceProxy serviceProxy : serviceProxyList)
+ {
+ String nsstModelUuid = serviceProxy.getModelInfo().getModelUuid()
+ String nsstModelInvariantUuid = serviceProxy.getModelInfo().getModelInvariantUuid()
+ String name = serviceProxy.getModelInfo().getModelName()
+ String nsstServiceModelInfo = """{
+ "UUID":"${nsstModelUuid}",
+ "invariantUUID":"${nsstModelInvariantUuid}",
+ "name":"${name}"
+ }"""
+ nsstInfoList.add(nsstServiceModelInfo)
+ }
+ int currentIndex=0
+ int maxIndex=nsstInfoList.size()
+ if(maxIndex < 1)
+ {
+ String msg = "Exception in RAN NSST processDecomposition. There is no NSST associated with RAN NSST "
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ execution.setVariable("ranNsstInfoList",nsstInfoList)
+ execution.setVariable("ranModelVersion", ranModelVersion)
+ execution.setVariable("ranModelName", ranModelName)
+ execution.setVariable("currentIndex",currentIndex)
+ execution.setVariable("maxIndex",maxIndex)
+ logger.debug(Prefix+"processDecomposition maxIndex value - "+maxIndex)
+ }
+
+ /*
+ * Function to subnet capabilities from nssmf adapter
+ */
+ def getSubnetCapabilities = { DelegateExecution execution ->
+ logger.debug(Prefix+"getSubnetCapabilities method start")
+
+ String tnNssmfRequest = anNssmfUtils.buildCreateTNNSSMFSubnetCapabilityRequest()
+
+ String urlString = "/api/rest/provMns/v1/NSS/subnetCapabilityQuery"
+
+ String tnNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, tnNssmfRequest)
+
+ if (tnNssmfResponse != null) {
+ String FHCapabilities= jsonUtil.getJsonValue(tnNssmfResponse, "TN_FH")
+ String MHCapabilities = jsonUtil.getJsonValue(tnNssmfResponse, "TN_MH")
+ execution.setVariable("FHCapabilities",FHCapabilities)
+ execution.setVariable("MHCapabilities",MHCapabilities)
+
+ } else {
+ logger.error("received error message from NSSMF : "+ tnNssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ String anNssmfRequest = anNssmfUtils.buildCreateANNFNSSMFSubnetCapabilityRequest()
+
+ String anNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, anNssmfRequest)
+
+ if (anNssmfResponse != null) {
+ String ANNFCapabilities = jsonUtil.getJsonValue(anNssmfResponse, "AN_NF")
+ execution.setVariable("ANNFCapabilities",ANNFCapabilities)
+
+ } else {
+ logger.error("received error message from NSSMF : "+ anNssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ }
+
+ /*
+ * prepare OOF request for RAN NSSI selection
+ */
+ def prepareOofRequestForRanNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareOofRequestForRanNSS method start")
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSSI option OOF Url: " + urlString)
+
+ //build oof request body
+ boolean ranNssiPreferReuse = execution.getVariable("ranNssiPreferReuse");
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+ Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class)
+ String modelUuid = execution.getVariable("modelUuid")
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelName = execution.getVariable("ranModelName")
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ List<String> nsstInfoList = objectMapper.readValue(execution.getVariable("nsstInfoList"), List.class)
+ JsonArray capabilitiesList = new JsonArray()
+ String FHCapabilities = execution.getVariable("FHCapabilities")
+ String MHCapabilities = execution.getVariable("MHCapabilities")
+ String ANNFCapabilities = execution.getVariable("ANNFCapabilities")
+ JsonObject FH = new JsonObject()
+ JsonObject MH = new JsonObject()
+ JsonObject ANNF = new JsonObject()
+ FH.addProperty("domainType", "TN_FH")
+ FH.addProperty("capabilityDetails", FHCapabilities)
+ MH.addProperty("domainType", "TN_MH")
+ MH.addProperty("capabilityDetails", MHCapabilities)
+ ANNF.addProperty("domainType", "AN_NF")
+ ANNF.addProperty("capabilityDetails", FHCapabilities)
+ capabilitiesList.add(FH)
+ capabilitiesList.add(MH)
+ capabilitiesList.add(ANNF)
+
+ execution.setVariable("nssiSelection_Url", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nssiSelection_messageType",messageType)
+ execution.setVariable("nssiSelection_correlator",requestId)
+ execution.setVariable("nssiSelection_timeout",timeout)
+
+ String oofRequest = anNssmfUtils.buildSelectRANNSSIRequest(requestId, messageType, modelUuid,modelInvariantUuid,
+ modelName, profileInfo, nsstInfoList, capabilitiesList, ranNssiPreferReuse)
+
+ execution.setVariable("nssiSelection_oofRequest",oofRequest)
+ logger.debug("Sending request to OOF: " + oofRequest)
+ }
+ /*
+ * process OOF response for RAN NSSI selection
+ */
+ def processOofResponseForRanNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"processOofResponseForRanNSS method start")
+ String oofResponse = execution.getVariable("nssiSelection_asyncCallbackResponse")
+ String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
+ if(requestStatus.equals("completed")) {
+ List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))
+ boolean existingNSI = jsonUtil.getJsonValue(solution.get(0), "existingNSI")
+ if(existingNSI) {
+ def sharedNSISolution = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution")
+ execution.setVariable("sharedRanNSSISolution", sharedNSISolution)
+ logger.debug("sharedRanNSSISolution from OOF "+sharedNSISolution)
+ String RANServiceInstanceId = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution.NSIId")
+ execution.setVariable("RANServiceInstanceId", RANServiceInstanceId)
+ ServiceInstance serviceInstance = new ServiceInstance();
+ serviceInstance.setInstanceId(RANServiceInstanceId);
+ ServiceDecomposition serviceDecomposition = execution.getVariable("ranNsstServiceDecomposition")
+ serviceDecomposition.setServiceInstance(serviceInstance);
+ execution.setVariable("ranNsstServiceDecomposition", serviceDecomposition)
+ execution.setVariable("isRspRanNssi", true)
+ }else {
+ def sliceProfiles = jsonUtil.getJsonValue(solution.get(0), "newNSISolution.sliceProfiles")
+ execution.setVariable("RanConstituentSliceProfiles", sliceProfiles)
+ logger.debug("RanConstituentSliceProfiles list from OOF "+sliceProfiles)
+ }
+ }else {
+ String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
+ logger.error("received failed status from oof "+ statusMessage)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a failed Async Response from OOF : "+statusMessage)
+ }
+
+ }
+
+ def prepareModifyAccessNssiInputs = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareModifyAccessNssiInputs method start")
+ String jobId = UUID.randomUUID().toString()
+ execution.setVariable("modifyRanNssiJobId", jobId)
+ String snssaiList = execution.getVariable("snssaiList")
+ String sliceParams = execution.getVariable("sliceParams")
+ String sliceProfileId = execution.getVariable("sliceProfileId")
+ String nsiInfo = jsonUtil.getJsonValue(sliceParams, "nsiInfo")
+ String scriptName = execution.getVariable("scriptName")
+
+ JsonObject modifySliceParams = new JsonObject()
+ modifySliceParams.addProperty("modifyAction", "allocate")
+ modifySliceParams.addProperty("snssaiList", snssaiList)
+ modifySliceParams.addProperty("sliceProfileId", sliceProfileId)
+ modifySliceParams.addProperty("nsiInfo", nsiInfo)
+ modifySliceParams.addProperty("scriptName", scriptName)
+
+ execution.setVariable("modifySliceParams", modifySliceParams.toString())
+ //create operation status in request db
+ String serviceId = execution.getVariable("RANServiceInstanceId")
+ String nsiId = execution.getVariable("nsiId")
+ logger.debug("Generated new job for Service Instance serviceId:" + serviceId + "jobId:" + jobId)
+
+ ResourceOperationStatus initStatus = new ResourceOperationStatus()
+ initStatus.setServiceId(serviceId)
+ initStatus.setOperationId(jobId)
+ initStatus.setResourceTemplateUUID(nsiId)
+ initStatus.setOperType("Modify")
+ requestDBUtil.prepareInitResourceOperationStatus(execution, initStatus)
+ }
+
+ def createModifyNssiQueryJobStatus = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("AN")
+ esrInfo.setVendor("ONAP")
+ String esrInfoString = objectMapper.writeValueAsString(esrInfo)
+ execution.setVariable("esrInfo", esrInfoString)
+ JsonObject serviceInfo = new JsonObject()
+ serviceInfo.addProperty("nssiId", execution.getVariable("RANServiceInstanceId"))
+ serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
+ serviceInfo.addProperty("nssiName", execution.getVariable("servicename"))
+ String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
+ serviceInfo.addProperty("sST", sST)
+ serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList")))
+ serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
+ serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
+ serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("modelInvariantUuid"))
+ serviceInfo.addProperty("serviceUuid", execution.getVariable("modelUuid"))
+ execution.setVariable("serviceInfo", serviceInfo.toString())
+ execution.setVariable("responseId", "")
+ }
+ def prepareNsstDecomposeService = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareNsstDecomposeService method start")
+ List<String> nsstInfoList = objectMapper.readValue(execution.getVariable("ranNsstInfoList"), List.class)
+ int currentIndex = execution.getVariable("currentIndex")
+ int maxIndex = execution.getVariable("maxIndex")
+ logger.debug(Prefix+"prepareNsstDecomposeService : currentIndex value - "+currentIndex+" maxIndex : "+maxIndex)
+ if(currentIndex<maxIndex) {
+ String nsstInfo = nsstInfoList.get(currentIndex)
+ String modelInvariantUuid = jsonUtil.getJsonValue(nsstInfo, "invariantUUID")
+ String modelUuid = jsonUtil.getJsonValue(nsstInfo, "UUID")
+
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+ execution.setVariable("serviceInstanceId", "")
+ logger.debug("serviceModelInfo : "+serviceModelInfo)
+ currentIndex++
+ execution.setVariable("currentIndex", currentIndex)
+ }else {
+ logger.error("nsstList decomposition error ")
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000, "nsstList decomposition error ")
+ }
+
+ }
+ def processNsstDecomposition = { DelegateExecution execution ->
+ logger.debug(Prefix+"processNsstDecomposition method start")
+ ServiceDecomposition decomposedNsst = execution.getVariable("nsstServiceDecomposition")
+ logger.debug("decomposedNsst : "+decomposedNsst.toString())
+
+ String nsstType = decomposedNsst.getServiceRole() //domainType
+ String modelVersion = decomposedNsst.getModelInfo().getModelVersion()
+ String modelName = decomposedNsst.getModelInfo().getModelName()
+ String modelUuid = decomposedNsst.getModelInfo().getModelUuid()
+ String modelInvariantUuid = decomposedNsst.getModelInfo().getModelInvariantUuid()
+
+ switch(nsstType) {
+ case "AN_NF":
+ execution.setVariable("ANNF_modelInvariantUuid", modelInvariantUuid)
+ execution.setVariable("ANNF_modelUuid", modelUuid)
+ execution.setVariable("ANNF_modelVersion", modelVersion)
+ execution.setVariable("ANNF_modelName", modelName)
+ execution.setVariable("ANNF_ServiceDecomposition", decomposedNsst)
+ break
+ case "TN_FH":
+ execution.setVariable("TNFH_modelInvariantUuid", modelInvariantUuid)
+ execution.setVariable("TNFH_modelUuid", modelUuid)
+ execution.setVariable("TNFH_modelVersion", modelVersion)
+ execution.setVariable("TNFH_modelName", modelName)
+ execution.setVariable("TNFH_ServiceDecomposition", decomposedNsst)
+ break
+ case "TN_MH":
+ execution.setVariable("TNMH_modelInvariantUuid", modelInvariantUuid)
+ execution.setVariable("TNMH_modelUuid", modelUuid)
+ execution.setVariable("TNMH_modelVersion", modelVersion)
+ execution.setVariable("TNMH_modelName", modelName)
+ execution.setVariable("TNMH_ServiceDecomposition", decomposedNsst)
+ break
+ default:
+ logger.debug("No expected match found for current nsstType")
+ logger.error("No expected match found for current nsstType "+ nsstType)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current nsstType "+ nsstType)
+ }
+ boolean isAllNsstsDecomposed = false
+ int currentIndex = execution.getVariable("currentIndex")
+ int maxIndex = execution.getVariable("maxIndex")
+ if(currentIndex == maxIndex) {
+ isAllNsstsDecomposed = true
+ }
+ execution.setVariable("isAllNsstsDecomposed", isAllNsstsDecomposed)
+ }
+ /*
+ * prepare OOF request for NF RAN NSSI selection
+ */
+ def prepareOofRequestForRanNfNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareOofRequestForRanNfNSS method start")
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSSI option OOF Url: " + urlString)
+
+ //build oof request body
+ boolean ranNfNssiPreferReuse = execution.getVariable("ranNfNssiPreferReuse");
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSSISelectionResponse"
+ List<String> ranConstituentSliceProfiles = jsonUtil.StringArrayToList(execution.getVariable("RanConstituentSliceProfiles"))
+ anNssmfUtils.createDomainWiseSliceProfiles(ranConstituentSliceProfiles, execution)
+ Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)
+ String modelUuid = execution.getVariable("ANNF_modelUuid")
+ String modelInvariantUuid = execution.getVariable("ANNF_modelInvariantUuid")
+ String modelName = execution.getVariable("ANNF_modelName")
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+
+ execution.setVariable("nssiSelection_Url", "/api/oof/selection/nssi/v1")
+ execution.setVariable("nssiSelection_messageType",messageType)
+ execution.setVariable("nssiSelection_correlator",requestId)
+ execution.setVariable("nssiSelection_timeout",timeout)
+
+ String oofRequest = oofUtils.buildSelectNSSIRequest(requestId, messageType, modelUuid, modelInvariantUuid, modelName, profileInfo)
+
+ execution.setVariable("nssiSelection_oofRequest",oofRequest)
+ }
+ /*
+ * process OOF response for RAN NF NSSI selection
+ */
+ def processOofResponseForRanNfNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"processOofResponseForRanNfNSS method start")
+ String oofResponse = execution.getVariable("nfNssiSelection_asyncCallbackResponse")
+ String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
+ if(requestStatus.equals("completed")) {
+ List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))
+ if(solution.size()>=1) {
+ String ranNfNssiId = jsonUtil.getJsonValue(solution.get(0), "NSSIId")
+ String invariantUuid = jsonUtil.getJsonValue(solution.get(0), "invariantUUID")
+ String uuid = jsonUtil.getJsonValue(solution.get(0), "UUID")
+ String nssiName = jsonUtil.getJsonValue(solution.get(0), "NSSIName")
+ execution.setVariable("RANNFServiceInstanceId", ranNfNssiId)
+ execution.setVariable("RANNFInvariantUUID", invariantUuid)
+ execution.setVariable("RANNFUUID", uuid)
+ execution.setVariable("RANNFNssiName", nssiName)
+ logger.debug("RANNFServiceInstanceId from OOF "+ranNfNssiId)
+
+ ServiceInstance serviceInstance = new ServiceInstance();
+ serviceInstance.setInstanceId(ranNfNssiId);
+ ServiceDecomposition serviceDecomposition = execution.getVariable("ANNF_ServiceDecomposition")
+ serviceDecomposition.setServiceInstance(serviceInstance);
+ execution.setVariable("ANNF_ServiceDecomposition", serviceDecomposition)
+ execution.setVariable("isRspRanNfNssi", true)
+ }else {
+ logger.debug("No solutions returned from OOF .. Create new RAN NF NSSI")
+ }
+ }else {
+ String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
+ logger.error("received failed status from oof "+ statusMessage)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a failed Async Response from OOF : "+statusMessage)
+ }
+ }
+
+ def createSliceProfilesInAai = { DelegateExecution execution ->
+ logger.debug(Prefix+"createSliceProfilesInAai method start")
+ anNssmfUtils.createSliceProfilesInAai(execution)
+ }
+
+ def processRanNfModifyRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processRanNfModifyRsp method start")
+ anNssmfUtils.processRanNfModifyRsp(execution)
+ //create RAN NSSI
+ org.onap.aai.domain.yang.ServiceInstance ANServiceInstance = new ServiceInstance();
+ //AN instance creation
+ ANServiceInstance.setServiceInstanceId(execution.getVariable("RANServiceInstanceId"))
+ String sliceInstanceName = execution.getVariable("servicename")
+ ANServiceInstance.setServiceInstanceName(sliceInstanceName)
+ String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
+ ANServiceInstance.setServiceType(serviceType)
+ String serviceStatus = "deactivated"
+ ANServiceInstance.setOrchestrationStatus(serviceStatus)
+ String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList")
+ ANServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ String serviceRole = "nssi"
+ ANServiceInstance.setServiceRole(serviceRole)
+ List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
+ String snssai = snssaiList.get(0)
+ ANServiceInstance.setEnvironmentContext(snssai)
+ ANServiceInstance.setWorkloadContext("AN")
+
+ logger.debug("completed AN service instance build "+ ANServiceInstance.toString())
+ String msg = ""
+ try {
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri nssiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANServiceInstanceId"))
+ client.create(nssiServiceUri, ANServiceInstance)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in AnNssmfUtils.createSliceProfilesInAai " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ //end point update
+ createEndPointsInAai(execution)
+ }
+
+ def createSdnrRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"createSdnrRequest method start")
+ String callbackUrl = UrnPropertiesReader.getVariable("mso.workflow.message.endpoint") + "/AsyncSdnrResponse/"+execution.getVariable("msoRequestId")
+ String sdnrRequest = buildSdnrAllocateRequest(execution, "allocate", "InstantiateRANSlice", callbackUrl)
+ execution.setVariable("createNSSI_sdnrRequest", sdnrRequest)
+ execution.setVariable("createNSSI_timeout", "PT10M")
+ execution.setVariable("createNSSI_correlator", execution.getVariable("msoRequestId"))
+ execution.setVariable("createNSSI_messageType", "AsyncSdnrResponse");
+ }
+
+ def processSdnrResponse = { DelegateExecution execution ->
+ logger.debug(Prefix+"processSdnrResponse method start")
+ String SDNRResponse = execution.getVariable("SDNR_asyncCallbackResponse")
+ String status = jsonUtil.getJsonValue(SDNRResponse, "status")
+ if(status.equalsIgnoreCase("success")) {
+ String nfIds = jsonUtil.getJsonValue(SDNRResponse, "nfIds")
+ execution.setVariable("ranNfIdsJson", nfIds)
+ }else {
+ String reason = jsonUtil.getJsonValue(SDNRResponse, "reason")
+ logger.error("received failed status from SDNR "+ reason)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from SDNR "+ reason)
+ }
+ logger.debug("response from SDNR "+SDNRResponse)
+ }
+
+ def updateAaiWithRANInstances = { DelegateExecution execution ->
+ logger.debug(Prefix+"updateAaiWithRANInstances method start")
+ //create RAN NSSI
+ org.onap.aai.domain.yang.ServiceInstance ANServiceInstance = new ServiceInstance();
+ org.onap.aai.domain.yang.ServiceInstance ANNFServiceInstance = new ServiceInstance();
+ //AN instance creation
+ ANServiceInstance.setServiceInstanceId(execution.getVariable("RANServiceInstanceId"))
+ String sliceInstanceName = execution.getVariable("servicename")
+ ANServiceInstance.setServiceInstanceName(sliceInstanceName)
+ String serviceType = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
+ ANServiceInstance.setServiceType(serviceType)
+ String serviceStatus = "deactivated"
+ ANServiceInstance.setOrchestrationStatus(serviceStatus)
+ String serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "plmnIdList")
+ ANServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ String serviceRole = "nssi"
+ ANServiceInstance.setServiceRole(serviceRole)
+ List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
+ String snssai = snssaiList.get(0)
+ ANServiceInstance.setEnvironmentContext(snssai)
+ ANServiceInstance.setWorkloadContext("AN")
+
+ logger.debug("completed AN service instance build "+ ANServiceInstance.toString())
+ //create RAN NF NSSI
+ ANNFServiceInstance.setServiceInstanceId(execution.getVariable("RANNFServiceInstanceId"))
+ sliceInstanceName = execution.getVariable("ANNF_modelName")
+ ANNFServiceInstance.setServiceInstanceName(sliceInstanceName)
+ ANNFServiceInstance.setServiceType(serviceType)
+ ANNFServiceInstance.setOrchestrationStatus(serviceStatus)
+ serviceInstanceLocationid = jsonUtil.getJsonValue(execution.getVariable("ranNfSliceProfile"), "plmnIdList")
+ ANNFServiceInstance.setServiceInstanceLocationId(serviceInstanceLocationid)
+ ANNFServiceInstance.setServiceRole(serviceRole)
+ snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
+ snssai = snssaiList.get(0)
+ ANNFServiceInstance.setEnvironmentContext(snssai)
+ ANNFServiceInstance.setWorkloadContext("AN-NF")
+ logger.debug("completed AN service instance build "+ ANNFServiceInstance.toString())
+
+ String msg = ""
+ try {
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri nssiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANServiceInstanceId"))
+ client.create(nssiServiceUri, ANServiceInstance)
+
+ AAIResourceUri nssiServiceUri1 = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), execution.getVariable("RANNFServiceInstanceId"))
+ client.create(nssiServiceUri1, ANNFServiceInstance)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in AnNssmfUtils.createSliceProfilesInAai " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ //end point update
+ createEndPointsInAai(execution)
+ }
+ def prepareTnFhRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnFhRequest method start")
+
+ String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_FH", "allocate")
+ String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+
+ if (nssmfResponse != null) {
+ execution.setVariable("nssmfResponse", nssmfResponse)
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TNFH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit prepareTnFhRequest")
+
+ }
+ def prepareTnMhRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnMhRequest method start")
+
+ String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_MH", "allocate")
+ String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+
+ if (nssmfResponse != null) {
+ execution.setVariable("nssmfResponse", nssmfResponse)
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TNMH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit prepareTnMhRequest")
+ }
+
+ def createFhAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_FH")
+ }
+
+ def createMhAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_MH")
+ }
+
+ private void createTnAllocateNssiJobQuery(DelegateExecution execution, String domainType) {
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("TN")
+ esrInfo.setVendor("ONAP")
+ String esrInfoString = objectMapper.writeValueAsString(esrInfo)
+ execution.setVariable("esrInfo", esrInfoString)
+ JsonObject serviceInfo = new JsonObject()
+ serviceInfo.addProperty("nssiId", null)
+ serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
+ String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
+ serviceInfo.addProperty("sST", sST)
+ serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList")))
+ serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
+ serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
+ if(domainType.equals("TN_FH")) {
+ serviceInfo.addProperty("nssiName", execution.getVariable("TNFH_modelName"))
+ serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNFH_modelInvariantUuid"))
+ serviceInfo.addProperty("serviceUuid", execution.getVariable("TNFH_modelUuid"))
+ }else if(domainType.equals("TN_MH")) {
+ serviceInfo.addProperty("nssiName", execution.getVariable("TNMH_modelName"))
+ serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("TNMH_modelInvariantUuid"))
+ serviceInfo.addProperty("serviceUuid", execution.getVariable("TNMH_modelUuid"))
+ }
+ execution.setVariable("serviceInfo", serviceInfo.toString())
+ execution.setVariable("responseId", "")
+ }
+
+ def processFhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processJobStatusRsp method start")
+ String jobResponse = execution.getVariable("TNFH_jobResponse")
+ logger.debug("Job status response "+jobResponse)
+ String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
+ String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
+ if(status.equalsIgnoreCase("finished")) {
+ execution.setVariable("TNFH_NSSI", nssi)
+ logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
+ }
+ else {
+ String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
+ logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ }
+ }
+
+ def processMhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processJobStatusRsp method start")
+ String jobResponse = execution.getVariable("TNMH_jobResponse")
+ logger.debug("Job status response "+jobResponse)
+ String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
+ String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
+ if(status.equalsIgnoreCase("finished")) {
+ execution.setVariable("TNMH_NSSI", nssi)
+ logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
+ }
+ else {
+ String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
+ logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ }
+ }
+
+ def processModifyJobStatusRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processJobStatusRsp method start")
+ String jobResponse = execution.getVariable("jobResponse")
+ logger.debug("Job status response "+jobResponse)
+ String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
+ String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
+ if(status.equalsIgnoreCase("finished")) {
+ logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
+ }
+ else {
+ String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
+ logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ }
+ }
+
+ def updateAairelationships = { DelegateExecution execution ->
+ logger.debug(Prefix + "updateAairelationships Start")
+ String msg = ""
+ try {
+ def ANNF_serviceInstanceId = execution.getVariable("RANNFServiceInstanceId")
+ def TNFH_serviceInstanceId = execution.getVariable("TNFH_NSSI")
+ def TNMH_serviceInstanceId = execution.getVariable("TNMH_NSSI")
+ def AN_profileInstanceId = execution.getVariable("sliceProfileId")
+ def AN_NSSI = execution.getVariable("RANServiceInstanceId")
+ def ANNF_profileInstanceId = execution.getVariable("ANNF_sliceProfileInstanceId")
+ def TNFH_profileInstanceId = execution.getVariable("TNFH_sliceProfileInstanceId")
+ def TNMH_profileInstanceId = execution.getVariable("TNMH_sliceProfileInstanceId")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ Relationship ANNF_relationship = new Relationship()
+ Relationship TNFH_relationship = new Relationship()
+ Relationship TNMH_relationship = new Relationship()
+
+ String ANNF_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${ANNF_profileInstanceId}"
+ String TNFH_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNFH_profileInstanceId}"
+ String TNMH_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNMH_profileInstanceId}"
+
+ String ANNF_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${ANNF_serviceInstanceId}"
+ String TNFH_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNFH_serviceInstanceId}"
+ String TNMH_NSSI_relatedLink = "aai/v21/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNMH_serviceInstanceId}"
+
+ ANNF_relationship.setRelatedLink(ANNF_relatedLink)
+ ANNF_relationship.setRelatedTo("service-instance")
+ ANNF_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+ TNFH_relationship.setRelatedLink(TNFH_relatedLink)
+ TNFH_relationship.setRelatedTo("service-instance")
+ TNFH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+ TNMH_relationship.setRelatedLink(TNMH_relatedLink)
+ TNMH_relationship.setRelatedTo("service-instance")
+ TNMH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+
+ // create SliceProfile and NSSI relationship in AAI
+ anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,ANNF_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,TNFH_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,TNMH_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,AN_profileInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,AN_profileInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,AN_profileInstanceId)
+
+ //create AN NSSI and ANNF,TNFH,TNMH relationship in AAI
+ ANNF_relationship.setRelatedLink(ANNF_NSSI_relatedLink)
+ TNFH_relationship.setRelatedLink(TNFH_NSSI_relatedLink)
+ TNMH_relationship.setRelatedLink(TNMH_NSSI_relatedLink)
+ anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,AN_NSSI)
+ anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,AN_NSSI)
+ anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,AN_NSSI)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+
+ msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+ /**
+ * update operation status in request db
+ *
+ */
+ def prepareOperationStatusUpdate = { DelegateExecution execution ->
+ logger.debug(Prefix + "prepareOperationStatusUpdate Start")
+
+ String serviceId = execution.getVariable("dummyServiceId")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String nssiId = execution.getVariable("RANServiceInstanceId")
+ logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
+
+ ResourceOperationStatus updateStatus = new ResourceOperationStatus()
+ updateStatus.setServiceId(serviceId)
+ updateStatus.setOperationId(jobId)
+ updateStatus.setResourceTemplateUUID(nsiId)
+ updateStatus.setResourceInstanceID(nssiId)
+ updateStatus.setOperType("Allocate")
+ updateStatus.setProgress(100)
+ updateStatus.setStatus("finished")
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
+
+ logger.debug(Prefix + "prepareOperationStatusUpdate Exit")
+ }
+
+ def prepareFailedOperationStatusUpdate = { DelegateExecution execution ->
+ logger.debug(Prefix + "prepareFailedOperationStatusUpdate Start")
+
+ String serviceId = execution.getVariable("dummyServiceId")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String nssiId = execution.getVariable("RANServiceInstanceId")
+ logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
+
+ ResourceOperationStatus updateStatus = new ResourceOperationStatus()
+ updateStatus.setServiceId(serviceId)
+ updateStatus.setOperationId(jobId)
+ updateStatus.setResourceTemplateUUID(nsiId)
+ updateStatus.setResourceInstanceID(nssiId)
+ updateStatus.setOperType("Allocate")
+ updateStatus.setProgress(0)
+ updateStatus.setStatus("failed")
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
+ }
+
+ private String buildSdnrAllocateRequest(DelegateExecution execution, String action, String rpcName, String callbackUrl) {
+
+ String requestId = execution.getVariable("msoRequestId")
+ Date date = new Date().getTime()
+ Timestamp time = new Timestamp(date)
+ Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("ranNfSliceProfile"), Map.class)
+ sliceProfile.put("sliceProfileId", execution.getVariable("ANNF_sliceProfileInstanceId"))
+ sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSessions"))
+ sliceProfile.put("uLThptPerSlice", sliceProfile.get("expDataRateUL"))
+ sliceProfile.put("dLThptPerSlice", sliceProfile.get("expDataRateDL"))
+ String sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ JsonObject response = new JsonObject()
+ JsonObject body = new JsonObject()
+ JsonObject input = new JsonObject()
+ JsonObject commonHeader = new JsonObject()
+ JsonObject payload = new JsonObject()
+ JsonObject payloadInput = new JsonObject()
+ commonHeader.addProperty("TimeStamp", time.toString())
+ commonHeader.addProperty("APIver", "1.0")
+ commonHeader.addProperty("RequestID", requestId)
+ commonHeader.addProperty("SubRequestID", "1")
+ commonHeader.add("RequestTrack", new JsonObject())
+ commonHeader.add("Flags", new JsonObject())
+ payloadInput.addProperty("sliceProfile", sliceProfileString)
+ payloadInput.addProperty("RANNSSIId", execution.getVariable("RANServiceInstanceId"))
+ payloadInput.addProperty("NSIID", execution.getVariable("nsiId"))
+ payloadInput.addProperty("RANNFNSSIId", execution.getVariable("RANNFServiceInstanceId"))
+ payloadInput.addProperty("callbackURL", callbackUrl)
+ payloadInput.add("additionalproperties", new JsonObject())
+ payload.add("input", payloadInput)
+ input.add("CommonHeader", commonHeader)
+ input.addProperty("Action", action)
+ input.add("Payload", payload)
+ body.add("input", input)
+ response.add("body", body)
+ response.addProperty("version", "1.0")
+ response.addProperty("rpc-name", rpcName)
+ response.addProperty("correlation-id", requestId+"-1")
+ response.addProperty("type", "request")
+ return response.toString()
+ }
+
+ private void createEndPointsInAai(DelegateExecution execution) {
+ String type = "endpoint"
+ String function = "transport_EP"
+ int prefixLength = 24
+ String addressFamily = "ipv4"
+ //BH RAN end point update
+ String bh_endpoint = execution.getVariable("bh_endpoint")
+ 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()
+ DU_ep.setRouteId(DUEG_routeId)
+ DU_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( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), bh_routeId)
+ client.create(networkRouteUri, bh_ep)
+ logger.debug("creating RU endpoint . ID : "+RU_routeId+" node details : "+RU_ep.toString())
+ networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), RU_routeId)
+ client.create(networkRouteUri, RU_ep)
+ logger.debug("creating DUIN endpoint . ID : "+DUIN_routeId+" node details : "+DU_ep.toString())
+ networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), DUIN_routeId)
+ client.create(networkRouteUri, DU_ep)
+ logger.debug("creating DUEG endpoint . ID : "+DUEG_routeId+" node details : "+DU_ep.toString())
+ networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), DUEG_routeId)
+ client.create(networkRouteUri, DU_ep)
+ logger.debug("creating CUIN endpoint . ID : "+CUIN_routeId+" node details : "+CUIN_ep.toString())
+ networkRouteUri = AAIUriFactory.createResourceUri( new AAIObjectType(AAINamespaceConstants.NETWORK, NetworkRoute.class), 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)
+ }
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSIV2.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSIV2.groovy
new file mode 100644
index 0000000000..924b42fe9f
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSIandNSSIV2.groovy
@@ -0,0 +1,613 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.apache.commons.lang3.StringUtils
+import org.camunda.bpm.engine.delegate.BpmnError
+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.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.beans.nsmf.*
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import javax.ws.rs.NotFoundException
+
+class DoAllocateNSIandNSSIV2 extends AbstractServiceTaskProcessor{
+
+ private static final Logger logger = LoggerFactory.getLogger( DoAllocateNSIandNSSIV2.class);
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+
+ JsonUtils jsonUtil = new JsonUtils()
+
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ AAIResourcesClient client = getAAIClient()
+
+ /**
+ * Pre Process the BPMN Flow Request
+ * Inclouds:
+ * generate the nsOperationKey
+ * generate the nsParameters
+ */
+
+ void preProcessRequest (DelegateExecution execution) {
+ String msg = ""
+ logger.trace("Enter preProcessRequest()")
+ Map<String, Object> nssiMap = new HashMap<>()
+ execution.setVariable("nssiMap", nssiMap)
+ boolean isMoreNSSTtoProcess = true
+ execution.setVariable("isMoreNSSTtoProcess", isMoreNSSTtoProcess)
+ List<String> nsstSequence = new ArrayList<>(Arrays.asList("cn"))
+ execution.setVariable("nsstSequence", nsstSequence)
+ logger.trace("Exit preProcessRequest")
+ }
+
+ /**
+ * Process NSI options
+ * @param execution
+ */
+ void retriveSliceOption(DelegateExecution execution) {
+ logger.trace("Enter retriveSliceOption() of DoAllocateNSIandNSSI")
+
+ boolean isNSIOptionAvailable
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+// try
+// {
+// Map<String, Object> nstSolution = execution.getVariable("nstSolution") as Map
+// String modelUuid = nstSolution.get("UUID")
+// String modelInvariantUuid = nstSolution.get("invariantUUID")
+// String serviceModelInfo = """{
+// "modelInvariantUuid":"${modelInvariantUuid}",
+// "modelUuid":"${modelUuid}",
+// "modelVersion":""
+// }"""
+// execution.setVariable("serviceModelInfo", serviceModelInfo)
+//
+// execution.setVariable("sliceParams", sliceParams)
+// }catch (Exception ex) {
+// logger.debug( "Unable to get the task information from request DB: " + ex)
+// exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Unable to get task information from request DB.")
+// }
+
+ if(StringUtils.isBlank(sliceParams.getSuggestNsiId())) {
+ isNSIOptionAvailable = false
+ }
+ else {
+ isNSIOptionAvailable = true
+ execution.setVariable('nsiServiceInstanceId', sliceParams.getSuggestNsiId())
+ execution.setVariable('nsiServiceInstanceName', sliceParams.getSuggestNsiName())
+ }
+ execution.setVariable("isNSIOptionAvailable", isNSIOptionAvailable)
+ logger.trace("Exit retriveSliceOption() of DoAllocateNSIandNSSI")
+ }
+
+
+ /**
+ * create nsi instance in aai
+ * @param execution
+ */
+ void createNSIinAAI(DelegateExecution execution) {
+ logger.debug("Enter CreateNSIinAAI in DoAllocateNSIandNSSI()")
+
+ String sliceInstanceId = UUID.randomUUID().toString()
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+ sliceParams.setServiceId(sliceInstanceId)
+
+ ServiceInstance nsi = new ServiceInstance()
+
+
+ String sliceInstanceName = "nsi_"+execution.getVariable("sliceServiceInstanceName")
+ String serviceType = execution.getVariable("serviceType")
+ String serviceStatus = "deactivated"
+ String modelInvariantUuid = sliceParams.getNSTInfo().invariantUUID
+ String modelUuid = sliceParams.getNSTInfo().UUID
+
+ String uuiRequest = execution.getVariable("uuiRequest")
+ String serviceInstanceLocationid = jsonUtil.getJsonValue(uuiRequest, "service.parameters.requestInputs.plmnIdList")
+ String serviceRole = "nsi"
+
+ execution.setVariable("sliceInstanceId", sliceInstanceId)
+ nsi.setServiceInstanceId(sliceInstanceId)
+ nsi.setServiceInstanceName(sliceInstanceName)
+ nsi.setServiceType(serviceType)
+ nsi.setOrchestrationStatus(serviceStatus)
+ nsi.setModelInvariantId(modelInvariantUuid)
+ nsi.setModelVersionId(modelUuid)
+ nsi.setServiceInstanceLocationId(serviceInstanceLocationid)
+ nsi.setServiceRole(serviceRole)
+ String msg
+ try {
+
+ AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ sliceInstanceId)
+ client.create(nsiServiceUri, nsi)
+
+ execution.setVariable("nsiServiceUri", nsiServiceUri.build().toString())
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ logger.debug("Exit CreateNSIinAAI in DoAllocateNSIandNSSI()")
+ }
+
+
+ /**
+ * create relationship between nsi and service profile instance
+ * @param execution
+ */
+ void createRelationship(DelegateExecution execution) {
+ //relation ship
+ Relationship relationship = new Relationship()
+ String nsiServiceUri = execution.getVariable("nsiServiceUri") as String
+ logger.info("Creating Allotted resource relationship, nsiServiceUri: " + nsiServiceUri)
+
+ relationship.setRelatedLink(nsiServiceUri)
+
+ AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(
+ AAIObjectType.ALLOTTED_RESOURCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("sliceServiceInstanceId"),
+ execution.getVariable("allottedResourceId"))
+ .relationshipAPI()
+ client.create(allottedResourceUri, relationship)
+ }
+
+ /**
+ *
+ * @param execution
+ */
+ void updateRelationship(DelegateExecution execution) {
+ logger.debug("Enter update relationship in DoAllocateNSIandNSSI()")
+ String allottedResourceId = execution.getVariable("allottedResourceId")
+ //Need to check whether nsi exist : Begin
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+
+ String nsiServiceInstanceID = sliceParams.getSuggestNsiId()
+ sliceParams.setServiceId(nsiServiceInstanceID)
+
+ AAIResourceUri nsiServiceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ nsiServiceInstanceID)
+
+ try {
+ AAIResultWrapper wrapper = client.get(nsiServiceUri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+ //todo: if exists
+ if (!si.ifPresent()) {
+ String msg = "NSI suggested in the option doesn't exist. " + nsiServiceInstanceID
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("sliceServiceInstanceId"),
+ allottedResourceId)
+
+ client.connect(allottedResourceUri, nsiServiceUri)
+
+ execution.setVariable("sliceParams", sliceParams)
+ }catch(BpmnError e) {
+ throw e
+ }catch (Exception ex){
+ String msg = "NSI suggested in the option doesn't exist. " + nsiServiceInstanceID
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug("Exit update relationship in DoAllocateNSIandNSSI()")
+ }
+
+ /**
+ * create RAN Slice Profile Instance
+ * @param execution
+ */
+ void createAnSliceProfileInstance(DelegateExecution execution) {
+
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String serviceInstanceId = UUID.randomUUID().toString()
+ execution.setVariable("ranSliceProfileInstanceId", serviceInstanceId) //todo:
+
+ String serviceType = ""
+ String serviceRole = "slice-profile"
+ String oStatus = "deactivated"
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<AnSliceProfile> sliceTaskInfo = sliceParams.anSliceTaskInfo
+ sliceTaskInfo.setServiceInstanceId(serviceInstanceId)
+
+ // create slice profile
+ ServiceInstance rspi = new ServiceInstance()
+ rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
+ rspi.setServiceType(serviceType)
+ rspi.setServiceRole(serviceRole)
+ rspi.setOrchestrationStatus(oStatus)
+ rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
+ rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
+ rspi.setInputParameters(uuiRequest)
+ rspi.setWorkloadContext(useInterval)
+ rspi.setEnvironmentContext(sNSSAI_id)
+
+ //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(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ serviceInstanceId)
+ client.create(uri, rspi)
+
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * create An Slice Profile
+ * @param execution
+ */
+ void createAnSliceProfile(DelegateExecution execution) {
+
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<AnSliceProfile> sliceTaskInfo = sliceParams.anSliceTaskInfo
+ AnSliceProfile anSliceProfile = sliceTaskInfo.sliceProfile
+
+ String profileId = UUID.randomUUID().toString()
+ anSliceProfile.setSliceProfileId(profileId)
+
+ SliceProfile sliceProfile = new SliceProfile()
+ sliceProfile.setProfileId(profileId)
+ sliceProfile.setCoverageAreaTAList(anSliceProfile.coverageAreaTAList as String)
+ //todo:...
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SLICE_PROFILE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ sliceTaskInfo.serviceInstanceId,
+ profileId
+ )
+ client.create(uri, sliceProfile)
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * prepare AllocateAnNssi
+ * @param execution
+ */
+ void prepareAllocateAnNssi(DelegateExecution execution) {
+
+ //todo:
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<AnSliceProfile> sliceTaskInfo = sliceParams.anSliceTaskInfo
+
+ NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
+
+ AllocateAnNssi allocateAnNssi = new AllocateAnNssi()
+ allocateAnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
+ allocateAnNssi.nssiId = sliceTaskInfo.NSSTInfo.UUID
+ allocateAnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
+ allocateAnNssi.sliceProfile = sliceTaskInfo.sliceProfile
+ allocateAnNssi.nsiInfo.nsiId = sliceParams
+
+ 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")
+
+ //todo: service info
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.globalSubscriberId = globalSubscriberId
+ serviceInfo.subscriptionServiceType = subscriptionServiceType
+ serviceInfo.nsiId = sliceParams.serviceId
+ serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
+ serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
+
+ nbiRequest.setServiceInfo(serviceInfo)
+ nbiRequest.setEsrInfo(esrInfo)
+ nbiRequest.setAllocateAnNssi(allocateAnNssi)
+
+ execution.setVariable("AnAllocateNssiNbiRequest", nbiRequest)
+ execution.setVariable("anBHSliceTaskInfo", sliceTaskInfo)
+ }
+
+
+ /**
+ * create RAN Slice Profile Instance
+ * @param execution
+ */
+ void createCnSliceProfileInstance(DelegateExecution execution) {
+
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String serviceInstanceId = UUID.randomUUID().toString()
+ execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
+
+ String serviceType = ""
+ String serviceRole = "slice-profile"
+ String oStatus = "deactivated"
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<CnSliceProfile> sliceTaskInfo = sliceParams.cnSliceTaskInfo
+ sliceTaskInfo.setServiceInstanceId(serviceInstanceId)
+
+ // create slice profile
+ ServiceInstance rspi = new ServiceInstance()
+ rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
+ rspi.setServiceType(serviceType)
+ rspi.setServiceRole(serviceRole)
+ rspi.setOrchestrationStatus(oStatus)
+ rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
+ rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
+ rspi.setInputParameters(uuiRequest)
+ rspi.setWorkloadContext(useInterval)
+ rspi.setEnvironmentContext(sNSSAI_id)
+
+ //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(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ serviceInstanceId)
+ client.create(uri, rspi)
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * create An Slice Profile
+ * @param execution
+ */
+ void createCnSliceProfile(DelegateExecution execution) {
+
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ //String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+
+ SliceTaskInfo<CnSliceProfile> sliceTaskInfo = sliceParams.cnSliceTaskInfo
+ CnSliceProfile cnSliceProfile = sliceTaskInfo.sliceProfile
+
+ String profileId = UUID.randomUUID().toString()
+ cnSliceProfile.setSliceProfileId(profileId)
+
+ SliceProfile sliceProfile = new SliceProfile()
+ sliceProfile.setProfileId(profileId)
+ sliceProfile.setCoverageAreaTAList(cnSliceProfile.coverageAreaTAList as String)
+ //todo:...
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SLICE_PROFILE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ sliceTaskInfo.serviceInstanceId,
+ profileId
+ )
+ client.create(uri, sliceProfile)
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * prepare AllocateCnNssi
+ * @param execution
+ */
+ void prepareAllocateCnNssi(DelegateExecution execution) {
+
+ //todo:
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<CnSliceProfile> sliceTaskInfo = sliceParams.cnSliceTaskInfo
+
+ NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
+
+ AllocateCnNssi allocateCnNssi = new AllocateCnNssi()
+ allocateCnNssi.nsstId = sliceTaskInfo.NSSTInfo.UUID
+ allocateCnNssi.nssiId = sliceTaskInfo.NSSTInfo.UUID
+ allocateCnNssi.nssiName = sliceTaskInfo.NSSTInfo.name
+ allocateCnNssi.sliceProfile = sliceTaskInfo.sliceProfile
+ allocateCnNssi.nsiInfo.nsiId = sliceParams
+
+ 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")
+
+ //todo: service info
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.globalSubscriberId = globalSubscriberId
+ serviceInfo.subscriptionServiceType = subscriptionServiceType
+ serviceInfo.nsiId = sliceParams.serviceId
+ serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
+ serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
+
+ nbiRequest.setServiceInfo(serviceInfo)
+ nbiRequest.setEsrInfo(esrInfo)
+ nbiRequest.setAllocateCnNssi(allocateCnNssi)
+
+ execution.setVariable("CnAllocateNssiNbiRequest", nbiRequest)
+ execution.setVariable("cnSliceTaskInfo", sliceTaskInfo)
+ }
+
+
+ /**
+ * create TN Slice Profile Instance
+ * @param execution
+ */
+ void createTnBHSliceProfileInstance(DelegateExecution execution) {
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ String serviceType = ""
+ String serviceRole = "slice-profile"
+ String oStatus = "deactivated"
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+
+ SliceTaskInfo<TnSliceProfile> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
+ String serviceInstanceId = UUID.randomUUID().toString()
+
+ sliceTaskInfo.setServiceInstanceId(serviceInstanceId)
+ //execution.setVariable("cnSliceProfileInstanceId", serviceInstanceId) //todo:
+
+ // create slice profile
+ ServiceInstance rspi = new ServiceInstance()
+ rspi.setServiceInstanceName(sliceTaskInfo.NSSTInfo.name)
+ rspi.setServiceType(serviceType)
+ rspi.setServiceRole(serviceRole)
+ rspi.setOrchestrationStatus(oStatus)
+ rspi.setModelInvariantId(sliceTaskInfo.NSSTInfo.invariantUUID)
+ rspi.setModelVersionId(sliceTaskInfo.NSSTInfo.UUID)
+ rspi.setInputParameters(uuiRequest)
+ rspi.setWorkloadContext(useInterval)
+ rspi.setEnvironmentContext(sNSSAI_id)
+
+ //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(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ serviceInstanceId)
+ client.create(uri, rspi)
+
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * create An Slice Profile
+ * @param execution
+ */
+ void createTnBHSliceProfile(DelegateExecution execution) {
+
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String serviceInstanceId = execution.getVariable("ranSliceProfileInstanceId")
+
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+
+ SliceTaskInfo<TnSliceProfile> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
+
+ TnSliceProfile tnSliceProfile = sliceTaskInfo.sliceProfile
+ String profileId = UUID.randomUUID().toString()
+ tnSliceProfile.setSliceProfileId(profileId)
+
+ SliceProfile sliceProfile = new SliceProfile()
+ sliceProfile.setProfileId(profileId)
+ //todo:...
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SLICE_PROFILE,
+ globalSubscriberId,
+ subscriptionServiceType,
+ serviceInstanceId,
+ profileId
+ )
+ client.create(uri, sliceProfile)
+
+ execution.setVariable("sliceParams", sliceParams)
+ }
+
+ /**
+ * prepare AllocateCnNssi
+ * @param execution
+ */
+ void prepareAllocateTnBHNssi(DelegateExecution execution) {
+
+ //todo:
+ SliceTaskParamsAdapter sliceParams =
+ execution.getVariable("sliceParams") as SliceTaskParamsAdapter
+ SliceTaskInfo<TnSliceProfile> sliceTaskInfo = sliceParams.tnBHSliceTaskInfo
+
+ NssmfAdapterNBIRequest nbiRequest = new NssmfAdapterNBIRequest()
+
+ AllocateTnNssi allocateTnNssi = new AllocateTnNssi()
+ //todo: AllocateTnNssi
+ //allocateTnNssi.networkSliceInfos
+
+ 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")
+
+ //todo: service info
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.globalSubscriberId = globalSubscriberId
+ serviceInfo.subscriptionServiceType = subscriptionServiceType
+ serviceInfo.nsiId = sliceParams.serviceId
+ serviceInfo.serviceInvariantUuid = sliceTaskInfo.NSSTInfo.invariantUUID
+ serviceInfo.serviceUuid = sliceTaskInfo.NSSTInfo.UUID
+
+ nbiRequest.setServiceInfo(serviceInfo)
+ nbiRequest.setEsrInfo(esrInfo)
+ nbiRequest.setAllocateTnNssi(allocateTnNssi)
+
+ execution.setVariable("TnBHAllocateNssiNbiRequest", nbiRequest)
+ execution.setVariable("tnBHSliceTaskInfo", sliceTaskInfo)
+ }
+
+} \ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSIV2.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSIV2.groovy
new file mode 100644
index 0000000000..05bb53a61e
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateNSSIV2.groovy
@@ -0,0 +1,117 @@
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.apache.commons.lang3.StringUtils
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.beans.nsmf.SliceTaskInfo
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.core.domain.ModelInfo
+import org.onap.so.bpmn.core.domain.ServiceDecomposition
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+class DoAllocateNSSIV2 extends AbstractServiceTaskProcessor {
+
+ private static final Logger logger = LoggerFactory.getLogger( DoAllocateNSSIV2.class);
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+
+ JsonUtils jsonUtil = new JsonUtils()
+
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ @Override
+ void preProcessRequest(DelegateExecution execution) {
+ logger.trace("Enter preProcessRequest()")
+
+// String nssmfOperation
+//
+// String nsstInput = execution.getVariable("nsstInput")
+// String modelUuid = jsonUtil.getJsonValue(nsstInput, "modelUuid")
+// //modelUuid="2763777c-27bd-4df7-93b8-c690e23f4d3f"
+// String nssiInstanceId = jsonUtil.getJsonValue(nsstInput, "serviceInstanceId")
+// String serviceModelInfo = """{
+// "modelInvariantUuid":"",
+// "modelUuid":"${modelUuid}",
+// "modelVersion":""
+// }"""
+// execution.setVariable("serviceModelInfo", serviceModelInfo)
+// execution.setVariable("nssiInstanceId", nssiInstanceId)
+// String nssiProfileID = UUID.randomUUID().toString()
+// execution.setVariable("nssiProfileID", nssiProfileID)
+// if(isBlank(nssiInstanceId))
+// {
+// nssmfOperation="create"
+// nssiInstanceId = UUID.randomUUID().toString()
+// }else {
+// nssmfOperation = "update"
+// }
+// execution.setVariable("nssmfOperation",nssmfOperation)
+// execution.setVariable("nssiInstanceId",nssiInstanceId)
+//
+// def isNSSICreated = false
+// execution.setVariable("isNSSICreated",isNSSICreated)
+//
+// int currentCycle = 0
+// execution.setVariable("currentCycle", currentCycle)
+
+
+ SliceTaskInfo sliceTaskInfo = execution.getVariable("sliceTaskInfo") as SliceTaskInfo
+ if (StringUtils.isBlank(sliceTaskInfo.suggestNssiId)) {
+ execution.setVariable("nssmfOperation", "create")
+ } else {
+ execution.setVariable("nssmfOperation", "update")
+ }
+ logger.trace("Exit preProcessRequest")
+ }
+
+ /**
+ * prepare nssi request
+ * @param execution
+ */
+ void prepareNSSIReq(DelegateExecution execution) {
+
+ }
+
+ void getNSSTInfo(DelegateExecution execution){
+ logger.trace("Enter getNSSTInfo in DoAllocateNSSI()")
+ ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition")
+ ModelInfo modelInfo = serviceDecomposition.getModelInfo()
+ String serviceRole = "nssi"
+ String nssiServiceInvariantUuid = serviceDecomposition.modelInfo.getModelInvariantUuid()
+ String nssiServiceUuid = serviceDecomposition.modelInfo.getModelUuid()
+ String nssiServiceType = serviceDecomposition.getServiceType()
+ String uuiRequest = execution.getVariable("uuiRequest")
+ String nssiServiceName = "nssi_"+jsonUtil.getJsonValue(uuiRequest, "service.name")
+ execution.setVariable("nssiServiceName",nssiServiceName)
+ execution.setVariable("nssiServiceType",nssiServiceType)
+ execution.setVariable("nssiServiceInvariantUuid",nssiServiceInvariantUuid)
+ execution.setVariable("nssiServiceUuid",nssiServiceUuid)
+ execution.setVariable("serviceRole",serviceRole)
+
+ String content = serviceDecomposition.getServiceInfo().getServiceArtifact().get(0).getContent()
+ String nsstID = jsonUtil.getJsonValue(content, "metadata.id")
+ String nsstVendor = jsonUtil.getJsonValue(content, "metadata.vendor")
+ String nsstDomain = jsonUtil.getJsonValue(content, "metadata.domainType")
+ String nsstType = jsonUtil.getJsonValue(content, "metadata.type")
+
+ execution.setVariable("nsstID",nsstID)
+ execution.setVariable("nsstVendor",nsstVendor)
+ execution.setVariable("nsstDomain",nsstDomain)
+ execution.setVariable("nssiServiceUuid",nssiServiceUuid)
+ execution.setVariable("nsstType",nsstType)
+
+ String nsstContentInfo = """{
+ "NsstID":"${nsstID}",
+ "Vendor":"${nsstVendor}",
+ "type":"${nsstType}"
+ }"""
+
+ logger.trace("Exit getNSSTInfo in DoAllocateNSSI()")
+ }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOptionV2.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOptionV2.groovy
new file mode 100644
index 0000000000..ca262172d0
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOptionV2.groovy
@@ -0,0 +1,907 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2019, CMCC Technologies Co., Ltd.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.core.type.TypeReference
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.apache.commons.lang3.StringUtils
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.logging.filter.base.ONAPComponents
+import org.onap.so.beans.nsmf.*
+import org.onap.so.beans.nsmf.oof.SubnetCapability
+import org.onap.so.beans.nsmf.oof.TemplateInfo
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.OofUtils
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.domain.ServiceDecomposition
+import org.onap.so.bpmn.core.domain.ServiceProxy
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import javax.ws.rs.NotFoundException
+import javax.ws.rs.core.Response
+
+class DoCreateSliceServiceOptionV2 extends AbstractServiceTaskProcessor{
+
+ private static final Logger logger = LoggerFactory.getLogger( DoCreateSliceServiceOptionV2.class)
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+
+ JsonUtils jsonUtil = new JsonUtils()
+
+ OofUtils oofUtils = new OofUtils()
+
+ ObjectMapper objectMapper = new ObjectMapper()
+
+ void preProcessRequest (DelegateExecution execution) {
+ }
+
+
+ /**
+ * prepare select nsi request
+ * @param execution
+ */
+ void prepareSelectNSIRequest(DelegateExecution execution) {
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSI option OOF Url: " + urlString)
+
+ boolean isNSISuggested = true
+ execution.setVariable("isNSISuggested",isNSISuggested)
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+
+ Map<String, Object> profileInfo = execution.getVariable("serviceProfile")
+ Map<String, Object> nstSolution = execution.getVariable("nstSolution")
+ logger.debug("Get NST selection from OOF: " + nstSolution.toString())
+ String nstInfo = """{
+ "modelInvariantId":"${nstSolution.invariantUUID}",
+ "modelVersionId":"${nstSolution.UUID}",
+ "modelName":"${nstSolution.NSTName}"
+ }"""
+
+ execution.setVariable("nsiSelectionUrl", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nsiSelection_messageType",messageType)
+ execution.setVariable("nsiSelection_correlator",requestId)
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ execution.setVariable("nsiSelection_timeout",timeout)
+ String oofRequest = oofUtils.buildSelectNSIRequest(requestId, nstInfo,messageType, profileInfo)
+ execution.setVariable("nsiSelection_oofRequest",oofRequest)
+ logger.debug("Sending request to OOF: " + oofRequest)
+ }
+
+ /**
+ * process select nsi response
+ * @param execution
+ */
+ void processOOFResponse(DelegateExecution execution) {
+
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") as SliceTaskParams
+ String OOFResponse = execution.getVariable("nsiSelection_oofResponse")
+ logger.debug("NSI OOFResponse is: " + OOFResponse)
+ execution.setVariable("OOFResponse", OOFResponse)
+ //This needs to be changed to derive a value when we add policy to decide the solution options.
+
+ Map<String, Object> resMap = objectMapper.readValue(OOFResponse, Map.class)
+ List<Map<String, Object>> nsiSolutions = (List<Map<String, Object>>) resMap.get("solutions")
+ Map<String, Object> solutions = nsiSolutions.get(0)
+
+ String resourceSharingLevel = execution.getVariable("resourceSharingLevel")
+ Boolean isSharable = resourceSharingLevel == "shared"
+
+ if (solutions != null) {
+ if (isSharable && solutions.get("existingNSI")) {
+ //sharedNSISolution
+ processSharedNSISolutions(solutions, execution)
+ }
+ else if(solutions.containsKey("newNSISolution")) {
+ processNewNSISolutions(solutions, execution)
+ }
+ }
+ execution.setVariable("sliceTaskParams", sliceTaskParams)
+ logger.debug("sliceTaskParams: "+sliceTaskParams.convertToJson())
+ logger.debug("*** Completed options Call to OOF ***")
+
+ logger.debug("start parseServiceProfile")
+ parseServiceProfile(execution)
+ logger.debug("end parseServiceProfile")
+ }
+
+
+ private void processNewNSISolutions(Map solutions, DelegateExecution execution) {
+ int index = 0
+ List<Map> newNSISolutions = solutions.get("newNSISolution")
+ List<Map> NSSImap = new ArrayList<>()
+ if (newNSISolutions != null && newNSISolutions.size() > 0) {
+ NSSImap = newNSISolutions.get(index).get("NSSISolutions") as List<Map>
+ for (Map nssi : NSSImap) {
+ Map oofSliceProfile = nssi.get("sliceProfile")
+ String domain = oofSliceProfile.getOrDefault("domainType","")
+ logger.debug("OOF newNSISolutions SliceProfile: " +oofSliceProfile.toString()+",domain:${domain}")
+ if(null != domain){
+ //TODO
+// def nssiSolution = nssi.get("NSSISolution") as Map<String, ?>
+// String nssiName = nssiSolution.getOrDefault("NSSIName", "")
+// String nssiId = nssiSolution.getOrDefault("NSSIId", "")
+// saveNSSIId(nssi, sliceTaskParams)
+ Map<String, Object> sliceProfile = getSliceProfile(domain, execution, oofSliceProfile)
+ saveSliceProfile(execution, domain, sliceProfile)
+
+ }
+ }
+ }
+ }
+
+ private void processSharedNSISolutions(Map solutions, DelegateExecution execution) {
+ String nsiName, nsiInstanceId, nssiId, nssiName
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+
+ Map sharedNSIsolution = ((List) solutions.get("sharedNSISolutions"))?.get(0)
+ nsiInstanceId = sharedNSIsolution.getOrDefault("NSIId", "")
+ nsiName = sharedNSIsolution.getOrDefault("NSIName", "")
+ sliceTaskParams.setSuggestNsiId(nsiInstanceId)
+ sliceTaskParams.setSuggestNsiName(nsiName)
+
+ //Temporary modification
+ List NSSIs = sharedNSIsolution.get("NSSIs")
+ for(Map nssi : NSSIs){
+ Map oofSliceProfile = ((List)nssi.get("sliceProfile"))?.get(0)
+ String domain = oofSliceProfile.getOrDefault("domainType","")
+ nssiId = nssi.getOrDefault("NSSIId","")
+ nssiName = nssi.getOrDefault("NSSIName","")
+ saveNSSIId(domain, nssiId, nssiName,execution)
+ Map<String, Object> sliceProfile = getSliceProfile(domain, execution, oofSliceProfile)
+ saveSliceProfile(execution, domain, sliceProfile)
+ logger.debug("OOF sharedNSISolution SliceProfile:"+oofSliceProfile.toString()+",domain:${domain}")
+ logger.debug("OOF sharedNSISolution nsiInstanceId:${nsiInstanceId}, nsiName:${nsiName}, nssiId:${nssiId}, nssiName:${nssiName}")
+ }
+ }
+
+ private void parseServiceProfile(DelegateExecution execution) {
+ logger.debug("Start parseServiceProfile")
+ String serviceType = execution.getVariable("serviceType")
+ Map<String, Object> serviceProfile = execution.getVariable("serviceProfile")
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ // set sliceProfile for three domains
+ if(!sliceTaskParams.getSliceProfileAn()){
+ Map<String, Object> sliceProfileAn = getSliceProfile( "AN", execution,null)
+ saveSliceProfile(execution,"AN",sliceProfileAn)
+ }
+
+ if(!sliceTaskParams.getSliceProfileTn()){
+ Map<String, Object> sliceProfileTn = getSliceProfile( "TN", execution,null)
+ saveSliceProfile(execution,"TN",sliceProfileTn)
+ }
+
+ if(!sliceTaskParams.getSliceProfileCn()){
+ Map<String, Object> sliceProfileCn = getSliceProfile( "CN", execution,null, )
+ saveSliceProfile(execution,"CN",sliceProfileCn)
+ }
+
+ logger.debug("Finish parseServiceProfile")
+ }
+
+ private void saveSliceProfile(DelegateExecution execution, String domain, Map<String, Object> sliceProfile){
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ if(domain.equalsIgnoreCase("AN")){
+ execution.setVariable("sliceProfileAn", sliceProfile)
+ sliceTaskParams.setSliceProfileAn(sliceProfile)
+ logger.debug("sliceProfileAn: " + sliceProfile)
+ }
+ else if(domain.equalsIgnoreCase("TN")){
+ execution.setVariable("sliceProfileTn", sliceProfile)
+ sliceTaskParams.setSliceProfileTn(sliceProfile)
+ logger.debug("sliceProfileTn: " + sliceProfile)
+ }
+ else if(domain.equalsIgnoreCase("CN")){
+ execution.setVariable("sliceProfileCn", sliceProfile)
+ sliceTaskParams.setSliceProfileCn(sliceProfile)
+ logger.debug("sliceProfileCn: " + sliceProfile)
+ }
+ }
+
+ private void saveNSSIId(String domain, String nssiId, String nssiName, DelegateExecution execution) {
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ if(domain.equalsIgnoreCase("AN")){
+ sliceTaskParams.setAnSuggestNssiId(nssiId)
+ sliceTaskParams.setAnSuggestNssiName(nssiName)
+ }
+ else if(domain.equalsIgnoreCase("CN")){
+ sliceTaskParams.setCnSuggestNssiId(nssiId)
+ sliceTaskParams.setCnSuggestNssiName(nssiName)
+ }
+ else if(domain.equalsIgnoreCase("TN")){
+ sliceTaskParams.setTnSuggestNssiId(nssiId)
+ sliceTaskParams.setTnSuggestNssiName(nssiName)
+ }
+ }
+
+ private Map getSliceProfile(String domain, DelegateExecution execution, Map<String, Object> oofSliceProfile) {
+ String profileMapStr
+ Map<String, Object> serviceProfile = execution.getVariable("serviceProfile")
+ Integer domainLatency = (Integer) serviceProfile.get("latency")/3
+
+ if(domain.equalsIgnoreCase("AN")){
+ profileMapStr = """ {
+ "latency": ${domainLatency},
+ "sNSSAI": "sNSSAI",
+ "uEMobilityLevel": "uEMobilityLevel",
+ "coverageAreaTAList": "coverageAreaTAList",
+ "5QI": 100
+ }"""
+ }
+ else if(domain.equalsIgnoreCase("TN")){
+ profileMapStr =""" {
+ "latency":${domainLatency},
+ "sNSSAI":"sNSSAI",
+ "e2eLatency":"latency",
+ "bandwidth": 100
+ }"""
+ }
+ else if(domain.equalsIgnoreCase("CN")){
+ profileMapStr = """ {
+ "areaTrafficCapDL":"areaTrafficCapDL",
+ "maxNumberofUEs":"maxNumberofUEs",
+ "latency":${domainLatency},
+ "expDataRateUL":"expDataRateUL",
+ "sNSSAI":"sNSSAI",
+ "areaTrafficCapUL":"areaTrafficCapUL",
+ "uEMobilityLevel":"uEMobilityLevel",
+ "expDataRateDL":"expDataRateDL",
+ "activityFactor":"activityFactor",
+ "resourceSharingLevel":"resourceSharingLevel"
+ }"""
+ }
+
+ logger.debug("Profile map for " + domain + " : " + profileMapStr)
+ Map<String, Object> profileMaps = objectMapper.readValue(profileMapStr.trim().replaceAll(" ", ""), new TypeReference<Map<String, String>>(){})
+ Map<String, Object> sliceProfile = [:]
+ for (Map.Entry<String, String> profileMap : profileMaps) {
+ String key = profileMap.key
+ String value = profileMaps.get(key)
+ if(null != oofSliceProfile && oofSliceProfile.keySet().contains(key)){
+ sliceProfile.put(key, oofSliceProfile.get(key))
+ logger.debug("Get from oof, key:${key}, value: ${oofSliceProfile.get(key)}")
+ }
+ else if(serviceProfile.keySet().contains(value)){
+ sliceProfile.put(key, serviceProfile.get(value))
+ }
+ else{
+ sliceProfile.put(key, profileMaps.get(key))
+ }
+ }
+ return sliceProfile
+ }
+
+ void processDecomposition(DelegateExecution execution){
+ logger.debug("Start processDecomposition")
+
+ ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition")
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ String nstName = serviceDecomposition.getModelInfo().getModelName()
+ String nstId = serviceDecomposition.getModelInfo().getModelUuid()
+ sliceTaskParams.setNstName(nstName)
+ sliceTaskParams.setNstId(nstId)
+
+ logger.debug("End processDecomposition")
+ }
+
+
+ void prepareNSTDecompose(DelegateExecution execution) {
+
+ String modelUuid = execution.getVariable("nstModelUuid")
+ String modelInvariantUuid = execution.getVariable("nstModelInvariantUuid")
+
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+ }
+
+ void prepareNSSTDecompose(DelegateExecution execution) {
+ Boolean isMoreNSSTtoProcess = false
+ Integer maxNSST = execution.getVariable("maxNSST")
+ Integer currentNSST=execution.getVariable("currentNSST")
+ List<String> nsstModelUUIDList = new ArrayList<>()
+ nsstModelUUIDList = execution.getVariable("nsstModelUUIDList")
+ String modelUuid = nsstModelUUIDList.get(currentNSST)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+ currentNSST=currentNSST+1
+ if(currentNSST<maxNSST)
+ isMoreNSSTtoProcess=true
+ execution.setVariable("isMoreNSSTtoProcess",isMoreNSSTtoProcess)
+ execution.setVariable("maxNSST",maxNSST)
+ execution.setVariable("currentNSST",currentNSST)
+ }
+
+
+ void prepareNSSTlistfromNST(DelegateExecution execution) {
+ //Need to update this part from decomposition.
+ logger.trace("Enter prepareNSSTlistfromNST()")
+ Boolean isMoreNSSTtoProcess = false
+ ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition")
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ String nstName = serviceDecomposition.getModelInfo().getModelName()
+ sliceTaskParams.setNstName(nstName)
+ String nstId = serviceDecomposition.getModelInfo().getModelUuid()
+ sliceTaskParams.setNstId(nstId)
+ execution.setVariable("sliceTaskParams",sliceTaskParams)
+
+ List<ServiceProxy> proxyList = serviceDecomposition.getServiceProxy()
+ List<String> nsstModelUUIDList = new ArrayList<>()
+ for(ServiceProxy serviceProxy:proxyList)
+ nsstModelUUIDList.add(serviceProxy.getSourceModelUuid())
+ execution.setVariable("nsstModelUUIDList",nsstModelUUIDList)
+ Integer maxNSST = nsstModelUUIDList.size()
+ Integer currentNSST=0
+ execution.setVariable("maxNSST",maxNSST)
+ execution.setVariable("currentNSST",currentNSST)
+ if(currentNSST<maxNSST)
+ isMoreNSSTtoProcess=true
+ execution.setVariable("isMoreNSSTtoProcess",isMoreNSSTtoProcess)
+ logger.trace("Exit prepareNSSTlistfromNST()")
+
+ }
+
+ void getNSSTOption(DelegateExecution execution) {
+ ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition")
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String serviceType = execution.getVariable("subscriptionServiceType")
+ String nssiInstanceId =""
+ String nssiName =""
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams")
+ logger.debug( "get NSI option OOF Url: " + urlString)
+ boolean isNSISuggested = false
+ execution.setVariable("isNSISuggested",isNSISuggested)
+
+ //Prepare auth for OOF - Begin
+ def authHeader = ""
+ String basicAuth = UrnPropertiesReader.getVariable("mso.oof.auth", execution)
+ String msokey = UrnPropertiesReader.getVariable("mso.msoKey", execution)
+
+ String basicAuthValue = utils.encrypt(basicAuth, msokey)
+ if (basicAuthValue != null) {
+ logger.debug( "Obtained BasicAuth username and password for OOF: " + basicAuthValue)
+ try {
+ authHeader = utils.getBasicAuth(basicAuthValue, msokey)
+ execution.setVariable("BasicAuthHeaderValue", authHeader)
+ } catch (Exception ex) {
+ logger.debug( "Unable to encode username and password string: " + ex)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to " +
+ "encode username and password string")
+ }
+ } else {
+ logger.debug( "Unable to obtain BasicAuth - BasicAuth value null")
+ exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth " +
+ "value null")
+ }
+ //Prepare auth for OOF - End
+ //Prepare send request to OOF - Begin
+ String requestId = execution.getVariable("msoRequestId")
+ Map<String, Object> profileInfo = execution.getVariable("serviceProfile")
+ String nsstModelInvariantUuid = serviceDecomposition.getModelInfo().getModelInvariantUuid()
+ String nsstModelUuid = serviceDecomposition.getModelInfo().getModelUuid()
+ String nsstInfo = """"NSSTInfo": {
+ "invariantUUID":"${nsstModelInvariantUuid}",
+ "UUID":"${nsstModelUuid}"
+ }"""
+ String oofRequest = oofUtils.buildSelectNSSIRequest(execution, requestId, nsstInfo ,profileInfo)
+
+
+ URL url = new URL(urlString+"/api/oof/v1/selectnssi")
+ HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.OOF)
+ httpClient.addAdditionalHeader("Authorization", authHeader)
+ Response httpResponse = httpClient.post(oofRequest)
+
+ int responseCode = httpResponse.getStatus()
+ logger.debug("OOF sync response code is: " + responseCode)
+
+ if(responseCode != 200){
+ exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.")
+ }
+
+ if(httpResponse.hasEntity()){
+ String OOFResponse = httpResponse.readEntity(String.class)
+ execution.setVariable("OOFResponse", OOFResponse)
+ nssiInstanceId = jsonUtil.getJsonValue(OOFResponse, "NSSIIInfo.NSSIID")
+ nssiName = jsonUtil.getJsonValue(OOFResponse, "NSSIInfo.NSSIName")
+ execution.setVariable("nssiInstanceId",nssiInstanceId)
+ execution.setVariable("nssiName",nssiName)
+ }
+ if(StringUtils.isBlank(nssiInstanceId)){
+ logger.debug( "There is no valid NSST suggested by OOF.")
+ }else
+ {
+ try {
+ AAIResourcesClient resourceClient = new AAIResourcesClient()
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, nssiInstanceId)
+ AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class)
+ org.onap.aai.domain.yang.ServiceInstance nssi = si.get()
+
+ String domain = nssi.getEnvironmentContext().toString().toUpperCase()
+ switch (domain) {
+ case "AN":
+ sliceTaskParams.setAnSuggestNssiId(nssi.getServiceInstanceId())
+ sliceTaskParams.setAnSuggestNssiName(nssi.getServiceInstanceName())
+ break
+ case "CN":
+ sliceTaskParams.setCnSuggestNssiId(nssi.getServiceInstanceId())
+ sliceTaskParams.setCnSuggestNssiName(nssi.getServiceInstanceName())
+ break
+ case "TN":
+ sliceTaskParams.setTnSuggestNssiId(nssi.getServiceInstanceId())
+ sliceTaskParams.setTnSuggestNssiName(nssi.getServiceInstanceName())
+ break
+ default:
+ break
+ }
+ }catch(NotFoundException e)
+ {
+ logger.debug("NSSI Service Instance not found in AAI: " + nssiInstanceId)
+ }catch(Exception e)
+ {
+ logger.debug("NSSI Service Instance not found in AAI: " + nssiInstanceId)
+ }
+ }
+ logger.debug("Prepare NSSI option completed ")
+ }
+
+
+ /**
+ * new
+ */
+
+ private static final ObjectMapper MAPPER = new ObjectMapper()
+
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ private static final String QUERY_SUB_NET_CAPABILITY = "/api/rest/provMns/v1/NSS/subnetCapabilityQuery"
+
+ private static final String QUERY_NSSI_SELECTION_CAPABILITY = "/api/rest/provMns/v1/NSS/NSSISelectionCapability"
+
+ /**
+ * query Subnet Capability of TN
+ * @param execution
+ */
+ public void queryTNSubnetCapability(DelegateExecution execution) {
+
+ String vendor = execution.getVariable("vendor")
+
+ List<String> subnetTypes = new ArrayList<>()
+ subnetTypes.add("TN_FH")
+ subnetTypes.add("TN_MH")
+ subnetTypes.add("TN_BH")
+
+ String strRequest = MAPPER.writeValueAsString(
+ buildQuerySubnetCapRequest(vendor, subnetTypes, NetworkType.TRANSPORT))
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_SUB_NET_CAPABILITY, strRequest)
+ execution.setVariable("subnetCapabilityOfTN", response)
+ }
+
+ /**
+ * query Subnet Capability of CN
+ * @param execution
+ */
+ public void queryCNSubnetCapability(DelegateExecution execution) {
+
+ String vendor = execution.getVariable("vendor")
+
+ List<String> subnetTypes = new ArrayList<>()
+ subnetTypes.add("CN")
+
+ String strRequest = MAPPER.writeValueAsString(buildQuerySubnetCapRequest(vendor, subnetTypes, NetworkType.CORE))
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_SUB_NET_CAPABILITY, strRequest)
+
+ execution.setVariable("subnetCapabilityOfCN", response)
+ }
+
+ /**
+ * query Subnet Capability of AN
+ * @param execution
+ */
+ public void queryANSubnetCapability(DelegateExecution execution) {
+
+ String vendor = execution.getVariable("vendor")
+
+ List<String> subnetTypes = new ArrayList<>()
+ subnetTypes.add("AN-NF")
+
+ String strRequest = MAPPER.writeValueAsString(buildQuerySubnetCapRequest(vendor, subnetTypes, NetworkType.ACCESS))
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_SUB_NET_CAPABILITY, strRequest)
+
+ execution.setVariable("subnetCapabilityOfAN", response)
+ }
+
+ /**
+ * build request body for querying Subnet Capability
+ * @param vendor
+ * @param subnetTypes
+ * @param networkType
+ * @return
+ */
+ private static String buildQuerySubnetCapRequest(String vendor, List<String> subnetTypes, NetworkType networkType) {
+ NssmfAdapterNBIRequest request = new NssmfAdapterNBIRequest()
+
+ Map<String, Object> paramMap = new HashMap()
+ paramMap.put("subnetTypes", subnetTypes)
+
+ request.setSubnetCapabilityQuery(MAPPER.writeValueAsString(paramMap))
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setVendor(vendor)
+ esrInfo.setNetworkType(networkType)
+
+ request.setEsrInfo(esrInfo)
+
+ String strRequest = MAPPER.writeValueAsString(request)
+
+ return strRequest
+ }
+
+ /**
+ * handle response of Subnet Capability, generate SubnetCapabilities Info for request to oof
+ * @param execution
+ */
+ public void generateSubnetCapabilities(DelegateExecution execution) {
+ //todo:
+ execution.setVariable("subnetCapabilities", [])
+ }
+
+ /**
+ * prepare the params for decompose nst
+ * @param execution
+ */
+ public void prepareDecomposeNST(DelegateExecution execution) {
+
+ String modelUuid = execution.getVariable("nstModelUuid")
+ String modelInvariantUuid = execution.getVariable("nstModelInvariantUuid")
+
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("nstServiceModelInfo", serviceModelInfo)
+ }
+
+ /**
+ * process the result of NST Decomposition
+ * @param execution
+ */
+ public void processDecompositionNST(DelegateExecution execution) {
+
+ ServiceDecomposition nstServiceDecomposition = execution.getVariable("nstServiceDecomposition")
+ //todo:
+
+ }
+
+
+ /**
+ * prepare the params for decompose nsst
+ * @param execution
+ */
+ public void prepareDecomposeNSST(DelegateExecution execution) {
+ Boolean isMoreNSSTtoProcess = false
+ def maxNSST = execution.getVariable("maxNSST") as Integer
+ def currentNSST = execution.getVariable("currentNSST") as Integer
+ def nsstModelUUIDList = execution.getVariable("nsstModelUUIDList") as List
+ String modelUuid = nsstModelUUIDList.get(currentNSST)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("nsstServiceModelInfo", serviceModelInfo)
+ currentNSST = currentNSST + 1
+
+ if(currentNSST < maxNSST) {
+ isMoreNSSTtoProcess = true
+ }
+
+ execution.setVariable("isMoreNSSTtoProcess", isMoreNSSTtoProcess)
+ execution.setVariable("maxNSST", maxNSST)
+ execution.setVariable("currentNSST", currentNSST)
+
+ //todo:
+ }
+
+ /**
+ * process the result of NSST Decomposition
+ * @param execution
+ */
+ public void processDecompositionNSST(DelegateExecution execution) {
+ ServiceDecomposition nsstServiceDecomposition = execution.getVariable("nsstServiceDecomposition")
+ //todo:
+ }
+
+ /**
+ * todo: need rewrite
+ * prepare select nsi request
+ * @param execution
+ */
+ public void preNSIRequest(DelegateExecution execution) {
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSI option OOF Url: " + urlString)
+
+ boolean isNSISuggested = true
+ execution.setVariable("isNSISuggested", isNSISuggested)
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+
+ ServiceProfile profileInfo = execution.getVariable("serviceProfile") as ServiceProfile
+ Map<String, Object> nstSolution = execution.getVariable("nstSolution") as Map
+ logger.debug("Get NST selection from OOF: " + nstSolution.toString())
+
+ execution.setVariable("nsiSelectionUrl", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nsiSelection_messageType", messageType)
+ execution.setVariable("nsiSelection_correlator", requestId)
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution)
+ execution.setVariable("nsiSelection_timeout", timeout)
+
+
+ TemplateInfo nstInfo = new TemplateInfo()
+ nstInfo.setInvariantUUID(nstSolution.get("invariantUUID") as String)
+ nstInfo.setUUID(nstSolution.get("UUID") as String)
+ nstInfo.setName(nstSolution.get("NSTName") as String)
+
+ execution.setVariable("NSTInfo", nstInfo)
+
+ List<TemplateInfo> nsstInfos = execution.getVariable("NSSTInfos") as List<TemplateInfo>
+
+ List<SubnetCapability> subnetCapabilities = execution.getVariable("subnetCapabilities") as List<SubnetCapability>
+
+ String oofRequest = oofUtils.buildSelectNSIRequest(requestId, nstInfo, nsstInfos,
+ messageType, profileInfo, subnetCapabilities, timeout as Integer)
+
+ execution.setVariable("nsiSelection_oofRequest", oofRequest)
+ logger.debug("Sending request to OOF: " + oofRequest)
+ }
+
+ /**
+ * todo: need rewrite
+ * process select nsi response
+ * @param execution
+ */
+ public void processNSIResp(DelegateExecution execution) {
+
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") as SliceTaskParams
+ String OOFResponse = execution.getVariable("nsiSelection_oofResponse")
+ logger.debug("NSI OOFResponse is: " + OOFResponse)
+ execution.setVariable("OOFResponse", OOFResponse)
+ //This needs to be changed to derive a value when we add policy to decide the solution options.
+
+ Map<String, Object> resMap = objectMapper.readValue(OOFResponse, Map.class)
+ List<Map<String, Object>> nsiSolutions = (List<Map<String, Object>>) resMap.get("solutions")
+ Map<String, Object> solutions = nsiSolutions.get(0)
+
+ String resourceSharingLevel = execution.getVariable("resourceSharingLevel")
+ Boolean isSharable = resourceSharingLevel == "shared"
+
+ if (solutions != null) {
+ if (isSharable && solutions.get("existingNSI")) {
+ //sharedNSISolution
+ processSharedNSISolutions(solutions, execution)
+ }
+ else if(solutions.containsKey("newNSISolution")) {
+ processNewNSISolutions(solutions, execution)
+ }
+ }
+ execution.setVariable("sliceTaskParams", sliceTaskParams)
+ logger.debug("sliceTaskParams: " + sliceTaskParams.convertToJson())
+ logger.debug("*** Completed options Call to OOF ***")
+
+ logger.debug("start parseServiceProfile")
+ parseServiceProfile(execution)
+ logger.debug("end parseServiceProfile")
+ }
+
+ /**
+ * get NSSI Selection Capability for AN
+ * @param execution
+ */
+ public void getNSSISelectionCap4AN(DelegateExecution execution) {
+
+ def vendor = execution.getVariable("vendor") as String
+
+ String strRequest = buildNSSISelectionReq(vendor, NetworkType.ACCESS)
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_NSSI_SELECTION_CAPABILITY, strRequest)
+
+ Map<String, Object> resMap = objectMapper.readValue(response, Map.class)
+
+ String selection = resMap.get("selection")
+
+
+ if ("NSMF".equalsIgnoreCase(selection)) {
+ execution.setVariable("NEED_AN_NSSI_SELECTION", true)
+ }
+ }
+
+ /**
+ * get NSSI Selection Capability for TN
+ * @param execution
+ */
+ public void getNSSISelectionCap4TN(DelegateExecution execution) {
+
+ def vendor = execution.getVariable("vendor") as String
+
+ String strRequest = buildNSSISelectionReq(vendor, NetworkType.TRANSPORT)
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_NSSI_SELECTION_CAPABILITY, strRequest)
+
+ Map<String, Object> resMap = objectMapper.readValue(response, Map.class)
+
+ String selection = resMap.get("selection")
+
+ if ("NSMF".equalsIgnoreCase(selection)) {
+ execution.setVariable("NEED_TN_NSSI_SELECTION", true)
+ }
+ }
+
+ /**
+ * get NSSI Selection Capability for CN
+ * @param execution
+ */
+ public void getNSSISelectionCap4CN(DelegateExecution execution) {
+
+ def vendor = execution.getVariable("vendor") as String
+
+ String strRequest = buildNSSISelectionReq(vendor, NetworkType.CORE)
+
+ String response = nssmfAdapterUtils.sendPostRequestNSSMF(execution, QUERY_NSSI_SELECTION_CAPABILITY, strRequest)
+
+ Map<String, Object> resMap = objectMapper.readValue(response, Map.class)
+
+ String selection = resMap.get("selection")
+
+ if ("NSMF".equalsIgnoreCase(selection)) {
+ execution.setVariable("NEED_CN_NSSI_SELECTION", true)
+ }
+ }
+
+ /**
+ * build NSSI Selection Capability Request body to nssmf adapter
+ * @param vendor
+ * @param networkType
+ * @return
+ */
+ private static String buildNSSISelectionReq(String vendor, NetworkType networkType) {
+ NssmfAdapterNBIRequest request = new NssmfAdapterNBIRequest()
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setVendor(vendor)
+ esrInfo.setNetworkType(networkType)
+ request.setEsrInfo(esrInfo)
+
+ return MAPPER.writeValueAsString(request)
+ }
+
+ /**
+ * if exist nssi need to select?
+ * @param execution
+ */
+ public void handleNssiSelect(DelegateExecution execution) {
+
+ SliceTaskParamsAdapter sliceTaskParams =
+ execution.getVariable("sliceTaskParams") as SliceTaskParamsAdapter
+
+ execution.setVariable()
+ }
+
+ /**
+ * todo: need rewrite
+ * prepare select nssi request
+ * @param execution
+ */
+ public void preNSSIRequest(DelegateExecution execution) {
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSI option OOF Url: " + urlString)
+
+ boolean isNSISuggested = true
+ execution.setVariable("isNSISuggested", isNSISuggested)
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+
+ Map<String, Object> profileInfo = execution.getVariable("serviceProfile") as Map
+ Map<String, Object> nstSolution = execution.getVariable("nstSolution") as Map
+ logger.debug("Get NST selection from OOF: " + nstSolution.toString())
+ String nstInfo = """{
+ "modelInvariantId":"${nstSolution.invariantUUID}",
+ "modelVersionId":"${nstSolution.UUID}",
+ "modelName":"${nstSolution.NSTName}"
+ }"""
+
+ execution.setVariable("nsiSelectionUrl", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nsiSelection_messageType", messageType)
+ execution.setVariable("nsiSelection_correlator", requestId)
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution)
+ execution.setVariable("nsiSelection_timeout", timeout)
+
+ //todo
+ String oofRequest = oofUtils.buildSelectNSIRequest(requestId, nstInfo, messageType, profileInfo)
+
+ execution.setVariable("nsiSelection_oofRequest", oofRequest)
+ logger.debug("Sending request to OOF: " + oofRequest)
+ }
+
+ /**
+ * process select nssi response
+ * @param execution
+ */
+ public void processNSSIResp(DelegateExecution execution) {
+
+ SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") as SliceTaskParams
+ String OOFResponse = execution.getVariable("nsiSelection_oofResponse")
+ logger.debug("NSI OOFResponse is: " + OOFResponse)
+ execution.setVariable("OOFResponse", OOFResponse)
+ //This needs to be changed to derive a value when we add policy to decide the solution options.
+
+ Map<String, Object> resMap = objectMapper.readValue(OOFResponse, Map.class)
+ List<Map<String, Object>> nsiSolutions = (List<Map<String, Object>>) resMap.get("solutions")
+ Map<String, Object> solutions = nsiSolutions.get(0)
+
+ String resourceSharingLevel = execution.getVariable("resourceSharingLevel")
+ Boolean isSharable = resourceSharingLevel == "shared"
+
+ if (solutions != null) {
+ if (isSharable && solutions.get("existingNSI")) {
+ //sharedNSISolution
+ processSharedNSISolutions(solutions, execution)
+ }
+ else if(solutions.containsKey("newNSISolution")) {
+ processNewNSISolutions(solutions, execution)
+ }
+ }
+ execution.setVariable("sliceTaskParams", sliceTaskParams)
+ logger.debug("sliceTaskParams: "+sliceTaskParams.convertToJson())
+ logger.debug("*** Completed options Call to OOF ***")
+
+ logger.debug("start parseServiceProfile")
+ parseServiceProfile(execution)
+ logger.debug("end parseServiceProfile")
+ }
+
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy
new file mode 100644
index 0000000000..534467f6ab
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateTnNssiInstance.groovy
@@ -0,0 +1,231 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.SliceProfile
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+class DoCreateTnNssiInstance extends AbstractServiceTaskProcessor {
+
+ private static final Logger logger = LoggerFactory.getLogger(DoCreateTnNssiInstance.class);
+ JsonUtils jsonUtil = new JsonUtils()
+ TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ String Prefix = "DCTN_"
+
+ void preProcessRequest(DelegateExecution execution) {
+ String msg = ""
+ logger.trace("Enter preProcessRequest()")
+
+ execution.setVariable("prefix", Prefix)
+
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ //here modelVersion is not set, we use modelUuid to decompose the service.
+ def isDebugLogEnabled = true
+ execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+
+ logger.trace("Exit preProcessRequest")
+ }
+
+
+ void createSliceProfile(DelegateExecution execution) {
+
+ String sliceserviceInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String sliceProfileStr = execution.getVariable("sliceProfile")
+ String sliceProfileId = UUID.randomUUID().toString()
+ SliceProfile sliceProfile = new SliceProfile();
+ sliceProfile.setProfileId(sliceProfileId)
+ sliceProfile.setLatency(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "latency")))
+ sliceProfile.setResourceSharingLevel(jsonUtil.getJsonValue(sliceProfileStr, "resourceSharingLevel"))
+ sliceProfile.setSNssai(tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr)) //TODO: should be list
+
+ sliceProfile.setE2ELatency(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "latency")))
+ sliceProfile.setMaxBandwidth(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "maxBandwidth")))
+
+ //TODO: new API
+ sliceProfile.setReliability(new Object())
+ try {
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SLICE_PROFILE, execution.getVariable
+ ("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"), sliceserviceInstanceId, sliceProfileId)
+ client.create(uri, sliceProfile)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in DoCreateSliceServiceInstance.instantiateSliceService. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+
+ void createServiceInstance(DelegateExecution execution) {
+
+ String serviceRole = "TN"
+ String serviceType = execution.getVariable("subscriptionServiceType")
+ String ssInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String sliceProfileStr = execution.getVariable("sliceProfile")
+ try {
+ org.onap.aai.domain.yang.ServiceInstance ss = new org.onap.aai.domain.yang.ServiceInstance()
+ ss.setServiceInstanceId(ssInstanceId)
+ String sliceInstanceName = execution.getVariable("sliceServiceInstanceName")
+ ss.setServiceInstanceName(sliceInstanceName)
+ ss.setServiceType(serviceType)
+ String serviceStatus = "allocated"
+ ss.setOrchestrationStatus(serviceStatus)
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ ss.setModelInvariantId(modelInvariantUuid)
+ ss.setModelVersionId(modelUuid)
+ String serviceInstanceLocationid = tnNssmfUtils.getFirstPlmnIdFromSliceProfile(sliceProfileStr)
+ ss.setServiceInstanceLocationId(serviceInstanceLocationid)
+ String snssai = tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr)
+ ss.setEnvironmentContext(snssai)
+ ss.setServiceRole(serviceRole)
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), ssInstanceId)
+ client.create(uri, ss)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in DoCreateTnNssiInstance.createServiceInstance. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+
+ void createAllottedResource(DelegateExecution execution) {
+ String serviceInstanceId = execution.getVariable('sliceServiceInstanceId')
+
+ AAIResourcesClient resourceClient = getAAIClient()
+ AAIResourceUri ssServiceuri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
+
+ try {
+ List<String> networkStrList = jsonUtil.StringArrayToList(execution.getVariable("transportSliceNetworks"))
+
+ for (String networkStr : networkStrList) {
+ String allottedResourceId = UUID.randomUUID().toString()
+ AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE,
+ execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("sliceserviceInstanceId"), allottedResourceId)
+ execution.setVariable("allottedResourceUri", allottedResourceUri)
+ String modelInvariantId = execution.getVariable("modelInvariantUuid")
+ String modelVersionId = execution.getVariable("modelUuid")
+
+ org.onap.aai.domain.yang.AllottedResource resource = new org.onap.aai.domain.yang.AllottedResource()
+ resource.setId(allottedResourceId)
+ resource.setType("TsciNetwork")
+ resource.setAllottedResourceName("network_" + execution.getVariable("sliceServiceInstanceName"))
+ resource.setModelInvariantId(modelInvariantId)
+ resource.setModelVersionId(modelVersionId)
+ getAAIClient().create(allottedResourceUri, resource)
+ //AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceFromExistingURI(AAIObjectType.SERVICE_INSTANCE, UriBuilder.fromPath(ssServiceuri).build())
+ //getAAIClient().connect(allottedResourceUri,ssServiceuri)
+ //execution.setVariable("aaiARPath", allottedResourceUri.build().toString());
+
+ String linkArrayStr = jsonUtil.getJsonValue(networkStr, "connectionLinks")
+ createLogicalLinksForAllocatedResource(execution, linkArrayStr, serviceInstanceId, allottedResourceId)
+ }
+
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Exception in createAaiAR " + ex.getMessage())
+ }
+ }
+
+ void createLogicalLinksForAllocatedResource(DelegateExecution execution,
+ String linkArrayStr, String serviceInstanceId,
+ String allottedResourceId) {
+
+ try {
+ List<String> linkStrList = jsonUtil.StringArrayToList(linkArrayStr)
+
+ for (String linkStr : linkStrList) {
+ String logicalLinkId = UUID.randomUUID().toString()
+ String epA = jsonUtil.getJsonValue(linkStr, "transportEndpointA")
+ String epB = jsonUtil.getJsonValue(linkStr, "transportEndpointB")
+ String modelInvariantId = execution.getVariable("modelInvariantUuid")
+ String modelVersionId = execution.getVariable("modelUuid")
+
+ org.onap.aai.domain.yang.LogicalLink resource = new org.onap.aai.domain.yang.LogicalLink()
+ resource.setLinkId(logicalLinkId)
+ resource.setLinkName(epA)
+ resource.setLinkName2(epB)
+ resource.setModelInvariantId(modelInvariantId)
+ resource.setModelVersionId(modelVersionId)
+
+ AAIResourceUri logicalLinkUri = AAIUriFactory.createResourceUri(AAIObjectType.LOGICAL_LINK, logicalLinkId)
+ getAAIClient().create(logicalLinkUri, resource)
+ }
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,
+ "Exception in createLogicalLinksForAllocatedResource" + ex.getMessage())
+ }
+ }
+
+ void preprocessSdncAllocateTnNssiRequest(DelegateExecution execution) {
+ def method = getClass().getSimpleName() + '.preProcessSDNCActivateRequest(' +
+ 'execution=' + execution.getId() +
+ ')'
+ def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
+ logger.trace('Entered ' + method)
+
+ logger.trace("STARTED preProcessSDNCActivateRequest Process")
+ try {
+ String serviceInstanceId = execution.getVariable("sliceServiceInstanceId")
+
+ String createSDNCRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "create")
+
+ execution.setVariable("TNNSSMF_SDNCRequest", createSDNCRequest)
+ logger.debug("Outgoing SDNCRequest is: \n" + createSDNCRequest)
+
+ } catch (Exception e) {
+ logger.debug("Exception Occured Processing preProcessSDNCActivateRequest. Exception is:\n" + e)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1002,
+ "Error Occured during preProcessSDNCActivateRequest Method:\n" + e.getMessage())
+ }
+ logger.trace("COMPLETED preProcessSDNCActivateRequest Process")
+ }
+
+
+ void validateSDNCResponse(DelegateExecution execution, String response, String method) {
+ tnNssmfUtils.validateSDNCResponse(execution, response, method)
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeAllocateAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeAllocateAccessNSSI.groovy
new file mode 100644
index 0000000000..2ca0da4cbb
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeAllocateAccessNSSI.groovy
@@ -0,0 +1,556 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Wipro Limited. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+import javax.ws.rs.NotFoundException
+import javax.ws.rs.core.Response
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.*
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.logging.filter.base.ONAPComponents
+import org.onap.so.beans.nsmf.DeAllocateNssi
+import org.onap.so.beans.nsmf.EsrInfo
+import org.onap.so.beans.nsmf.ServiceInfo
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.OofUtils
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.client.HttpClient
+import org.onap.so.client.HttpClientFactory
+import org.onap.so.client.oof.adapter.beans.payload.OofRequest
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonObject
+
+/**
+ * Internal AN NSSMF to handle NSSI Deallocation
+ */
+class DoDeAllocateAccessNSSI extends AbstractServiceTaskProcessor {
+
+ String Prefix="DoDeAllocateAccessNSSI"
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ OofUtils oofUtils = new OofUtils()
+ ObjectMapper objectMapper = new ObjectMapper()
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ private static final Logger logger = LoggerFactory.getLogger(DoDeAllocateAccessNSSI.class)
+ private static final String ROLE_SLICE_PROFILE = "slice-profile-instance"
+ private static final String ROLE_NSSI = "nssi"
+
+ private static final String AN_NF = "AN-NF"
+ private static final String TN_FH = "TN-FH"
+ private static final String TN_MH = "TN-MH"
+
+ @Override
+ public void preProcessRequest(DelegateExecution execution) {
+ logger.debug("${Prefix} - Start preProcessRequest")
+
+ String sliceParams = execution.getVariable("sliceParams")
+ String sNssaiList = jsonUtil.getJsonValue(sliceParams, "snssaiList")
+ String anSliceProfileId = jsonUtil.getJsonValue(sliceParams, "sliceProfileId")
+ String nsiId = jsonUtil.getJsonValue(sliceParams, "nsiId")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ String anNssiId = execution.getVariable("serviceInstanceID")
+
+ if(isBlank(sNssaiList) || isBlank(anSliceProfileId) || isBlank(nsiId)) {
+ String msg = "Input fields cannot be null : Mandatory attributes : [snssaiList, sliceProfileId, nsiId]"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ if( isBlank(anNssiId) || isBlank(globalSubscriberId) || isBlank(subscriptionServiceType)) {
+ String msg = "Missing Input fields from main process : [serviceInstanceID, globalSubscriberId, subscriptionServiceType]"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ execution.setVariable("sNssaiList", sNssaiList)
+ execution.setVariable("anSliceProfileId", anSliceProfileId)
+ execution.setVariable("nsiId", nsiId)
+ execution.setVariable("anNssiId", anNssiId)
+
+ logger.debug("${Prefix} - Preprocessing completed with sliceProfileId : ${anSliceProfileId} , nsiId : ${nsiId} , nssiId : ${anNssiId}")
+ }
+
+ /**
+ * Method to fetch AN NSSI Constituents and Slice Profile constituents
+ * @param execution
+ */
+ void getRelatedInstances(DelegateExecution execution) {
+ logger.debug("${Prefix} - Get Related Instances")
+ String anSliceProfileId = execution.getVariable("anSliceProfileId")
+ String anNssiId = execution.getVariable("anNssiId")
+
+ Map<String,ServiceInstance> relatedSPs = new HashMap<>()
+ execution.setVariable("relatedSPs", getRelatedInstancesByRole(execution, ROLE_SLICE_PROFILE, anSliceProfileId))
+ execution.setVariable("anNfSliceProfileId", getInstanceIdByWorkloadContext(execution.getVariable("relatedSPs"), AN_NF))
+
+ Map<String,ServiceInstance> relatedNssis = new HashMap<>()
+ execution.setVariable("relatedNssis", getRelatedInstancesByRole(execution, ROLE_NSSI, anNssiId))
+ }
+
+
+ /**
+ * @param execution
+ */
+ void prepareOOFAnNssiTerminationRequest(DelegateExecution execution) {
+ logger.debug("Start prepareOOFTerminationRequest")
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "AN_NSSITermination"
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ String serviceInstanceId = execution.getVariable("nsiId")
+ String anNssiId = execution.getVariable("anNssiId")
+ String oofRequest = oofUtils.buildTerminateNxiRequest(requestId,anNssiId, ROLE_NSSI,messageType,serviceInstanceId)
+ OofRequest oofPayload = new OofRequest()
+ oofPayload.setApiPath("/api/oof/terminate/nxi/v1")
+ oofPayload.setRequestDetails(oofRequest)
+ execution.setVariable("oofAnNssiPayload", oofPayload)
+ logger.debug("Finish prepareOOFTerminationRequest")
+
+ }
+
+ void performOofAnNSSITerminationCall(DelegateExecution execution) {
+ boolean terminateAnNSSI = callOofAdapter(execution,execution.getVariable("oofAnNssiPayload"))
+ execution.setVariable("terminateAnNSSI", terminateAnNSSI)
+ }
+
+ /**
+ * @param execution
+ */
+ void prepareOOFAnNfNssiTerminationRequest(DelegateExecution execution) {
+ logger.debug("Start prepareOOFAnNfNssiTerminationRequest")
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "AN_NF_NSSITermination"
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ String serviceInstanceId = execution.getVariable("anNssiId")
+
+ String anNfNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"),AN_NF)
+ execution.setVariable("anNfNssiId", anNfNssiId)
+
+ String oofRequest = oofUtils.buildTerminateNxiRequest(requestId,anNfNssiId, ROLE_NSSI,messageType,serviceInstanceId)
+ OofRequest oofPayload = new OofRequest()
+ oofPayload.setApiPath("/api/oof/terminate/nxi/v1")
+ oofPayload.setRequestDetails(oofRequest)
+ execution.setVariable("oofAnNfNssiPayload", oofPayload)
+ logger.debug("Finish prepareOOFAnNfNssiTerminationRequest")
+
+ }
+
+ void performOofAnNfNSSITerminationCall(DelegateExecution execution) {
+ boolean terminateAnNfNSSI = callOofAdapter(execution,execution.getVariable("oofAnNfNssiPayload"))
+ execution.setVariable("terminateAnNfNSSI", terminateAnNfNSSI)
+ if(!terminateAnNfNSSI) {
+ execution.setVariable("modifyAction",true)
+ }
+ }
+
+ void prepareSdnrRequest(DelegateExecution execution) {
+
+ String anNfNssiId = execution.getVariable("anNfNssiId")
+ String sNssai = execution.getVariable("sNssaiList")
+ String reqId = execution.getVariable("msoRequestId")
+ String messageType = "SDNRTerminateResponse"
+ StringBuilder callbackURL = new StringBuilder(UrnPropertiesReader.getVariable("mso.workflow.message.endpoint", execution))
+ callbackURL.append("/").append(messageType).append("/").append(reqId)
+
+ JsonObject input = new JsonObject()
+ input.addProperty("RANNFNSSIId", anNfNssiId)
+ input.addProperty("callbackURL", callbackURL.toString())
+ input.addProperty("s-NSSAI", sNssai)
+
+ JsonObject Payload = new JsonObject()
+ Payload.addProperty("version", "1.0")
+ Payload.addProperty("rpc-name", "TerminateRANSlice")
+ Payload.addProperty("correlation-id", reqId)
+ Payload.addProperty("type", "request")
+
+ JsonObject wrapinput = new JsonObject()
+ wrapinput.addProperty("Action", "deallocate")
+
+ JsonObject CommonHeader = new JsonObject()
+ CommonHeader.addProperty("TimeStamp", new Date(System.currentTimeMillis()).format("yyyy-MM-ddTHH:mm:ss.sss", TimeZone.getDefault()))
+ CommonHeader.addProperty("APIver", "1.0")
+ CommonHeader.addProperty("RequestID", reqId)
+ CommonHeader.addProperty("SubRequestID", "1")
+
+ JsonObject body = new JsonObject()
+ body.add("input", wrapinput)
+
+ JsonObject sdnrRequest = new JsonObject()
+ Payload.add("input", input)
+ wrapinput.add("Payload", Payload)
+ wrapinput.add("CommonHeader", CommonHeader)
+ body.add("input", wrapinput)
+ sdnrRequest.add("body", body)
+
+ String json = sdnrRequest.toString()
+ execution.setVariable("sdnrRequest", sdnrRequest)
+ execution.setVariable("SDNR_messageType", messageType)
+ execution.setVariable("SDNR_timeout", "PT10M")
+
+ }
+
+ void processSdnrResponse(DelegateExecution execution) {
+ logger.debug("${Prefix} processing SdnrResponse")
+ Map<String, Object> resMap = objectMapper.readValue(execution.getVariable("SDNR_Response"),Map.class)
+ String status = resMap.get("status")
+ String reason = resMap.get("reason")
+ if("success".equalsIgnoreCase(status)) {
+ execution.setVariable("isAnNfTerminated", true)
+ }else {
+ execution.setVariable("isAnNfTerminated", false)
+ logger.debug("AN NF Termination failed with reason ${reason}")
+ }
+ logger.debug("${Prefix} processed SdnrResponse")
+ }
+
+ /**
+ * @param execution
+ * @param oofRequest - Request payload to be sent to adapter
+ * @return
+ */
+ boolean callOofAdapter(DelegateExecution execution, OofRequest oofRequest) {
+ logger.debug("Start callOofAdapter")
+ String requestId = execution.getVariable("msoRequestId")
+ String oofAdapterEndpoint = UrnPropertiesReader.getVariable("mso.adapters.oof.endpoint", execution)
+ URL requestUrl = new URL(oofAdapterEndpoint)
+ logger.debug("Calling OOF adapter : ${requestUrl} with payload : ${oofRequest}")
+ HttpClient httpClient = new HttpClientFactory().newJsonClient(requestUrl, ONAPComponents.EXTERNAL)
+ Response httpResponse = httpClient.post(oofRequest)
+ int responseCode = httpResponse.getStatus()
+ logger.debug("OOF sync response code is: " + responseCode)
+ if(responseCode != 200){
+ logger.debug("OOF request failed with reason : " + httpResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.")
+ }else {
+ Map<String,Object> response = objectMapper.readValue(httpResponse.getEntity(),Map.class)
+ boolean terminateResponse = response.get("terminateResponse")
+ if(!terminateResponse) {
+ logger.debug("Terminate response is false because " + response.get("reason"))
+ }
+ return terminateResponse
+ }
+ }
+
+ void deallocateAnNfNssi(DelegateExecution execution) {
+ logger.debug("${Prefix} - call deallocateAnNfNssi ")
+ String anNfNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), AN_NF)
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, anNfNssiId)
+ if (!client.exists(uri)) {
+ logger.debug("AN NF Service Instance was not found in aai : ${anNfNssiId}")
+ }else {
+ client.delete(uri)
+ }
+ }
+
+ /**
+ * Removes relationship between AN NSSI and AN_NF NSSI
+ * @param execution
+ */
+ void dissociateAnNfNssi(DelegateExecution execution) {
+ logger.debug("${Prefix} - call dissociateAnNfNssi ")
+ String anNfNssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), AN_NF)
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, anNfNssiId)
+ if (!client.exists(uri)) {
+ logger.debug("AN NF Service Instance was not found in aai : ${anNfNssiId}")
+ }else {
+ client.delete(uri)
+ }
+ }
+
+ /**
+ * Method to prepare request for AN NSSI modification
+ * Call Modify AN NSSI in case OOF sends Terminate NSSI=False
+ * @param execution
+ */
+ void preparejobForANNSSIModification(DelegateExecution execution) {
+
+ String modificationJobId = UUID.randomUUID().toString()
+ execution.setVariable("modificationJobId", modificationJobId)
+
+ Map<String,Object> sliceParams = objectMapper.readValue(execution.getVariable("sliceParams"), Map.class)
+ sliceParams.put("modifyAction", "deallocate")
+ execution.setVariable("modificationsliceParams", sliceParams)
+
+ String serviceId = execution.getVariable("serviceInstanceId")
+ String nsiId = execution.getVariable("nsiId")
+ logger.debug("Generated new job for Service Instance serviceId:" + serviceId + " operationId:" + modificationJobId)
+
+ ResourceOperationStatus initStatus = new ResourceOperationStatus()
+ initStatus.setServiceId(serviceId)
+ initStatus.setOperationId(modificationJobId)
+ initStatus.setResourceTemplateUUID(nsiId)
+ initStatus.setOperType("Modify-Deallocate")
+ requestDBUtil.prepareInitResourceOperationStatus(execution, initStatus)
+
+ logger.debug(Prefix + "prepareInitOperationStatus Exit")
+ }
+
+ void prepareQueryJobStatus(DelegateExecution execution,String jobId,String networkType,String instanceId) {
+
+ String responseId = "1"
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType(networkType)
+ esrInfo.setVendor("ONAP")
+
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.setNssiId(instanceId)
+ serviceInfo.setNsiId(execution.getVariable("nsiId"))
+ serviceInfo.setGlobalSubscriberId(globalSubscriberId)
+ serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
+
+ execution.setVariable("${networkType}_esrInfo", esrInfo)
+ execution.setVariable("${networkType}_responseId", responseId)
+ execution.setVariable("${networkType}_serviceInfo", serviceInfo)
+
+ }
+
+ void validateJobStatus(DelegateExecution execution,String responseDescriptor) {
+ logger.debug("validateJobStatus ${responseDescriptor}")
+ String status = jsonUtil.getJsonValue(responseDescriptor, "responseDescriptor.status")
+ String statusDescription = jsonUtil.getJsonValue(responseDescriptor, "responseDescriptor.statusDescription")
+ if("finished".equalsIgnoreCase(status)) {
+ execution.setVariable("isSuccess", true)
+ }else {
+ execution.setVariable("isSuccess", false)
+ }
+ }
+
+ void prepareUpdateJobStatus(DelegateExecution execution,String status,String progress,String statusDescription) {
+ String serviceId = execution.getVariable("anNssiId")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType("DeAllocate")
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+
+ void terminateTNFHNssi(DelegateExecution execution) {
+ logger.debug("Start terminateTNFHNssi in ${Prefix}")
+ String nssmfRequest = buildDeallocateNssiRequest(execution, TN_FH)
+ String nssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), TN_FH)
+ execution.setVariable("tnFHNSSIId", nssiId)
+ String urlString = "/api/rest/provMns/v1/NSS/nssi/" + nssiId
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_FH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit terminateTNFHNssi in ${Prefix}")
+ }
+
+ void terminateTNMHNssi(DelegateExecution execution) {
+ logger.debug("Start terminateTNMHNssi in ${Prefix}")
+ String nssmfRequest = buildDeallocateNssiRequest(execution, TN_MH)
+ String nssiId = getInstanceIdByWorkloadContext(execution.getVariable("relatedNssis"), TN_MH)
+ execution.setVariable("tnMHNSSIId", nssiId)
+ String urlString = "/api/rest/provMns/v1/NSS/nssi/" + nssiId
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_MH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit terminateTNMHNssi in ${Prefix}")
+ }
+
+ void deleteRanNfSliceProfileInAAI(DelegateExecution execution) {
+ logger.debug("${Prefix} delete Ran NF SliceProfile In AAI")
+ String spId = execution.getVariable("anNfSliceProfileId")
+ deleteServiceInstanceInAAI(execution, spId)
+ }
+
+ void deleteTNSliceProfileInAAI(DelegateExecution execution) {
+ logger.debug("${Prefix} delete TN FH SliceProfile In AAI")
+ String fhSP = getInstanceIdByWorkloadContext(execution.getVariable("relatedSPs"), TN_FH)
+ deleteServiceInstanceInAAI(execution, fhSP)
+ logger.debug("${Prefix} delete TN MH SliceProfile In AAI")
+ String mhSP = getInstanceIdByWorkloadContext(execution.getVariable("relatedSPs"), TN_MH)
+ deleteServiceInstanceInAAI(execution, mhSP)
+ }
+
+ void deleteANNSSI(DelegateExecution execution) {
+ logger.debug("${Prefix} delete AN NSSI")
+ String nssiId = execution.getVariable("serviceInstanceID")
+ deleteServiceInstanceInAAI(execution, nssiId)
+ }
+
+ /**
+ * Fetches a collection of service instances with the specific role and maps it based on workload context
+ * (AN-NF,TN-FH,TN-MH)
+ * @param execution
+ * @param role - nssi/slice profile instance
+ * @param instanceId - id to which the related list to be found
+ * @return
+ */
+ private Map<String,ServiceInstance> getRelatedInstancesByRole(DelegateExecution execution,String role,String instanceId) {
+ logger.debug("${Prefix} - Fetching related ${role} from AAI")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ if( isBlank(role) || isBlank(instanceId)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Role and instanceId are mandatory")
+ }
+
+ Map<String,ServiceInstance> relatedInstances = new HashMap<>()
+
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, instanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai : ${instanceId}")
+ }
+ AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+ if(si.isPresent()) {
+ List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
+ for (Relationship relationship : relationshipList) {
+ String relatedTo = relationship.getRelatedTo()
+ if (relatedTo.toLowerCase() == "service-instance") {
+ String relatioshipurl = relationship.getRelatedLink()
+ String serviceInstanceId =
+ relatioshipurl.substring(relatioshipurl.lastIndexOf("/") + 1, relatioshipurl.length())
+ uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, serviceInstanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500,
+ "Service Instance was not found in aai: ${serviceInstanceId} related to ${instanceId}")
+ }
+ AAIResultWrapper wrapper01 = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> serviceInstance = wrapper01.asBean(ServiceInstance.class)
+ if (serviceInstance.isPresent()) {
+ ServiceInstance instance = serviceInstance.get()
+ if (role.equalsIgnoreCase(instance.getServiceRole())) {
+ relatedInstances.put(instance.getWorkloadContext(),instance)
+ }
+ }
+ }
+ }
+ }
+ logger.debug("Found ${relatedInstances.size()} ${role} related to ${instanceId} ")
+ return relatedInstances
+ }
+
+ private String getInstanceIdByWorkloadContext(Map<String,ServiceInstance> instances,String workloadContext ) {
+ String instanceId = instances.get(workloadContext).getServiceInstanceId()
+ if(instanceId == null) {
+ throw new BpmnError( 2500, "${workloadContext} NSSI ID is not found.")
+ }
+ return instanceId
+ }
+
+ /**
+ * Method to handle deallocation of RAN NSSI constituents(TN_FH/TN_MH)
+ * @param execution
+ * @param serviceFunction - TN_FH/TN_MH
+ * @return
+ */
+ private String buildDeallocateNssiRequest(DelegateExecution execution,String serviceFunction) {
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ Map<String, ServiceInstance> relatedNssis = execution.getVariable("relatedNssis")
+
+ String anNssiId = execution.getVariable("anNssiId")
+ List<String> sNssaiList = execution.getVariable("sNssaiList")
+
+ Map<String, ServiceInstance> relatedSPs = execution.getVariable("relatedSPs")
+
+ DeAllocateNssi deallocateNssi = new DeAllocateNssi()
+ deallocateNssi.setNsiId(anNssiId)
+ ServiceInstance tnNssi = relatedNssis.get(serviceFunction)
+ String nssiId = tnNssi.getServiceInstanceId()
+
+ deallocateNssi.setNssiId(nssiId)
+ deallocateNssi.setScriptName(tnNssi.getServiceInstanceName())
+ deallocateNssi.setSnssaiList(sNssaiList)
+ deallocateNssi.setSliceProfileId(relatedSPs.get(serviceFunction).getServiceInstanceId())
+
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setVendor("ONAP")
+ esrInfo.setNetworkType("TN")
+
+ ServiceInfo serviceInfo = new ServiceInfo()
+ serviceInfo.setServiceInvariantUuid(tnNssi.getModelInvariantId())
+ serviceInfo.setServiceUuid(tnNssi.getModelVersionId())
+ serviceInfo.setGlobalSubscriberId(globalSubscriberId)
+ serviceInfo.setSubscriptionServiceType(subscriptionServiceType)
+
+ JsonObject json = new JsonObject()
+ json.addProperty("deAllocateNssi", objectMapper.writeValueAsString(deallocateNssi))
+ json.addProperty("esrInfo", objectMapper.writeValueAsString(esrInfo))
+ json.addProperty("serviceInfo", objectMapper.writeValueAsString(serviceInfo))
+ return json.toString()
+
+ }
+
+ private void deleteServiceInstanceInAAI(DelegateExecution execution,String instanceId) {
+ try {
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), instanceId)
+ getAAIClient().delete(serviceInstanceUri)
+ logger.debug("${Prefix} Exited deleteServiceInstance")
+ }catch(Exception e){
+ logger.debug("Error occured within deleteServiceInstance method: " + e)
+ }
+ }
+
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssi.groovy
new file mode 100644
index 0000000000..7681bf9346
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssi.groovy
@@ -0,0 +1,169 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import groovy.json.JsonSlurper
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+class DoDeallocateTnNssi extends AbstractServiceTaskProcessor {
+ String Prefix = "TNDEALLOC_"
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
+ JsonSlurper jsonSlurper = new JsonSlurper()
+ ObjectMapper objectMapper = new ObjectMapper()
+ private static final Logger logger = LoggerFactory.getLogger(DoDeallocateTnNssi.class)
+
+
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug("Start preProcessRequest")
+
+ execution.setVariable("startTime", System.currentTimeMillis())
+ String msg = tnNssmfUtils.getExecutionInputParams(execution)
+ logger.debug("Deallocate TN NSSI input parameters: " + msg)
+
+ execution.setVariable("prefix", Prefix)
+
+ tnNssmfUtils.setSdncCallbackUrl(execution, true)
+ logger.debug("SDNC Callback URL: " + execution.getVariable("sdncCallbackUrl"))
+
+ String sliceServiceInstanceId = execution.getVariable("serviceInstanceID")
+ execution.setVariable("sliceServiceInstanceId", sliceServiceInstanceId)
+
+ String sliceServiceInstanceName = execution.getVariable("servicename")
+ execution.setVariable("sliceServiceInstanceName", sliceServiceInstanceName)
+
+
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ //here modelVersion is not set, we use modelUuid to decompose the service.
+ def isDebugLogEnabled = true
+ execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+ logger.debug("Finish preProcessRequest")
+ }
+
+ void preprocessSdncDeallocateTnNssiRequest(DelegateExecution execution) {
+ def method = getClass().getSimpleName() + '.preprocessSdncDeallocateTnNssiRequest(' +
+ 'execution=' + execution.getId() + ')'
+ def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
+ logger.trace('Entered ' + method)
+
+ try {
+ String serviceInstanceId = execution.getVariable("serviceInstanceID")
+
+ String sdncRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "deallocate")
+
+ execution.setVariable("TNNSSMF_SDNCRequest", sdncRequest)
+ logger.debug("Outgoing SDNCRequest is: \n" + sdncRequest)
+
+ } catch (Exception e) {
+ logger.debug("Exception Occured Processing preprocessSdncDeallocateTnNssiRequest. Exception is:\n" + e)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessSDNCActivateRequest Method:\n" + e.getMessage())
+ }
+ logger.trace("COMPLETED preprocessSdncDeallocateTnNssiRequest Process")
+ }
+
+
+ void validateSDNCResponse(DelegateExecution execution, String response, String method) {
+ tnNssmfUtils.validateSDNCResponse(execution, response, method)
+ }
+
+ void deleteServiceInstance(DelegateExecution execution) {
+ try {
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("serviceInstanceID"))
+ client.delete(uri)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in DoDeallocateTnNssi.deleteServiceInstance. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+ public void updateAAIOrchStatus(DelegateExecution execution) {
+ logger.debug("Start updateAAIOrchStatus")
+ String tnNssiId = execution.getVariable("serviceInstanceID")
+ String orchStatus = execution.getVariable("orchestrationStatus")
+
+ try {
+ ServiceInstance si = new ServiceInstance()
+ si.setOrchestrationStatus(orchStatus)
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, tnNssiId)
+ client.update(uri, si)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ logger.debug("Finish updateAAIOrchStatus")
+ }
+
+ void prepareUpdateJobStatus(DelegateExecution execution,
+ String status,
+ String progress,
+ String statusDescription) {
+ String serviceId = execution.getVariable("serviceInstanceID")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType("Deallocate")
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+}
+
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy
new file mode 100644
index 0000000000..2e7e728b44
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyAccessNSSI.groovy
@@ -0,0 +1,656 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, Wipro Limited.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.NssmfAdapterUtils
+import org.onap.so.bpmn.common.scripts.OofUtils
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import java.sql.Timestamp
+import java.util.List
+import static org.apache.commons.lang3.StringUtils.isBlank
+import com.google.gson.JsonObject
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonArray
+import org.onap.so.beans.nsmf.AllocateTnNssi
+import org.onap.so.beans.nsmf.EsrInfo
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.domain.ServiceDecomposition
+import org.onap.so.bpmn.core.domain.ServiceProxy
+
+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.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.AAIResultWrapper
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import javax.ws.rs.NotFoundException
+
+class DoModifyAccessNSSI extends AbstractServiceTaskProcessor {
+
+ String Prefix="MASS_"
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ OofUtils oofUtils = new OofUtils()
+ ObjectMapper objectMapper = new ObjectMapper();
+ AnNssmfUtils anNssmfUtils = new AnNssmfUtils()
+ private NssmfAdapterUtils nssmfAdapterUtils = new NssmfAdapterUtils(httpClientFactory, jsonUtil)
+
+ private static final Logger logger = LoggerFactory.getLogger(DoModifyAccessNSSI.class)
+
+ @Override
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug(Prefix + "preProcessRequest Start")
+ execution.setVariable("prefix", Prefix)
+ execution.setVariable("startTime", System.currentTimeMillis())
+ def msg
+ try {
+
+ logger.debug("input variables : msoRequestId - "+execution.getVariable("msoRequestId")+
+ " globalSubscriberId - "+execution.getVariable("globalSubscriberId")+
+ " serviceInstanceID - "+execution.getVariable("serviceInstanceID")+
+ " nsiId - "+execution.getVariable("nsiId")+
+ " networkType - "+execution.getVariable("networkType")+
+ " subscriptionServiceType - "+execution.getVariable("subscriptionServiceType")+
+ " jobId - "+execution.getVariable("jobId")+
+ " sliceParams - "+execution.getVariable("sliceParams")+
+ " servicename - "+ execution.getVariable("servicename"))
+
+ //validate slice subnet inputs
+
+ String sliceParams = execution.getVariable("sliceParams")
+ String modifyAction = jsonUtil.getJsonValue(sliceParams, "modifyAction")
+ if (isBlank(modifyAction)) {
+ msg = "Input modifyAction is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("modifyAction", modifyAction)
+ switch(modifyAction) {
+ case "allocate":
+ execution.setVariable("isModifyallocate", true)
+ break
+ case "deallocate":
+ execution.setVariable("isModifydeallocate", true)
+ break
+ case "reconfigure":
+ execution.setVariable("isModifyreconfigure", true)
+ String resourceConfig = jsonUtil.getJsonValue(sliceParams, "resourceConfig")
+ execution.setVariable("additionalProperties", resourceConfig)
+ break
+ default:
+ logger.debug("Invalid modify Action")
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Invalid modify Action : "+modifyAction)
+ }
+ }
+ List<String> snssaiList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceParams, "snssaiList"))
+ String sliceProfileId = jsonUtil.getJsonValue(sliceParams, "sliceProfileId")
+ if (isBlank(sliceProfileId) || (snssaiList.empty)) {
+ msg = "Mandatory fields are empty"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfileId", sliceProfileId)
+ execution.setVariable("snssaiList", snssaiList)
+ }
+ String nsiName = jsonUtil.getJsonValue(sliceParams, "nsiInfo.nsiName")
+ String scriptName = jsonUtil.getJsonValue(sliceParams, "scriptName")
+ execution.setVariable("nsiName", nsiName)
+ execution.setVariable("scriptName", scriptName)
+ execution.setVariable("job_timeout", 10)
+ execution.setVariable("ranNssiPreferReuse", false)
+ } catch(BpmnError e) {
+ throw e
+ } catch(Exception ex) {
+ msg = "Exception in DoModifyAccessNSSI.preProcessRequest " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug(Prefix + "preProcessRequest Exit")
+ }
+
+ def getSliceProfile = { DelegateExecution execution ->
+ logger.debug(Prefix + "getSliceProfiles Start")
+ String instanceId = execution.getVariable("sliceProfileId")
+ ServiceInstance sliceProfileInstance = getServiceInstance(execution, instanceId)
+ SliceProfile ranSliceProfile = sliceProfileInstance.getSliceProfiles().getSliceProfile().get(0)
+ logger.debug("RAN slice profile : "+ranSliceProfile.toString())
+ execution.setVariable("RANSliceProfile", ranSliceProfile)
+ execution.setVariable("ranSliceProfileInstance", sliceProfileInstance)
+ }
+
+ /*
+ * Function to subnet capabilities from nssmf adapter
+ */
+ def getSubnetCapabilities = { DelegateExecution execution ->
+ logger.debug(Prefix+"getSubnetCapabilities method start")
+
+ String tnNssmfRequest = anNssmfUtils.buildCreateTNNSSMFSubnetCapabilityRequest()
+
+ String urlString = "/api/rest/provMns/v1/NSS/subnetCapabilityQuery"
+
+ String tnNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, tnNssmfRequest)
+
+ if (tnNssmfResponse != null) {
+ String FHCapabilities= jsonUtil.getJsonValue(tnNssmfResponse, "TN_FH")
+ String MHCapabilities = jsonUtil.getJsonValue(tnNssmfResponse, "TN_MH")
+ execution.setVariable("FHCapabilities",FHCapabilities)
+ execution.setVariable("MHCapabilities",MHCapabilities)
+
+ } else {
+ logger.error("received error message from NSSMF : "+ tnNssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ String anNssmfRequest = anNssmfUtils.buildCreateANNFNSSMFSubnetCapabilityRequest()
+
+ String anNssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, anNssmfRequest)
+
+ if (anNssmfResponse != null) {
+ String ANNFCapabilities = jsonUtil.getJsonValue(anNssmfResponse, "AN_NF")
+ execution.setVariable("ANNFCapabilities",ANNFCapabilities)
+
+ } else {
+ logger.error("received error message from NSSMF : "+ anNssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ }
+
+
+ /*
+ * prepare OOF request for RAN NSSI selection
+ */
+ def prepareOofRequestForRanNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareOofRequestForRanNSS method start")
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug( "get NSSI option OOF Url: " + urlString)
+
+ //build oof request body
+ boolean ranNssiPreferReuse = execution.getVariable("ranNssiPreferReuse");
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+ Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("RANSliceProfile"), Map.class)
+ ServiceInstance ranSliceProfileInstance = objectMapper.readValue(execution.getVariable("ranSliceProfileInstance"), ServiceInstance.class)
+ String modelUuid = ranSliceProfileInstance.getModelVersionId()
+ String modelInvariantUuid = ranSliceProfileInstance.getModelInvariantId()
+ String modelName = execution.getVariable("servicename")
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ List<String> nsstInfoList = new ArrayList<>()
+ JsonArray capabilitiesList = new JsonArray()
+ String FHCapabilities = execution.getVariable("FHCapabilities")
+ String MHCapabilities = execution.getVariable("MHCapabilities")
+ String ANNFCapabilities = execution.getVariable("ANNFCapabilities")
+ JsonObject FH = new JsonObject()
+ JsonObject MH = new JsonObject()
+ JsonObject ANNF = new JsonObject()
+ FH.addProperty("domainType", "TN_FH")
+ FH.addProperty("capabilityDetails", FHCapabilities)
+ MH.addProperty("domainType", "TN_MH")
+ MH.addProperty("capabilityDetails", MHCapabilities)
+ ANNF.addProperty("domainType", "AN_NF")
+ ANNF.addProperty("capabilityDetails", FHCapabilities)
+ capabilitiesList.add(FH)
+ capabilitiesList.add(MH)
+ capabilitiesList.add(ANNF)
+
+ execution.setVariable("nssiSelection_Url", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nssiSelection_messageType",messageType)
+ execution.setVariable("nssiSelection_correlator",requestId)
+ execution.setVariable("nssiSelection_timeout",timeout)
+ String oofRequest = anNssmfUtils.buildSelectRANNSSIRequest(requestId, messageType, modelUuid,modelInvariantUuid,
+ modelName, profileInfo, nsstInfoList, capabilitiesList, ranNssiPreferReuse)
+
+ execution.setVariable("nssiSelection_oofRequest",oofRequest)
+ logger.debug("Sending request to OOF: " + oofRequest)
+ }
+
+ /*
+ * process OOF response for RAN NSSI selection
+ */
+ def processOofResponseForRanNSS = { DelegateExecution execution ->
+ logger.debug(Prefix+"processOofResponseForRanNSS method start")
+ String oofResponse = execution.getVariable("nssiSelection_asyncCallbackResponse")
+ String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
+ if(requestStatus.equals("completed")) {
+ List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))
+ boolean existingNSI = jsonUtil.getJsonValue(solution.get(0), "existingNSI")
+ if(!existingNSI) {
+ def sliceProfiles = jsonUtil.getJsonValue(solution.get(0), "newNSISolution.sliceProfiles")
+ execution.setVariable("RanConstituentSliceProfiles", sliceProfiles)
+ List<String> ranConstituentSliceProfiles = jsonUtil.StringArrayToList(sliceProfiles)
+ anNssmfUtils.createDomainWiseSliceProfiles(ranConstituentSliceProfiles, execution)
+ logger.debug("RanConstituentSliceProfiles list from OOF "+sliceProfiles)
+ }else {
+ String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
+ logger.error("failed to get slice profiles from oof "+ statusMessage)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"failed to get slice profiles from oof "+statusMessage)
+ }
+ }else {
+ String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
+ logger.error("received failed status from oof "+ statusMessage)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a failed Async Response from OOF : "+statusMessage)
+ }
+
+ }
+ def getNssisFromAai = { DelegateExecution execution ->
+ logger.debug(Prefix+"getNssisFromAai method start")
+ String instanceId = execution.getVariable("serviceInstanceID")
+ String role = "nssi"
+ Map<String,ServiceInstance> ranConstituentNssis = getRelatedInstancesByRole(execution, role, instanceId)
+ logger.debug("getNssisFromAai ranConstituentNssis : "+ranConstituentNssis.toString())
+ ranConstituentNssis.each { key, val ->
+ switch(key) {
+ case "AN-NF":
+ execution.setVariable("ANNF_NSSI", val.getServiceInstanceId())
+ execution.setVariable("ANNF_nssiName", val.getServiceInstanceName())
+ break
+ case "TN-FH":
+ execution.setVariable("TNFH_NSSI", val.getServiceInstanceId())
+ execution.setVariable("TNFH_nssiName", val.getServiceInstanceName())
+ break
+ case "TN-MH":
+ execution.setVariable("TNMH_NSSI", val.getServiceInstanceId())
+ execution.setVariable("TNMH_nssiName", val.getServiceInstanceName())
+ break
+ default:
+ logger.error("No expected match found for current domainType "+ key)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current domainType "+ key)
+ }
+ }
+
+ }
+ def createSliceProfiles = { DelegateExecution execution ->
+ logger.debug(Prefix+"createSliceProfiles method start")
+ anNssmfUtils.createSliceProfilesInAai(execution)
+ }
+ def updateRelationshipInAai = { DelegateExecution execution ->
+ logger.debug(Prefix+"updateRelationshipInAai method start")
+ String msg = ""
+ try {
+ def ANNF_serviceInstanceId = execution.getVariable("ANNF_NSSI")
+ def TNFH_serviceInstanceId = execution.getVariable("TNFH_NSSI")
+ def TNMH_serviceInstanceId = execution.getVariable("TNMH_NSSI")
+ def AN_profileInstanceId = execution.getVariable("sliceProfileId")
+ def ANNF_profileInstanceId = execution.getVariable("ANNF_sliceProfileInstanceId")
+ def TNFH_profileInstanceId = execution.getVariable("TNFH_sliceProfileInstanceId")
+ def TNMH_profileInstanceId = execution.getVariable("TNMH_sliceProfileInstanceId")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ Relationship ANNF_relationship = new Relationship()
+ Relationship TNFH_relationship = new Relationship()
+ Relationship TNMH_relationship = new Relationship()
+
+ String ANNF_relatedLink = "aai/v16/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${ANNF_profileInstanceId}"
+ String TNFH_relatedLink = "aai/v16/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNFH_profileInstanceId}"
+ String TNMH_relatedLink = "aai/v16/business/customers/customer/${globalSubscriberId}/service-subscriptions/service-subscription/${subscriptionServiceType}/service-instances/service-instance/${TNMH_profileInstanceId}"
+
+ ANNF_relationship.setRelatedLink(ANNF_relatedLink)
+ ANNF_relationship.setRelatedTo("service-instance")
+ ANNF_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+ TNFH_relationship.setRelatedLink(TNFH_relatedLink)
+ TNFH_relationship.setRelatedTo("service-instance")
+ TNFH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+ TNMH_relationship.setRelatedLink(TNMH_relatedLink)
+ TNMH_relationship.setRelatedTo("service-instance")
+ TNMH_relationship.setRelationshipLabel("org.onap.relationships.inventory.ComposedOf")
+
+ // create SliceProfile and NSSI relationship in AAI
+ anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,ANNF_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,TNFH_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,TNMH_serviceInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, ANNF_relationship,AN_profileInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNFH_relationship,AN_profileInstanceId)
+ anNssmfUtils.createRelationShipInAAI(execution, TNMH_relationship,AN_profileInstanceId)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+
+ msg = "Exception in DoCreateE2EServiceInstance.createCustomRelationship. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+ def processRanNfModifyRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processRanNfModifyRsp method start")
+ anNssmfUtils.processRanNfModifyRsp(execution)
+ }
+
+ def prepareTnFhRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnFhRequest method start")
+
+ String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_FH", "modify-allocate")
+ String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+
+ if (nssmfResponse != null) {
+ execution.setVariable("nssmfResponse", nssmfResponse)
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TNFH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit prepareTnFhRequest")
+
+ }
+ def prepareTnMhRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnMhRequest method start")
+
+ String nssmfRequest = anNssmfUtils.buildCreateNSSMFRequest(execution, "TN_MH", "modify-allocate")
+ String urlString = "/api/rest/provMns/v1/NSS/SliceProfiles"
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+
+ if (nssmfResponse != null) {
+ execution.setVariable("nssmfResponse", nssmfResponse)
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TNMH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ logger.debug("Exit prepareTnMhRequest")
+ }
+
+ def createFhAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_FH")
+ }
+
+ def createMhAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_MH")
+ }
+
+ private void createTnAllocateNssiJobQuery(DelegateExecution execution, String domainType) {
+ EsrInfo esrInfo = new EsrInfo()
+ esrInfo.setNetworkType("TN")
+ esrInfo.setVendor("ONAP")
+ String esrInfoString = objectMapper.writeValueAsString(esrInfo)
+ execution.setVariable("esrInfo", esrInfoString)
+ JsonObject serviceInfo = new JsonObject()
+
+ serviceInfo.addProperty("nsiId", execution.getVariable("nsiId"))
+ String sST = jsonUtil.getJsonValue(execution.getVariable("sliceProfile"), "sST")
+ serviceInfo.addProperty("sST", sST)
+ serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("plmnIdList")))
+ serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId"))
+ serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType"))
+ serviceInfo.addProperty("serviceInvariantUuid", null)
+ serviceInfo.addProperty("serviceUuid", null)
+ if(domainType.equals("TN_FH")) {
+ serviceInfo.addProperty("nssiId", execution.getVariable("TNFH_NSSI"))
+ serviceInfo.addProperty("nssiName", execution.getVariable("TNFH_nssiName"))
+ }else if(domainType.equals("TN_MH")) {
+ serviceInfo.addProperty("nssiId", execution.getVariable("TNMH_NSSI"))
+ serviceInfo.addProperty("nssiName", execution.getVariable("TNMH_nssiName"))
+ }
+ execution.setVariable("serviceInfo", serviceInfo.toString())
+ execution.setVariable("responseId", "")
+ }
+
+ def processFhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processJobStatusRsp method start")
+ String jobResponse = execution.getVariable("TNFH_jobResponse")
+ logger.debug("Job status response "+jobResponse)
+ String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
+ String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
+ if(status.equalsIgnoreCase("finished")) {
+ logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
+ }
+ else {
+ String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
+ logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ }
+ }
+
+ def processMhAllocateNssiJobStatusRsp = { DelegateExecution execution ->
+ logger.debug(Prefix+"processJobStatusRsp method start")
+ String jobResponse = execution.getVariable("TNMH_jobResponse")
+ logger.debug("Job status response "+jobResponse)
+ String status = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.status")
+ String nssi = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.nssi")
+ if(status.equalsIgnoreCase("finished")) {
+ logger.debug("Job successfully completed ... proceeding with flow for nssi : "+nssi)
+ }
+ else {
+ String statusDescription = jsonUtil.getJsonValue(jobResponse, "responseDescriptor.statusDescription")
+ logger.error("received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from job status query for nssi : "+nssi+" with status description : "+ statusDescription)
+ }
+ }
+
+ def getSliceProfilesFromAai = { DelegateExecution execution ->
+ logger.debug(Prefix+"getSliceProfilesFromAai method start")
+ String instanceId = execution.getVariable("sliceProfileId")
+ String role = "slice-profile-instance"
+ Map<String,ServiceInstance> ranConstituentSliceProfiles = getRelatedInstancesByRole(execution, role, instanceId)
+ logger.debug("getSliceProfilesFromAai ranConstituentSliceProfiles : "+ranConstituentSliceProfiles.toString())
+ ranConstituentSliceProfiles.each { key, val ->
+ switch(key) {
+ case "AN-NF":
+ execution.setVariable("ANNF_sliceProfileInstanceId", val.getServiceInstanceId())
+ break
+ case "TN-FH":
+ execution.setVariable("TNFH_sliceProfileInstanceId", val.getServiceInstanceId())
+ break
+ case "TN-MH":
+ execution.setVariable("TNMH_sliceProfileInstanceId", val.getServiceInstanceId())
+ break
+ default:
+ logger.error("No expected match found for current domainType "+ key)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1000,"No expected match found for current domainType "+ key)
+ }
+ }
+ }
+
+ def prepareTnFhDeallocateRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnFhDeallocateRequest method start")
+ String nssmfRequest = anNssmfUtils.buildDeallocateNssiRequest(execution, "TN_FH")
+ String nssiId = execution.getVariable("TNFH_NSSI")
+ execution.setVariable("tnFHNSSIId", nssiId)
+ String urlString = "/api/rest/provMns/v1/NSS/nssi/" + nssiId
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_FH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ }
+
+ def prepareTnMhDeallocateRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"prepareTnFhDeallocateRequest method start")
+ String nssmfRequest = anNssmfUtils.buildDeallocateNssiRequest(execution, "TN_FH")
+ String nssiId = execution.getVariable("TNFH_NSSI")
+ execution.setVariable("tnFHNSSIId", nssiId)
+ String urlString = "/api/rest/provMns/v1/NSS/nssi/" + nssiId
+ String nssmfResponse = nssmfAdapterUtils.sendPostRequestNSSMF(execution, urlString, nssmfRequest)
+ if (nssmfResponse != null) {
+ String jobId = jsonUtil.getJsonValue(nssmfResponse, "jobId")
+ execution.setVariable("TN_MH_jobId",jobId)
+ } else {
+ logger.error("received error message from NSSMF : "+ nssmfResponse)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"Received a Bad Sync Response from NSSMF.")
+ }
+ }
+
+ def createFhDeAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_FH")
+ }
+
+ def createMhDeAllocateNssiJobQuery = { DelegateExecution execution ->
+ logger.debug(Prefix+"createModifyNssiQueryJobStatus method start")
+ createTnAllocateNssiJobQuery(execution, "TN_MH")
+ }
+ def deleteFhSliceProfile = { DelegateExecution execution ->
+ logger.debug(Prefix+"deleteFhSliceProfile method start")
+ deleteServiceInstanceInAAI(execution,execution.getVariable("TNFH_sliceProfileInstanceId"))
+ }
+ def deleteMhSliceProfile = { DelegateExecution execution ->
+ logger.debug(Prefix+"deleteMhSliceProfile method start")
+ deleteServiceInstanceInAAI(execution,execution.getVariable("TNMH_sliceProfileInstanceId"))
+ }
+ def deleteAnSliceProfile = { DelegateExecution execution ->
+ logger.debug(Prefix+"deleteAnSliceProfile method start")
+ deleteServiceInstanceInAAI(execution,execution.getVariable("ANNF_sliceProfileInstanceId"))
+ }
+ /**
+ * update operation status in request db
+ *
+ */
+ def prepareOperationStatusUpdate = { DelegateExecution execution ->
+ logger.debug(Prefix + "prepareOperationStatusUpdate Start")
+
+ String serviceId = execution.getVariable("serviceInstanceID")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String nssiId = execution.getVariable("serviceInstanceID")
+ logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
+
+ ResourceOperationStatus updateStatus = new ResourceOperationStatus()
+ updateStatus.setServiceId(serviceId)
+ updateStatus.setOperationId(jobId)
+ updateStatus.setResourceTemplateUUID(nsiId)
+ updateStatus.setResourceInstanceID(nssiId)
+ updateStatus.setOperType("Modify")
+ updateStatus.setProgress(100)
+ updateStatus.setStatus("finished")
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
+
+ logger.debug(Prefix + "prepareOperationStatusUpdate Exit")
+ }
+
+ def prepareFailedOperationStatusUpdate = { DelegateExecution execution ->
+ logger.debug(Prefix + "prepareFailedOperationStatusUpdate Start")
+
+ String serviceId = execution.getVariable("serviceInstanceID")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+ String nssiId = execution.getVariable("serviceInstanceID")
+ logger.debug("Service Instance serviceId:" + serviceId + " jobId:" + jobId)
+
+ ResourceOperationStatus updateStatus = new ResourceOperationStatus()
+ updateStatus.setServiceId(serviceId)
+ updateStatus.setOperationId(jobId)
+ updateStatus.setResourceTemplateUUID(nsiId)
+ updateStatus.setResourceInstanceID(nssiId)
+ updateStatus.setOperType("Modify")
+ updateStatus.setProgress(0)
+ updateStatus.setStatus("failed")
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, updateStatus)
+ }
+
+ /**
+ * @param execution
+ * @param role - nssi/slice profile instance
+ * @param instanceId - id to which the related list to be found
+ * @return
+ */
+ private Map<String,ServiceInstance> getRelatedInstancesByRole(DelegateExecution execution,String role,String instanceId) {
+ logger.debug("${Prefix} - Fetching related ${role} from AAI")
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+
+ Map<String,ServiceInstance> relatedInstances = new HashMap<>()
+
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, instanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai : ${instanceId}")
+ }
+ AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+ if(si.isPresent()) {
+ List<Relationship> relationshipList = si.get().getRelationshipList().getRelationship()
+ for (Relationship relationship : relationshipList) {
+ String relatedTo = relationship.getRelatedTo()
+ if (relatedTo.toLowerCase() == "service-instance") {
+ String relatioshipurl = relationship.getRelatedLink()
+ String serviceInstanceId =
+ relatioshipurl.substring(relatioshipurl.lastIndexOf("/") + 1, relatioshipurl.length())
+
+ AAIResourcesClient client01 = new AAIResourcesClient()
+ AAIResourceUri uri01 = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, serviceInstanceId)
+ if (!client.exists(uri01)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500,
+ "Service Instance was not found in aai: ${serviceInstanceId} related to ${instanceId}")
+ }
+ AAIResultWrapper wrapper01 = client01.get(uri01, NotFoundException.class)
+ Optional<ServiceInstance> serviceInstance = wrapper01.asBean(ServiceInstance.class)
+ if (serviceInstance.isPresent()) {
+ ServiceInstance instance = serviceInstance.get()
+ if (role.equalsIgnoreCase(instance.getServiceRole())) {
+ relatedInstances.put(instance.getWorkloadContext(),instance)
+ }
+ }
+ }
+ }
+ }
+ logger.debug("Found ${relatedInstances.size()} ${role} related to ${instanceId} ")
+ return relatedInstances
+ }
+
+ private ServiceInstance getServiceInstance(DelegateExecution execution, String instanceId) {
+ String globalSubscriberId = execution.getVariable("globalSubscriberId")
+ String subscriptionServiceType = execution.getVariable("subscriptionServiceType")
+ ServiceInstance serviceInstance = new ServiceInstance()
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ globalSubscriberId, subscriptionServiceType, instanceId)
+ if (!client.exists(uri)) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service Instance was not found in aai : ${instanceId}")
+ }
+ AAIResultWrapper wrapper = client.get(uri, NotFoundException.class)
+ Optional<ServiceInstance> si = wrapper.asBean(ServiceInstance.class)
+
+ if(si.isPresent()) {
+ serviceInstance = si
+ }
+ return serviceInstance
+ }
+ private void deleteServiceInstanceInAAI(DelegateExecution execution,String instanceId) {
+ try {
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("serviceType"), instanceId)
+ getAAIClient().delete(serviceInstanceUri)
+ logger.debug("${Prefix} Exited deleteServiceInstance")
+ }catch(Exception e){
+ logger.debug("Error occured within deleteServiceInstance method: " + e)
+ }
+ }
+} \ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy
new file mode 100644
index 0000000000..6fdfbe3218
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyRanNfNssi.groovy
@@ -0,0 +1,193 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ # Copyright (c) 2020, Wipro Limited.
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonObject
+import java.sql.Timestamp
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+import org.onap.so.bpmn.core.UrnPropertiesReader
+
+class DoModifyRanNfNssi extends AbstractServiceTaskProcessor {
+
+ String Prefix="MANNFNSS_"
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ ObjectMapper objectMapper = new ObjectMapper();
+ AnNssmfUtils anNssmfUtils = new AnNssmfUtils()
+
+ private static final Logger logger = LoggerFactory.getLogger(DoModifyRanNfNssi.class)
+
+ @Override
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug(Prefix + "preProcessRequest Start")
+ execution.setVariable("prefix", Prefix)
+ execution.setVariable("startTime", System.currentTimeMillis())
+ def msg
+ try {
+
+ logger.debug("input variables : msoRequestId - "+execution.getVariable("msoRequestId")+
+ " globalSubscriberId - "+execution.getVariable("globalSubscriberId")+
+ " serviceInstanceID - "+execution.getVariable("serviceInstanceID")+
+ " subscriptionServiceType - "+execution.getVariable("subscriptionServiceType")+
+ " sliceProfileId - "+execution.getVariable("sliceProfileId")+
+ " snssaiList - "+execution.getVariable("snssaiList")+
+ " modifyAction - "+execution.getVariable("modifyAction"))
+
+ //validate RAN NF slice subnet inputs
+
+ String modifyAction = execution.getVariable("modifyAction")
+ if (isBlank(modifyAction)) {
+ msg = "Input modifyAction is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("modifyAction", modifyAction)
+ switch(modifyAction) {
+ case "allocate":
+ String sliceProfile = execution.getVariable("additionalProperties")
+ execution.setVariable("sliceProfile", sliceProfile)
+ break
+ case "reconfigure":
+ String resourceConfig = execution.getVariable("additionalProperties")
+ execution.setVariable("resourceConfig", resourceConfig)
+ break
+ default:
+ logger.debug("Invalid modify Action")
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, "Invalid modify Action : "+modifyAction)
+ }
+ }
+ List<String> snssaiList = objectMapper.readValue(execution.getVariable("snssaiList"), List.class)
+ String sliceProfileId = execution.getVariable("sliceProfileId")
+ if (isBlank(sliceProfileId) || (snssaiList.empty)) {
+ msg = "Mandatory fields are empty"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfileId", sliceProfileId)
+ execution.setVariable("snssaiList", snssaiList)
+ execution.setVariable("snssai", snssaiList.get(0))
+ }
+
+ } catch(BpmnError e) {
+ throw e
+ } catch(Exception ex) {
+ msg = "Exception in DoModifyAccessNssi.preProcessRequest " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug(Prefix + "preProcessRequest Exit")
+ }
+
+ def createSdnrRequest = { DelegateExecution execution ->
+ logger.debug(Prefix+"createSdnrRequest method start")
+ String callbackUrl = UrnPropertiesReader.getVariable("mso.workflow.message.endpoint") + "/AsyncSdnrResponse/"+execution.getVariable("msoRequestId")
+ String modifyAction = execution.getVariable("modifyAction")
+ String sdnrRequest = buildSdnrAllocateRequest(execution, modifyAction, "InstantiateRANSlice", callbackUrl)
+ execution.setVariable("createNSSI_sdnrRequest", sdnrRequest)
+ execution.setVariable("createNSSI_timeout", "PT10M")
+ execution.setVariable("createNSSI_correlator", execution.getVariable("msoRequestId"))
+ execution.setVariable("createNSSI_messageType", "AsyncSdnrResponse");
+ }
+
+ def processSdnrResponse = { DelegateExecution execution ->
+ logger.debug(Prefix+"processSdnrResponse method start")
+ String SDNRResponse = execution.getVariable("SDNR_asyncCallbackResponse")
+ String status = jsonUtil.getJsonValue(SDNRResponse, "status")
+ if(status.equalsIgnoreCase("success")) {
+ String nfIds = jsonUtil.getJsonValue(SDNRResponse, "nfIds")
+ execution.setVariable("ranNfIdsJson", nfIds)
+ }else {
+ String reason = jsonUtil.getJsonValue(SDNRResponse, "reason")
+ logger.error("received failed status from SDNR "+ reason)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,"received failed status from SDNR "+ reason)
+ }
+ logger.debug("response from SDNR "+SDNRResponse)
+ }
+
+ private String buildSdnrAllocateRequest(DelegateExecution execution, String action, String rpcName, String callbackUrl) {
+
+ String requestId = execution.getVariable("msoRequestId")
+ Date date = new Date().getTime()
+ Timestamp time = new Timestamp(date)
+ String sliceProfileString
+ JsonObject response = new JsonObject()
+ JsonObject body = new JsonObject()
+ JsonObject input = new JsonObject()
+ JsonObject commonHeader = new JsonObject()
+ JsonObject payload = new JsonObject()
+ JsonObject payloadInput = new JsonObject()
+ if(action.equals("allocate")) {
+ Map<String,Object> sliceProfile = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class)
+ sliceProfile.put("sliceProfileId", execution.getVariable("sliceProfileId"))
+ sliceProfile.put("maxNumberofConns", sliceProfile.get("maxNumberofPDUSessions"))
+ sliceProfile.put("uLThptPerSlice", sliceProfile.get("expDataRateUL"))
+ sliceProfile.put("dLThptPerSlice", sliceProfile.get("expDataRateDL"))
+ sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ action = "modify-"+action
+ payloadInput.add("additionalproperties", new JsonObject())
+ }else if(action.equals("deallocate")) {
+ action = "modify-"+action
+ Map<String,Object> sliceProfile = new HashMap<>()
+ sliceProfile.put("sliceProfileId", execution.getVariable("sliceProfileId"))
+ sliceProfile.put("sNSSAI", execution.getVariable("snssai"))
+ sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ payloadInput.add("additionalproperties", new JsonObject())
+ }else if(action.equals("reconfigure")) {
+ Map<String,Object> sliceProfile = new HashMap<>()
+ sliceProfile.put("sliceProfileId", execution.getVariable("sliceProfileId"))
+ sliceProfile.put("sNSSAI", execution.getVariable("snssai"))
+ sliceProfileString = objectMapper.writeValueAsString(sliceProfile)
+ JsonObject resourceconfig = new JsonObject()
+ resourceconfig.addProperty("resourceConfig", execution.getVariable("resourceConfig"))
+ payloadInput.add("additionalproperties", resourceconfig)
+ }
+ commonHeader.addProperty("TimeStamp", time.toString())
+ commonHeader.addProperty("APIver", "1.0")
+ commonHeader.addProperty("RequestID", requestId)
+ commonHeader.addProperty("SubRequestID", "1")
+ commonHeader.add("RequestTrack", new JsonObject())
+ commonHeader.add("Flags", new JsonObject())
+ payloadInput.addProperty("sliceProfile", sliceProfileString)
+ payloadInput.addProperty("RANNFNSSIId", execution.getVariable("serviceInstanceID"))
+ payloadInput.addProperty("callbackURL", callbackUrl)
+ payload.add("input", payloadInput)
+ input.add("CommonHeader", commonHeader)
+ input.addProperty("Action", action)
+ input.add("Payload", payload)
+ body.add("input", input)
+ response.add("body", body)
+ response.addProperty("version", "1.0")
+ response.addProperty("rpc-name", rpcName)
+ response.addProperty("correlation-id", requestId+"-1")
+ response.addProperty("type", "request")
+ return response.toString()
+ }
+
+} \ No newline at end of file
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy
new file mode 100644
index 0000000000..0b7a5ff59b
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssi.groovy
@@ -0,0 +1,401 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import groovy.json.JsonSlurper
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aai.domain.yang.SliceProfile
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+public class DoModifyTnNssi extends AbstractServiceTaskProcessor {
+ String Prefix = "TNMOD_"
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
+ JsonSlurper jsonSlurper = new JsonSlurper()
+ ObjectMapper objectMapper = new ObjectMapper()
+ private static final Logger logger = LoggerFactory.getLogger(DoModifyTnNssi.class)
+
+
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug("Start preProcessRequest")
+ execution.setVariable("prefix", Prefix)
+ String msg = ""
+
+ try {
+ execution.setVariable("startTime", System.currentTimeMillis())
+ msg = tnNssmfUtils.getExecutionInputParams(execution)
+ logger.debug("Modify TN NSSI input parameters: " + msg)
+
+ execution.setVariable("prefix", Prefix)
+
+ tnNssmfUtils.setSdncCallbackUrl(execution, true)
+ logger.debug("SDNC Callback URL: " + execution.getVariable("sdncCallbackUrl"))
+
+ String additionalPropJsonStr = execution.getVariable("sliceParams")
+
+ String sliceServiceInstanceId = execution.getVariable("serviceInstanceID")
+ execution.setVariable("sliceServiceInstanceId", sliceServiceInstanceId)
+
+ String sliceServiceInstanceName = execution.getVariable("servicename")
+ execution.setVariable("sliceServiceInstanceName", sliceServiceInstanceName)
+
+ String operationId = UUID.randomUUID().toString()
+ execution.setVariable("operationId", operationId)
+
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ //here modelVersion is not set, we use modelUuid to decompose the service.
+ def isDebugLogEnabled = true
+ execution.setVariable("isDebugLogEnabled", isDebugLogEnabled)
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("serviceModelInfo", serviceModelInfo)
+
+ //additional properties
+ String sliceProfile = jsonUtil.getJsonValue(additionalPropJsonStr, "sliceProfile")
+ if (isBlank(sliceProfile)) {
+ msg = "Input sliceProfile is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfile", sliceProfile)
+ }
+
+ String transportSliceNetworks = jsonUtil.getJsonValue(additionalPropJsonStr, "transportSliceNetworks")
+ if (isBlank(transportSliceNetworks)) {
+ msg = "Input transportSliceNetworks is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("transportSliceNetworks", transportSliceNetworks)
+ }
+ logger.debug("transportSliceNetworks: " + transportSliceNetworks)
+
+ String nsiInfo = jsonUtil.getJsonValue(additionalPropJsonStr, "nsiInfo")
+ if (isBlank(nsiInfo)) {
+ msg = "Input nsiInfo is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("nsiInfo", nsiInfo)
+ }
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in preProcessRequest " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug("Finish preProcessRequest")
+ }
+
+
+ void deleteServiceInstance(DelegateExecution execution) {
+ try {
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE,
+ execution.getVariable("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("serviceInstanceID"))
+ client.delete(uri)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in DoDeallocateTnNssi.deleteServiceInstance. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+
+ void getExistingServiceInstance(DelegateExecution execution) {
+ String serviceInstanceId = execution.getVariable("serviceInstanceID")
+
+ AAIResourcesClient resourceClient = getAAIClient()
+ AAIResourceUri ssServiceuri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, serviceInstanceId)
+
+ try {
+ if (resourceClient.exists(ssServiceuri)) {
+ execution.setVariable("ssi_resourceLink", ssServiceuri.build().toString())
+ org.onap.aai.domain.yang.ServiceInstance ss =
+ resourceClient.get(org.onap.aai.domain.yang.ServiceInstance.class, ssServiceuri)
+ org.onap.aai.domain.yang.SliceProfile sliceProfile = ss.getSliceProfiles().getSliceProfile().get(0)
+ execution.setVariable("sliceProfileId", sliceProfile.getProfileId())
+
+ org.onap.aai.domain.yang.AllottedResources ars = ss.getAllottedResources()
+ List<org.onap.aai.domain.yang.AllottedResource> arList = ars.getAllottedResource()
+ List<String> arIdList = new ArrayList<>()
+ for (org.onap.aai.domain.yang.AllottedResource ar : arList) {
+ String arId = ar.getId()
+ arIdList.add(arId)
+ }
+ execution.setVariable("arIdList", arIdList)
+ } else {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Service instance was not found in aai to " +
+ "associate allotted resource for service :" + serviceInstanceId)
+ }
+ } catch (BpmnError e) {
+ throw e;
+ } catch (Exception ex) {
+ String msg = "Exception in getServiceInstance. " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ }
+
+ public void updateTnNssiInAAI(DelegateExecution execution) {
+ getExistingServiceInstance(execution)
+
+ updateServiceInstance(execution)
+ updateSliceProfile(execution)
+ updateAllottedResource(execution)
+ }
+
+ void updateServiceInstance(DelegateExecution execution) {
+ String serviceRole = "TN"
+ String serviceType = execution.getVariable("subscriptionServiceType")
+ String sliceProfileStr = execution.getVariable("sliceProfile")
+ String ssInstanceId = execution.getVariable("sliceServiceInstanceId")
+ try {
+ org.onap.aai.domain.yang.ServiceInstance ss = new org.onap.aai.domain.yang.ServiceInstance()
+ ss.setServiceInstanceId(ssInstanceId)
+ String sliceInstanceName = execution.getVariable("sliceServiceInstanceName")
+ ss.setServiceInstanceName(sliceInstanceName)
+ ss.setServiceType(serviceType)
+ String serviceStatus = "modified"
+ ss.setOrchestrationStatus(serviceStatus)
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelUuid = execution.getVariable("modelUuid")
+ ss.setModelInvariantId(modelInvariantUuid)
+ ss.setModelVersionId(modelUuid)
+ String serviceInstanceLocationid = tnNssmfUtils.getFirstPlmnIdFromSliceProfile(sliceProfileStr)
+ ss.setServiceInstanceLocationId(serviceInstanceLocationid)
+ String snssai = tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr)
+ ss.setEnvironmentContext(snssai)
+ ss.setServiceRole(serviceRole)
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"), ssInstanceId)
+ client.update(uri, ss)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in DoCreateTnNssiInstance.createServiceInstance. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+ void updateSliceProfile(DelegateExecution execution) {
+
+ String sliceserviceInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String sliceProfileStr = execution.getVariable("sliceProfile")
+ String sliceProfileId = execution.getVariable("sliceProfileId")
+ SliceProfile sliceProfile = new SliceProfile();
+ sliceProfile.setProfileId(sliceProfileId)
+ sliceProfile.setLatency(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "latency")))
+ sliceProfile.setResourceSharingLevel(jsonUtil.getJsonValue(sliceProfileStr, "resourceSharingLevel"))
+ sliceProfile.setSNssai(tnNssmfUtils.getFirstSnssaiFromSliceProfile(sliceProfileStr)) //TODO: should be list
+
+ sliceProfile.setE2ELatency(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "latency")))
+ sliceProfile.setMaxBandwidth(Integer.parseInt(jsonUtil.getJsonValue(sliceProfileStr, "maxBandwidth")))
+
+ //TODO: new API
+ sliceProfile.setReliability(new Object())
+ try {
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SLICE_PROFILE, execution.getVariable
+ ("globalSubscriberId"),
+ execution.getVariable("subscriptionServiceType"), sliceserviceInstanceId, sliceProfileId)
+ client.update(uri, sliceProfile)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in updateSliceProfile. " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ }
+
+ void updateAllottedResource(DelegateExecution execution) {
+ String serviceInstanceId = execution.getVariable('serviceInstanceID')
+
+ List<String> arIdList = execution.getVariable("arIdList")
+ try {
+ for (String arId : arIdList) {
+ AAIResourceUri arUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE,
+ execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"),
+ serviceInstanceId, arId)
+
+ getAAIClient().delete(arUri)
+ }
+
+ List<String> networkStrList = jsonUtil.StringArrayToList(execution.getVariable("transportSliceNetworks"))
+
+ for (String networkStr : networkStrList) {
+ String allottedResourceId = UUID.randomUUID().toString()
+ AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIObjectType.ALLOTTED_RESOURCE,
+ execution.getVariable("globalSubscriberId"), execution.getVariable("subscriptionServiceType"),
+ execution.getVariable("sliceserviceInstanceId"), allottedResourceId)
+ execution.setVariable("allottedResourceUri", allottedResourceUri)
+ String modelInvariantId = execution.getVariable("modelInvariantUuid")
+ String modelVersionId = execution.getVariable("modelUuid")
+
+ org.onap.aai.domain.yang.AllottedResource resource = new org.onap.aai.domain.yang.AllottedResource()
+ resource.setId(allottedResourceId)
+ resource.setType("TsciNetwork")
+ resource.setAllottedResourceName("network_" + execution.getVariable("sliceServiceInstanceName"))
+ resource.setModelInvariantId(modelInvariantId)
+ resource.setModelVersionId(modelVersionId)
+ getAAIClient().create(allottedResourceUri, resource)
+
+ String linkArrayStr = jsonUtil.getJsonValue(networkStr, "connectionLinks")
+ createLogicalLinksForAllocatedResource(execution, linkArrayStr, serviceInstanceId, allottedResourceId)
+ }
+
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Exception in createAaiAR " + ex.getMessage())
+ }
+ }
+
+ void createLogicalLinksForAllocatedResource(DelegateExecution execution,
+ String linkArrayStr, String serviceInstanceId,
+ String allottedResourceId) {
+
+ try {
+ List<String> linkStrList = jsonUtil.StringArrayToList(linkArrayStr)
+
+ for (String linkStr : linkStrList) {
+ String logicalLinkId = UUID.randomUUID().toString()
+ String epA = jsonUtil.getJsonValue(linkStr, "transportEndpointA")
+ String epB = jsonUtil.getJsonValue(linkStr, "transportEndpointB")
+ String modelInvariantId = execution.getVariable("modelInvariantUuid")
+ String modelVersionId = execution.getVariable("modelUuid")
+
+ org.onap.aai.domain.yang.LogicalLink resource = new org.onap.aai.domain.yang.LogicalLink()
+ resource.setLinkId(logicalLinkId)
+ resource.setLinkName(epA)
+ resource.setLinkName2(epB)
+ resource.setModelInvariantId(modelInvariantId)
+ resource.setModelVersionId(modelVersionId)
+
+ AAIResourceUri logicalLinkUri = AAIUriFactory.createResourceUri(AAIObjectType.LOGICAL_LINK, logicalLinkId)
+ getAAIClient().create(logicalLinkUri, resource)
+ }
+ } catch (Exception ex) {
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000,
+ "Exception in createLogicalLinksForAllocatedResource" + ex.getMessage())
+ }
+ }
+
+
+ void preprocessSdncModifyTnNssiRequest(DelegateExecution execution) {
+ def method = getClass().getSimpleName() + '.preprocessSdncModifyTnNssiRequest(' +
+ 'execution=' + execution.getId() + ')'
+ def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled')
+ logger.trace('Entered ' + method)
+
+ try {
+ String serviceInstanceId = execution.getVariable("serviceInstanceID")
+
+ String sdncRequest = tnNssmfUtils.buildSDNCRequest(execution, serviceInstanceId, "modify")
+
+ execution.setVariable("TNNSSMF_SDNCRequest", sdncRequest)
+ logger.debug("Outgoing SDNCRequest is: \n" + sdncRequest)
+
+ } catch (Exception e) {
+ logger.debug("Exception Occured Processing preprocessSdncModifyTnNssiRequest. Exception is:\n" + e)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 1002, "Error Occured during preProcessSDNCActivateRequest Method:\n" + e.getMessage())
+ }
+ logger.trace("COMPLETED preprocessSdncModifyTnNssiRequest Process")
+ }
+
+
+ void validateSDNCResponse(DelegateExecution execution, String response, String method) {
+ tnNssmfUtils.validateSDNCResponse(execution, response, method)
+ }
+
+
+ void updateAAIOrchStatus(DelegateExecution execution) {
+ logger.debug("Start updateAAIOrchStatus")
+ String sliceServiceInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String orchStatus = execution.getVariable("orchestrationStatus")
+
+ try {
+ ServiceInstance si = new ServiceInstance()
+ si.setOrchestrationStatus(orchStatus)
+ AAIResourcesClient client = getAAIClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, sliceServiceInstanceId)
+ client.update(uri, si)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ logger.debug("Finish updateAAIOrchStatus")
+ }
+
+ void prepareUpdateJobStatus(DelegateExecution execution,
+ String status,
+ String progress,
+ String statusDescription) {
+ String serviceId = execution.getVariable("serviceInstanceID")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType("Modify")
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+
+}
+
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnAllocateNssi.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnAllocateNssi.groovy
new file mode 100644
index 0000000000..3367920064
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnAllocateNssi.groovy
@@ -0,0 +1,339 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License")
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.google.gson.JsonArray
+import com.google.gson.JsonObject
+import groovy.json.JsonSlurper
+import org.camunda.bpm.engine.delegate.BpmnError
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.aai.domain.yang.ServiceInstance
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.AAIResourcesClient
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.RequestDBUtil
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.domain.ServiceDecomposition
+import org.onap.so.bpmn.core.domain.ServiceProxy
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.onap.so.db.request.beans.ResourceOperationStatus
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import org.springframework.web.util.UriUtils
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+class TnAllocateNssi extends AbstractServiceTaskProcessor {
+ String Prefix = "TNALLOC_"
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ RequestDBUtil requestDBUtil = new RequestDBUtil()
+ JsonSlurper jsonSlurper = new JsonSlurper()
+ ObjectMapper objectMapper = new ObjectMapper()
+ TnNssmfUtils tnNssmfUtils = new TnNssmfUtils()
+ private static final Logger logger = LoggerFactory.getLogger(TnAllocateNssi.class)
+
+ void preProcessRequest(DelegateExecution execution) {
+ logger.debug("Start preProcessRequest")
+ execution.setVariable("prefix", Prefix)
+ String msg = ""
+
+ try {
+ execution.setVariable("startTime", System.currentTimeMillis())
+
+ msg = tnNssmfUtils.getExecutionInputParams(execution)
+ logger.debug("Allocate TN NSSI input parameters: " + msg)
+
+ tnNssmfUtils.setSdncCallbackUrl(execution, true)
+ logger.debug("SDNC Callback URL: " + execution.getVariable("sdncCallbackUrl"))
+
+ String additionalPropJsonStr = execution.getVariable("sliceParams")
+
+ String tnNssiId = execution.getVariable("serviceInstanceID")
+ if (isBlank(tnNssiId)) {
+ tnNssiId = UUID.randomUUID().toString()
+ }
+
+ String operationId = UUID.randomUUID().toString()
+ execution.setVariable("operationId", operationId)
+
+ logger.debug("Generate new TN NSSI ID:" + tnNssiId)
+ tnNssiId = UriUtils.encode(tnNssiId, "UTF-8")
+ execution.setVariable("sliceServiceInstanceId", tnNssiId)
+
+ String sliceServiceInstanceName = execution.getVariable("servicename")
+ execution.setVariable("sliceServiceInstanceName", sliceServiceInstanceName)
+
+ //additional properties
+ String sliceProfile = jsonUtil.getJsonValue(additionalPropJsonStr, "sliceProfile")
+ if (isBlank(sliceProfile)) {
+ msg = "Input sliceProfile is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("sliceProfile", sliceProfile)
+ }
+
+ String transportSliceNetworks = jsonUtil.getJsonValue(additionalPropJsonStr, "transportSliceNetworks")
+ if (isBlank(transportSliceNetworks)) {
+ msg = "Input transportSliceNetworks is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("transportSliceNetworks", transportSliceNetworks)
+ }
+ logger.debug("transportSliceNetworks: " + transportSliceNetworks)
+
+ String nsiInfoStr = jsonUtil.getJsonValue(additionalPropJsonStr, "nsiInfo")
+ if (isBlank(nsiInfoStr)) {
+ msg = "Input nsiInfo is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable("nsiInfo", nsiInfoStr)
+ }
+
+ //nsiId is passed in from caller bpmn
+ //String nsiIdStr = jsonUtil.getJsonValue(nsiInfo, "nsiId")
+ //execution.setVariable("nsiId", nsiIdStr)
+
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ msg = "Exception in preProcessRequest " + ex.getMessage()
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ logger.debug("Finish preProcessRequest")
+ }
+
+
+ void prepareDecomposeService(DelegateExecution execution) {
+ logger.debug("Start prepareDecomposeService")
+ String msg = ""
+ String modelUuid = execution.getVariable("modelUuid")
+ if (isBlank(modelUuid)) {
+ msg = "Input modelUuid is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ if (isBlank(modelInvariantUuid)) {
+ msg = "Input modelInvariantUuid is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+
+ String serviceModelInfo = """{
+ "modelInvariantUuid":"${modelInvariantUuid}",
+ "modelUuid":"${modelUuid}",
+ "modelVersion":""
+ }"""
+ execution.setVariable("ssServiceModelInfo", serviceModelInfo)
+
+ logger.debug("Finish prepareDecomposeService")
+ }
+
+ void processDecomposition(DelegateExecution execution) {
+ logger.debug("Start processDecomposition")
+
+ ServiceDecomposition tnNsstServiceDecomposition = execution.getVariable("tnNsstServiceDecomposition")
+ logger.debug("tnNsstServiceDecomposition : " + tnNsstServiceDecomposition.toString())
+ //TN NSST decomposition
+ String tnModelVersion = tnNsstServiceDecomposition.getModelInfo().getModelVersion()
+ String tnModelName = tnNsstServiceDecomposition.getModelInfo().getModelName()
+ List<ServiceProxy> serviceProxyList = tnNsstServiceDecomposition.getServiceProxy()
+ List<String> nsstInfoList = new ArrayList<>()
+ for (ServiceProxy serviceProxy : serviceProxyList) {
+ String nsstModelUuid = serviceProxy.getModelInfo().getModelUuid()
+ String nsstModelInvariantUuid = serviceProxy.getModelInfo().getModelInvariantUuid()
+ String name = serviceProxy.getModelInfo().getModelName()
+ String nsstServiceModelInfo = """{
+ "UUID":"${nsstModelUuid}",
+ "invariantUUID":"${nsstModelInvariantUuid}",
+ "name":"${name}"
+ }"""
+ nsstInfoList.add(nsstServiceModelInfo)
+ }
+ int currentIndex = 0
+ int maxIndex = nsstInfoList.size()
+ if (maxIndex < 1) {
+ String msg = "Exception in TN NSST processDecomposition. There is no NSST associated with TN NSST "
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+ execution.setVariable("tnNsstInfoList", nsstInfoList)
+ execution.setVariable("tnModelVersion", tnModelVersion)
+ execution.setVariable("tnModelName", tnModelName)
+ execution.setVariable("currentIndex", currentIndex)
+ execution.setVariable("maxIndex", maxIndex)
+
+ logger.debug("End processDecomposition")
+ }
+
+ void prepareOofSelection(DelegateExecution execution) {
+ logger.debug("Start prepareOofSelection")
+
+ String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution)
+ logger.debug("get NSSI option OOF Url: " + urlString)
+ //build oof request body
+ String requestId = execution.getVariable("msoRequestId")
+ String messageType = "NSISelectionResponse"
+ Map<String, Object> profileInfo = objectMapper.readValue(execution.getVariable("sliceProfile"), Map.class)
+ String modelUuid = execution.getVariable("modelUuid")
+ String modelInvariantUuid = execution.getVariable("modelInvariantUuid")
+ String modelName = execution.getVariable("tnModelName")
+ String timeout = UrnPropertiesReader.getVariable("mso.adapters.oof.timeout", execution);
+ List<String> nsstInfoList = objectMapper.readValue(execution.getVariable("nsstInfoList"), List.class)
+ JsonArray capabilitiesList = new JsonArray()
+
+ execution.setVariable("nssiSelection_Url", "/api/oof/selection/nsi/v1")
+ execution.setVariable("nssiSelection_messageType", messageType)
+ execution.setVariable("nssiSelection_correlator", requestId)
+ execution.setVariable("nssiSelection_timeout", timeout)
+ String oofRequest = buildSelectTnNssiRequest(requestId, messageType, modelUuid, modelInvariantUuid,
+ modelName, profileInfo, nsstInfoList, capabilitiesList, false)
+ execution.setVariable("nssiSelection_oofRequest", oofRequest)
+
+ logger.debug("Finish prepareOofSelection")
+ }
+
+ String buildSelectTnNssiRequest(String requestId, String messageType, String UUID, String invariantUUID,
+ String name, Map<String, Object> profileInfo,
+ List<String> nsstInfoList, JsonArray capabilitiesList, Boolean preferReuse) {
+
+ def transactionId = requestId
+ logger.debug("transactionId is: " + transactionId)
+ String correlator = requestId
+ String callbackUrl = UrnPropertiesReader.getVariable("mso.adapters.oof.callback.endpoint") + "/" + messageType + "/" + correlator
+ ObjectMapper objectMapper = new ObjectMapper()
+ String profileJson = objectMapper.writeValueAsString(profileInfo)
+ String nsstInfoListString = objectMapper.writeValueAsString(nsstInfoList)
+ //Prepare requestInfo object
+ JsonObject requestInfo = new JsonObject()
+ requestInfo.addProperty("transactionId", transactionId)
+ requestInfo.addProperty("requestId", requestId)
+ requestInfo.addProperty("callbackUrl", callbackUrl)
+ requestInfo.addProperty("sourceId", "SO")
+ requestInfo.addProperty("timeout", 600)
+ requestInfo.addProperty("numSolutions", 1)
+
+ //Prepare serviceInfo object
+ JsonObject ranNsstInfo = new JsonObject()
+ ranNsstInfo.addProperty("UUID", UUID)
+ ranNsstInfo.addProperty("invariantUUID", invariantUUID)
+ ranNsstInfo.addProperty("name", name)
+
+ JsonObject json = new JsonObject()
+ json.add("requestInfo", requestInfo)
+ json.add("NSTInfo", ranNsstInfo)
+ json.addProperty("serviceProfile", profileJson)
+ json.addProperty("NSSTInfo", nsstInfoListString)
+ json.add("subnetCapabilities", capabilitiesList)
+ json.addProperty("preferReuse", preferReuse)
+
+ return json.toString()
+ }
+
+ void processOofSelection(DelegateExecution execution) {
+ logger.debug(Prefix + "processOofSelection method start")
+ String oofResponse = execution.getVariable("nssiSelection_asyncCallbackResponse")
+ String requestStatus = jsonUtil.getJsonValue(oofResponse, "requestStatus")
+ if (requestStatus.equals("completed")) {
+ List<String> solution = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(oofResponse, "solutions"))
+ boolean existingNSI = jsonUtil.getJsonValue(solution.get(0), "existingNSI")
+ if (existingNSI) {
+ def sharedNSISolution = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution")
+ execution.setVariable("sharedTnNssiSolution", sharedNSISolution)
+ logger.debug("sharedTnNssiSolution from OOF " + sharedNSISolution)
+ String tnServiceInstanceId = jsonUtil.getJsonValue(solution.get(0), "sharedNSISolution.NSIId")
+ execution.setVariable("tnServiceInstanceId", tnServiceInstanceId)
+ org.onap.so.bpmn.core.domain.ServiceInstance serviceInstance = new org.onap.so.bpmn.core.domain.ServiceInstance();
+ serviceInstance.setInstanceId(tnServiceInstanceId);
+ ServiceDecomposition serviceDecomposition = execution.getVariable("tnNsstServiceDecomposition")
+ serviceDecomposition.setServiceInstance(serviceInstance);
+ execution.setVariable("tnNsstServiceDecomposition", serviceDecomposition)
+ execution.setVariable("isOofTnNssiSelected", true)
+ } else {
+ def sliceProfiles = jsonUtil.getJsonValue(solution.get(0), "newNSISolution.sliceProfiles")
+ execution.setVariable("tnConstituentSliceProfiles", sliceProfiles)
+ execution.setVariable("isOofTnNssiSelected", false)
+ logger.debug("tnConstituentSliceProfiles list from OOF " + sliceProfiles)
+ }
+ } else {
+ String statusMessage = jsonUtil.getJsonValue(oofResponse, "statusMessage")
+ logger.error("received failed status from oof " + statusMessage)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, "Received a failed Async Response from OOF : " + statusMessage)
+ }
+
+ logger.debug(Prefix + "processOofSelection method finished")
+ }
+
+ void updateAAIOrchStatus(DelegateExecution execution) {
+ logger.debug("Start updateAAIOrchStatus")
+ String sliceServiceInstanceId = execution.getVariable("sliceServiceInstanceId")
+ String orchStatus = execution.getVariable("orchestrationStatus")
+
+ try {
+ ServiceInstance si = new ServiceInstance()
+ si.setOrchestrationStatus(orchStatus)
+ AAIResourcesClient client = new AAIResourcesClient()
+ AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, sliceServiceInstanceId)
+ client.update(uri, si)
+ } catch (BpmnError e) {
+ throw e
+ } catch (Exception ex) {
+ String msg = "Exception in CreateSliceService.updateAAIOrchStatus " + ex.getMessage()
+ logger.info(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg)
+ }
+
+ logger.debug("Finish updateAAIOrchStatus")
+ }
+
+
+ void prepareUpdateJobStatus(DelegateExecution execution,
+ String status,
+ String progress,
+ String statusDescription) {
+ String serviceId = execution.getVariable("sliceServiceInstanceId")
+ String jobId = execution.getVariable("jobId")
+ String nsiId = execution.getVariable("nsiId")
+
+ ResourceOperationStatus roStatus = new ResourceOperationStatus()
+ roStatus.setServiceId(serviceId)
+ roStatus.setOperationId(jobId)
+ roStatus.setResourceTemplateUUID(nsiId)
+ roStatus.setOperType("Allocate")
+ roStatus.setProgress(progress)
+ roStatus.setStatus(status)
+ roStatus.setStatusDescription(statusDescription)
+ requestDBUtil.prepareUpdateResourceOperationStatus(execution, status)
+ }
+
+}
+
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy
new file mode 100644
index 0000000000..a1b883c34e
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/TnNssmfUtils.groovy
@@ -0,0 +1,244 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.so.bpmn.infrastructure.scripts
+
+
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.MsoUtils
+import org.onap.so.bpmn.common.scripts.SDNCAdapterUtils
+import org.onap.so.bpmn.core.RollbackData
+import org.onap.so.bpmn.core.UrnPropertiesReader
+import org.onap.so.bpmn.core.WorkflowException
+import org.onap.so.bpmn.core.json.JsonUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+import static org.apache.commons.lang3.StringUtils.isBlank
+
+class TnNssmfUtils {
+ private static final Logger logger = LoggerFactory.getLogger(TnNssmfUtils.class);
+
+
+ ExceptionUtil exceptionUtil = new ExceptionUtil()
+ JsonUtils jsonUtil = new JsonUtils()
+ MsoUtils msoUtils = new MsoUtils()
+ SDNCAdapterUtils sdncAdapterUtils = new SDNCAdapterUtils()
+
+ TnNssmfUtils() {
+ }
+
+
+ void setSdncCallbackUrl(DelegateExecution execution, boolean exceptionOnErr) {
+ setSdncCallbackUrl(execution, "sdncCallbackUrl", exceptionOnErr)
+ }
+
+ void setSdncCallbackUrl(DelegateExecution execution, String variableName, boolean exceptionOnErr) {
+ String sdncCallbackUrl = UrnPropertiesReader.getVariable('mso.workflow.sdncadapter.callback', execution)
+
+ if (isBlank(sdncCallbackUrl) && exceptionOnErr) {
+ String msg = "mso.workflow.sdncadapter.callback is null"
+ logger.debug(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ } else {
+ execution.setVariable(variableName, sdncCallbackUrl)
+ }
+ }
+
+ String buildSDNCRequest(DelegateExecution execution, String svcInstId, String action) {
+
+ String uuid = execution.getVariable('testReqId') // for junits
+ if (uuid == null) {
+ uuid = execution.getVariable("msoRequestId") + "-" + System.currentTimeMillis()
+ }
+
+ def callbackURL = execution.getVariable("sdncCallbackUrl")
+ def requestId = execution.getVariable("msoRequestId")
+ def serviceId = execution.getVariable("sliceServiceInstanceId")
+ def vnfType = execution.getVariable("serviceType")
+ def vnfName = execution.getVariable("sliceServiceInstanceName")
+ def tenantId = execution.getVariable("sliceServiceInstanceId")
+ def source = execution.getVariable("sliceServiceInstanceId")
+ def vnfId = execution.getVariable("sliceServiceInstanceId")
+ def cloudSiteId = execution.getVariable("sliceServiceInstanceId")
+ def serviceModelInfo = execution.getVariable("serviceModelInfo")
+ def vnfModelInfo = execution.getVariable("serviceModelInfo")
+ def globalSubscriberId = execution.getVariable("globalSubscriberId")
+
+ String vnfNameString = """<vnf-name>${MsoUtils.xmlEscape(vnfName)}</vnf-name>"""
+ String serviceEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(serviceModelInfo)
+ String vnfEcompModelInformation = sdncAdapterUtils.modelInfoToEcompModelInformation(vnfModelInfo)
+
+ String sdncVNFParamsXml = ""
+
+ if (execution.getVariable("vnfParamsExistFlag") == true) {
+ sdncVNFParamsXml = buildSDNCParamsXml(execution)
+ } else {
+ sdncVNFParamsXml = ""
+ }
+
+ String sdncRequest =
+ """<sdncadapterworkflow:SDNCAdapterWorkflowRequest xmlns:ns5="http://org.onap/so/request/types/v1"
+ xmlns:sdncadapterworkflow="http://org.onap/so/workflow/schema/v1"
+ xmlns:sdncadapter="http://org.onap/workflow/sdnc/adapter/schema/v1">
+ <sdncadapter:RequestHeader>
+ <sdncadapter:RequestId>${MsoUtils.xmlEscape(uuid)}</sdncadapter:RequestId>
+ <sdncadapter:SvcInstanceId>${MsoUtils.xmlEscape(svcInstId)}</sdncadapter:SvcInstanceId>
+ <sdncadapter:SvcAction>${MsoUtils.xmlEscape(action)}</sdncadapter:SvcAction>
+ <sdncadapter:SvcOperation>vnf-topology-operation</sdncadapter:SvcOperation>
+ <sdncadapter:CallbackUrl>${MsoUtils.xmlEscape(callbackURL)}</sdncadapter:CallbackUrl>
+ <sdncadapter:MsoAction>generic-resource</sdncadapter:MsoAction>
+ </sdncadapter:RequestHeader>
+ <sdncadapterworkflow:SDNCRequestData>
+ <request-information>
+ <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+ <request-action>AllocateTnNssi</request-action>
+ <source>${MsoUtils.xmlEscape(source)}</source>
+ <notification-url/>
+ <order-number/>
+ <order-version/>
+ </request-information>
+ <service-information>
+ <service-id>${MsoUtils.xmlEscape(serviceId)}</service-id>
+ <subscription-service-type>${MsoUtils.xmlEscape(serviceId)}</subscription-service-type>
+ ${serviceEcompModelInformation}
+ <service-instance-id>${MsoUtils.xmlEscape(svcInstId)}</service-instance-id>
+ <global-customer-id>${MsoUtils.xmlEscape(globalSubscriberId)}</global-customer-id>
+ </service-information>
+ <vnf-information>
+ <vnf-id>${MsoUtils.xmlEscape(vnfId)}</vnf-id>
+ <vnf-type>${MsoUtils.xmlEscape(vnfType)}</vnf-type>
+ ${vnfEcompModelInformation}
+ </vnf-information>
+ <vnf-request-input>
+ ${vnfNameString}
+ <tenant>${MsoUtils.xmlEscape(tenantId)}</tenant>
+ <aic-cloud-region>${MsoUtils.xmlEscape(cloudSiteId)}</aic-cloud-region>
+ ${sdncVNFParamsXml}
+ </vnf-request-input>
+ </sdncadapterworkflow:SDNCRequestData>
+ </sdncadapterworkflow:SDNCAdapterWorkflowRequest>"""
+
+ logger.debug("sdncRequest: " + sdncRequest)
+ return sdncRequest
+ }
+
+ String buildSDNCParamsXml(DelegateExecution execution) {
+ String params = ""
+ StringBuilder sb = new StringBuilder()
+ Map<String, String> paramsMap = execution.getVariable("TNNSSMF_vnfParamsMap")
+
+ for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
+ String paramsXml
+ String key = entry.getKey();
+ String value = entry.getValue()
+ paramsXml = """<${key}>$value</$key>"""
+ params = sb.append(paramsXml)
+ }
+ return params
+ }
+
+ void validateSDNCResponse(DelegateExecution execution, String response, String method) {
+ validateSDNCResponse(execution, response, method, true)
+ }
+
+ void validateSDNCResponse(DelegateExecution execution, String response, String method, boolean exceptionOnErr) {
+ logger.debug("STARTED ValidateSDNCResponse Process")
+
+ String msg
+
+ String prefix = execution.setVariable("prefix")
+ if (isBlank(prefix)) {
+ if (exceptionOnErr) {
+ msg = "validateSDNCResponse: prefix is null"
+ logger.error(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+ return
+ }
+
+ WorkflowException workflowException = execution.getVariable("WorkflowException")
+ boolean successIndicator = execution.getVariable("SDNCA_SuccessIndicator")
+
+ logger.debug("workflowException: " + workflowException)
+
+ sdncAdapterUtils.validateSDNCResponse(execution, response, workflowException, successIndicator)
+
+ String sdncResponse = response
+ if (execution.getVariable(prefix + 'sdncResponseSuccess') == true) {
+ logger.debug("Received a Good Response from SDNC Adapter for " + method + " SDNC Call. Response is: \n" + sdncResponse)
+ RollbackData rollbackData = execution.getVariable("rollbackData")
+
+ if (method.equals("allocate")) {
+ rollbackData.put("VNFMODULE", "rollbackSDNCRequestAllocate", "true")
+ } else if (method.equals("deallocate")) {
+ rollbackData.put("VNFMODULE", "rollbackSDNCRequestDeallocate", "true")
+ } else if (method.equals("activate")) {
+ rollbackData.put("VNFMODULE", "rollbackSDNCRequestActivate", "true")
+ } else if (method.equals("deactivate")) {
+ rollbackData.put("VNFMODULE", "rollbackSDNCRequestDeactivate", "true")
+ } else if (method.equals("modify")) {
+ rollbackData.put("VNFMODULE", "rollbackSDNCRequestModify", "true")
+ }
+ execution.setVariable("rollbackData", rollbackData)
+ } else {
+ if (exceptionOnErr) {
+ msg = "validateSDNCResponse: bad Response from SDNC Adapter for " + method + " SDNC Call."
+ logger.error(msg)
+ exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg)
+ }
+ }
+
+ logger.debug("COMPLETED ValidateSDNCResponse Process")
+ }
+
+ String getExecutionInputParams(DelegateExecution execution) {
+ String res = "msoRequestId=" + execution.getVariable("msoRequestId") +
+ ", modelInvariantUuid=" + execution.getVariable("modelInvariantUuid") +
+ ", modelUuid=" + execution.getVariable("modelUuid") +
+ ", serviceInstanceID=" + execution.getVariable("serviceInstanceID") +
+ ", operationType=" + execution.getVariable("operationType") +
+ ", globalSubscriberId=" + execution.getVariable("globalSubscriberId") +
+ ", dummyServiceId=" + execution.getVariable("dummyServiceId") +
+ ", nsiId=" + execution.getVariable("nsiId") +
+ ", networkType=" + execution.getVariable("networkType") +
+ ", subscriptionServiceType=" + execution.getVariable("subscriptionServiceType") +
+ ", jobId=" + execution.getVariable("jobId") +
+ ", sliceParams=" + execution.getVariable("sliceParams") +
+ ", servicename=" + execution.getVariable("servicename")
+
+ return res
+ }
+
+ String getFirstSnssaiFromSliceProfile(String sliceProfileStr) {
+ String snssaiListStr = jsonUtil.getJsonValue(sliceProfileStr, "snssaiList")
+ String snssai = jsonUtil.StringArrayToList(snssaiListStr).get(0)
+
+ return snssai
+ }
+
+ String getFirstPlmnIdFromSliceProfile(String sliceProfileStr) {
+ String plmnListStr = jsonUtil.getJsonValue(sliceProfileStr, "plmnIdList")
+ String res = jsonUtil.StringArrayToList(plmnListStr).get(0)
+
+ return res
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssiTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssiTest.groovy
new file mode 100644
index 0000000000..93557a48cf
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoActivateTnNssiTest.groovy
@@ -0,0 +1,178 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.onap.so.bpmn.common.scripts.MsoGroovyTest
+
+import static org.junit.Assert.assertNotNull
+import static org.mockito.ArgumentMatchers.eq
+import static org.mockito.Mockito.*
+
+class DoActivateTnNssiTest extends MsoGroovyTest {
+ @Before
+ void init() throws IOException {
+ super.init("DoActivateTnNssiTest")
+ }
+
+ @Captor
+ static ArgumentCaptor<ExecutionEntity> captor = ArgumentCaptor.forClass(ExecutionEntity.class)
+
+ @Test
+ void testPreProcessRequest() {
+ when(mockExecution.getVariable("msoRequestId")).thenReturn("4c614769-f58a-4556-8ad9-dcd903077c82")
+ when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://localhost:8090/SDNCAdapterCallback")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("serviceInstanceID")).thenReturn("eb0863e9-a69b-4b17-8a56-f05ad110bef7")
+ when(mockExecution.getVariable("operationId")).thenReturn("998c2081-5a71-4a39-9ae6-d6b7c5bb50c0")
+ when(mockExecution.getVariable("operationType")).thenReturn("opTypeTest")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("servicename")).thenReturn("5G-test")
+ when(mockExecution.getVariable("networkType")).thenReturn("5G-network")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G-service")
+ when(mockExecution.getVariable("nsiId")).thenReturn("88f65519-9a38-4c4b-8445-9eb4a5a5af56")
+ when(mockExecution.getVariable("jobId")).thenReturn("f70e927b-6087-4974-9ef8-c5e4d5847ca4")
+ when(mockExecution.getVariable("operationType")).thenReturn("activateInstance")
+ when(mockExecution.getVariable("sliceParams")).thenReturn(mockSliceParams())
+
+ DoActivateTnNssi obj = new DoActivateTnNssi()
+ obj.preProcessRequest(mockExecution)
+ Mockito.verify(mockExecution, times(1)).setVariable(eq("sliceServiceInstanceId"), captor.capture())
+ String sliceServiceInstanceId = captor.getValue()
+ assertNotNull(sliceServiceInstanceId)
+ }
+
+ @Test
+ void testPreprocessSdncRequest() {
+ when(mockExecution.getVariable("msoRequestId")).thenReturn("4c614769-f58a-4556-8ad9-dcd903077c82")
+ when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://localhost:8090/SDNCAdapterCallback")
+ when(mockExecution.getVariable("sliceServiceInstanceId")).thenReturn("5ad89cf9-0569-4a93-9306-d8324321e2be")
+ when(mockExecution.getVariable("sliceServiceInstanceName")).thenReturn("5G-service")
+ when(mockExecution.getVariable("actionType")).thenReturn("activate")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("sliceParams")).thenReturn(mockSliceParams())
+ when(mockExecution.getVariable("serviceModelInfo")).thenReturn(mockServiceModelInfo())
+// JsonUtils jsonUtil = new JsonUtils()
+// String sliceProfile = jsonUtil.getJsonValue(mockSliceParams(), "sliceProfile")
+// when(mockExecution.getVariable("sliceProfile")).thenReturn(sliceProfile)
+
+ DoActivateTnNssi obj = spy(DoActivateTnNssi.class)
+
+ obj.preprocessSdncActOrDeactTnNssiRequest(mockExecution)
+ Mockito.verify(mockExecution, times(1)).setVariable(eq("TNNSSMF_SDNCRequest"), captor.capture())
+ String request = captor.getValue()
+ assertNotNull(request)
+ }
+
+
+ private String mockSliceParams() {
+ String expect = """{
+ "sliceProfile": {
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ },
+ "transportSliceNetworks": [
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_XXX",
+ "transportEndpointB": "tranportEp_ID_YYY"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_AAA",
+ "transportEndpointB": "tranportEp_ID_BBB"
+ }
+ ]
+ },
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_CCC",
+ "transportEndpointB": "tranportEp_ID_DDD"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_EEE",
+ "transportEndpointB": "tranportEp_ID_FFF"
+ }
+ ]
+ }
+ ],
+ "nsiInfo": {
+ "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX",
+ "nsiName": "eMBB-001"
+ },
+ "scriptName": "AN1"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+
+ private String mockSliceProfile() {
+ String expect = """{
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+
+ private String mockServiceModelInfo() {
+ String expect = """{
+ "modelInvariantUuid":"f85cbcc0-ad74-45d7-a5a1-17c8744fdb71",
+ "modelUuid":"36a3a8ea-49a6-4ac8-b06c-89a54544b9b6",
+ "modelVersion":""
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateTnNssiTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateTnNssiTest.groovy
new file mode 100644
index 0000000000..33110b6e5b
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoAllocateTnNssiTest.groovy
@@ -0,0 +1,167 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.MsoGroovyTest
+
+import static org.junit.Assert.assertNotNull
+import static org.mockito.ArgumentMatchers.eq
+import static org.mockito.Mockito.*
+
+class DoAllocateTnNssiTest extends MsoGroovyTest {
+ @Before
+ void init() throws IOException {
+ super.init("DoAllocateTnNssiTest")
+ }
+
+ @Captor
+ static ArgumentCaptor<ExecutionEntity> captor = ArgumentCaptor.forClass(ExecutionEntity.class)
+
+ @Test
+ void testPreProcessRequest() {
+ when(mockExecution.getVariable("msoRequestId")).thenReturn("4c614769-f58a-4556-8ad9-dcd903077c82")
+ when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://localhost:8090/SDNCAdapterCallback")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ //when(mockExecution.getVariable("serviceInstanceID")).thenReturn("eb0863e9-a69b-4b17-8a56-f05ad110bef7")
+ //when(mockExecution.getVariable("operationId")).thenReturn("998c2081-5a71-4a39-9ae6-d6b7c5bb50c0")
+ when(mockExecution.getVariable("operationType")).thenReturn("opTypeTest")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("servicename")).thenReturn("5G-test")
+ when(mockExecution.getVariable("networkType")).thenReturn("5G-network")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G-service")
+ when(mockExecution.getVariable("nsiId")).thenReturn("88f65519-9a38-4c4b-8445-9eb4a5a5af56")
+ when(mockExecution.getVariable("jobId")).thenReturn("f70e927b-6087-4974-9ef8-c5e4d5847ca4")
+ when(mockExecution.getVariable("sliceParams")).thenReturn(mockSliceParams())
+
+ TnAllocateNssi obj = new TnAllocateNssi()
+ obj.preProcessRequest(mockExecution)
+ Mockito.verify(mockExecution, times(1)).setVariable(eq("sliceServiceInstanceId"), captor.capture())
+ String sliceServiceInstanceId = captor.getValue()
+ assertNotNull(sliceServiceInstanceId)
+ }
+
+ @Test
+ void testCreateServiceInstance() {
+ when(mockExecution.getVariable("sliceServiceInstanceId")).thenReturn("5ad89cf9-0569-4a93-9306-d8324321e2be")
+ when(mockExecution.getVariable("sliceServiceInstanceName")).thenReturn("5G-service")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("sliceProfile")).thenReturn(mockSliceProfile())
+
+// JsonUtils jsonUtil = new JsonUtils()
+// String sliceProfile = jsonUtil.getJsonValue(mockSliceParams(), "sliceProfile")
+// when(mockExecution.getVariable("sliceProfile")).thenReturn(sliceProfile)
+
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "5GCustomer", "5G", "5ad89cf9-0569-4a93-9306-d8324321e2be")
+ DoCreateTnNssiInstance obj = spy(DoCreateTnNssiInstance.class)
+ when(obj.getAAIClient()).thenReturn(client)
+
+ obj.createServiceInstance(mockExecution)
+ }
+
+
+ private String mockSliceParams() {
+ String expect = """{
+ "sliceProfile": {
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ },
+ "transportSliceNetworks": [
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_XXX",
+ "transportEndpointB": "tranportEp_ID_YYY"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_AAA",
+ "transportEndpointB": "tranportEp_ID_BBB"
+ }
+ ]
+ },
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_CCC",
+ "transportEndpointB": "tranportEp_ID_DDD"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_EEE",
+ "transportEndpointB": "tranportEp_ID_FFF"
+ }
+ ]
+ }
+ ],
+ "nsiInfo": {
+ "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX",
+ "nsiName": "eMBB-001"
+ },
+ "scriptName": "AN1"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+
+ private String mockSliceProfile() {
+ String expect = """{
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssiTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssiTest.groovy
new file mode 100644
index 0000000000..eac79a9473
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateTnNssiTest.groovy
@@ -0,0 +1,135 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.MsoGroovyTest
+
+import static org.junit.Assert.assertNotNull
+import static org.mockito.ArgumentMatchers.eq
+import static org.mockito.Mockito.*
+
+class DoDeallocateTnNssiTest extends MsoGroovyTest {
+ @Before
+ void init() throws IOException {
+ super.init("DeallocateTnNssiTest")
+ }
+
+ @Captor
+ static ArgumentCaptor<ExecutionEntity> captor = ArgumentCaptor.forClass(ExecutionEntity.class)
+
+ @Test
+ void testPreProcessRequest() {
+ when(mockExecution.getVariable("msoRequestId")).thenReturn("4c614769-f58a-4556-8ad9-dcd903077c82")
+ when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://localhost:8090/SDNCAdapterCallback")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("serviceInstanceID")).thenReturn("eb0863e9-a69b-4b17-8a56-f05ad110bef7")
+ when(mockExecution.getVariable("operationId")).thenReturn("998c2081-5a71-4a39-9ae6-d6b7c5bb50c0")
+ when(mockExecution.getVariable("operationType")).thenReturn("opTypeTest")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("servicename")).thenReturn("5G-test")
+ when(mockExecution.getVariable("networkType")).thenReturn("5G-network")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G-service")
+ when(mockExecution.getVariable("nsiId")).thenReturn("88f65519-9a38-4c4b-8445-9eb4a5a5af56")
+ when(mockExecution.getVariable("jobId")).thenReturn("f70e927b-6087-4974-9ef8-c5e4d5847ca4")
+ when(mockExecution.getVariable("sliceParams")).thenReturn("""
+ {
+ "sliceProfile": {
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ },
+ "transportSliceNetworks": [
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_XXX",
+ "transportEndpointB": "tranportEp_ID_YYY"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_AAA",
+ "transportEndpointB": "tranportEp_ID_BBB"
+ }
+ ]
+ },
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_CCC",
+ "transportEndpointB": "tranportEp_ID_DDD"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_EEE",
+ "transportEndpointB": "tranportEp_ID_FFF"
+ }
+ ]
+ }
+ ],
+ "nsiInfo": {
+ "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX",
+ "nsiName": "eMBB-001"
+ },
+ "scriptName": "AN1"
+ }""".replaceAll("\\\\s+", ""))
+
+ DoDeallocateTnNssi runScript = new DoDeallocateTnNssi()
+ runScript.preProcessRequest(mockExecution)
+ Mockito.verify(mockExecution, times(1)).setVariable(eq("sliceServiceInstanceId"), captor.capture())
+ String sliceServiceInstanceId = captor.getValue()
+ assertNotNull(sliceServiceInstanceId)
+ }
+
+ @Test
+ void testDeleteServiceInstance() {
+ when(mockExecution.getVariable("serviceInstanceID")).thenReturn("5ad89cf9-0569-4a93-9306-d8324321e2be")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G")
+
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "5GCustomer", "5G", "5ad89cf9-0569-4a93-9306-d8324321e2be")
+ DoDeallocateTnNssi obj = spy(DoDeallocateTnNssi.class)
+ when(obj.getAAIClient()).thenReturn(client)
+ doNothing().when(client).delete(serviceInstanceUri)
+
+ obj.deleteServiceInstance(mockExecution)
+ Mockito.verify(client, times(1)).delete(serviceInstanceUri)
+ }
+}
diff --git a/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssiTest.groovy b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssiTest.groovy
new file mode 100644
index 0000000000..bbbec3bb46
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/test/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyTnNssiTest.groovy
@@ -0,0 +1,174 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+ * ================================================================================
+ #
+ # Licensed under the Apache License, Version 2.0 (the "License")
+ # you may not use this file except in compliance with the License.
+ # You may obtain a copy of the License at
+ #
+ # http://www.apache.org/licenses/LICENSE-2.0
+ #
+ # Unless required by applicable law or agreed to in writing, software
+ # distributed under the License is distributed on an "AS IS" BASIS,
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity
+import org.junit.Before
+import org.junit.Test
+import org.mockito.ArgumentCaptor
+import org.mockito.Captor
+import org.mockito.Mockito
+import org.onap.aaiclient.client.aai.AAIObjectType
+import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri
+import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory
+import org.onap.so.bpmn.common.scripts.MsoGroovyTest
+
+import static org.junit.Assert.assertNotNull
+import static org.mockito.ArgumentMatchers.eq
+import static org.mockito.Mockito.*
+
+class DoModifyTnNssiTest extends MsoGroovyTest {
+ @Before
+ void init() throws IOException {
+ super.init("DoModifyTnNssiTest")
+ }
+
+ @Captor
+ static ArgumentCaptor<ExecutionEntity> captor = ArgumentCaptor.forClass(ExecutionEntity.class)
+
+ @Test
+ void testPreProcessRequest() {
+ when(mockExecution.getVariable("msoRequestId")).thenReturn("4c614769-f58a-4556-8ad9-dcd903077c82")
+ when(mockExecution.getVariable("mso.workflow.sdncadapter.callback")).thenReturn("http://localhost:8090/SDNCAdapterCallback")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("serviceInstanceID")).thenReturn("eb0863e9-a69b-4b17-8a56-f05ad110bef7")
+ when(mockExecution.getVariable("operationId")).thenReturn("998c2081-5a71-4a39-9ae6-d6b7c5bb50c0")
+ when(mockExecution.getVariable("operationType")).thenReturn("opTypeTest")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("servicename")).thenReturn("5G-test")
+ when(mockExecution.getVariable("networkType")).thenReturn("5G-network")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G-service")
+ when(mockExecution.getVariable("nsiId")).thenReturn("88f65519-9a38-4c4b-8445-9eb4a5a5af56")
+ when(mockExecution.getVariable("jobId")).thenReturn("f70e927b-6087-4974-9ef8-c5e4d5847ca4")
+ when(mockExecution.getVariable("operationType")).thenReturn("activateInstance")
+ when(mockExecution.getVariable("sliceParams")).thenReturn(mockSliceParams())
+
+ DoModifyTnNssi obj = new DoModifyTnNssi()
+ obj.preProcessRequest(mockExecution)
+ Mockito.verify(mockExecution, times(1)).setVariable(eq("sliceServiceInstanceId"), captor.capture())
+ String sliceServiceInstanceId = captor.getValue()
+ assertNotNull(sliceServiceInstanceId)
+ }
+
+ @Test
+ void testUpdateServiceInstance() {
+ when(mockExecution.getVariable("sliceServiceInstanceId")).thenReturn("5ad89cf9-0569-4a93-9306-d8324321e2be")
+ when(mockExecution.getVariable("sliceServiceInstanceName")).thenReturn("5G-service")
+ when(mockExecution.getVariable("globalSubscriberId")).thenReturn("5GCustomer")
+ when(mockExecution.getVariable("subscriptionServiceType")).thenReturn("5G")
+ when(mockExecution.getVariable("sliceProfileId")).thenReturn("5ad89cf9-0569-4a93-9306-d8324321e2b1")
+ when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("f85cbcc0-ad74-45d7-a5a1-17c8744fdb71")
+ when(mockExecution.getVariable("modelUuid")).thenReturn("36a3a8ea-49a6-4ac8-b06c-89a54544b9b6")
+ when(mockExecution.getVariable("sliceProfile")).thenReturn(mockSliceProfile())
+
+ AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, "5GCustomer", "5G", "5ad89cf9-0569-4a93-9306-d8324321e2be")
+ DoModifyTnNssi obj = spy(DoModifyTnNssi.class)
+ when(obj.getAAIClient()).thenReturn(client)
+
+ obj.updateServiceInstance(mockExecution)
+ }
+
+
+ private String mockSliceParams() {
+ String expect = """{
+ "sliceProfile": {
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ },
+ "transportSliceNetworks": [
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_XXX",
+ "transportEndpointB": "tranportEp_ID_YYY"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_AAA",
+ "transportEndpointB": "tranportEp_ID_BBB"
+ }
+ ]
+ },
+ {
+ "connectionLinks": [
+ {
+ "transportEndpointA": "tranportEp_ID_CCC",
+ "transportEndpointB": "tranportEp_ID_DDD"
+ },
+ {
+ "transportEndpointA": "tranportEp_ID_EEE",
+ "transportEndpointB": "tranportEp_ID_FFF"
+ }
+ ]
+ }
+ ],
+ "nsiInfo": {
+ "nsiId": "NSI-M-001-HDBNJ-NSMF-01-A-ZX",
+ "nsiName": "eMBB-001"
+ },
+ "scriptName": "AN1"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+
+ private String mockSliceProfile() {
+ String expect = """{
+ "snssaiList": [
+ "001-100001"
+ ],
+ "sliceProfileId": "ab9af40f13f721b5f13539d87484098",
+ "plmnIdList": [
+ "460-00",
+ "460-01"
+ ],
+ "perfReq": {
+ },
+ "coverageAreaTAList": [
+ ],
+ "latency": 2,
+ "maxBandwidth": 100,
+ "resourceSharingLevel": "non-shared"
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+
+ private String mockServiceModelInfo() {
+ String expect = """{
+ "modelInvariantUuid":"f85cbcc0-ad74-45d7-a5a1-17c8744fdb71",
+ "modelUuid":"36a3a8ea-49a6-4ac8-b06c-89a54544b9b6",
+ "modelVersion":""
+ }"""
+ return expect.replaceAll("\\\\s+", "")
+ }
+}