diff options
Diffstat (limited to 'bpmn/so-bpmn-infrastructure-common/src')
2 files changed, 175 insertions, 66 deletions
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 index 09bbb81b6b..b1436d5d06 100644 --- 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 @@ -20,10 +20,16 @@ package org.onap.so.bpmn.infrastructure.scripts +import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper +import org.json.JSONArray import com.google.gson.JsonArray +import com.google.gson.GsonBuilder import com.google.gson.JsonObject +import com.google.gson.JsonParser import groovy.json.JsonSlurper +import org.onap.so.bpmn.common.scripts.OofUtils +import com.google.gson.Gson import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution import org.onap.aai.domain.yang.ServiceInstance @@ -53,6 +59,7 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { RequestDBUtil requestDBUtil = new RequestDBUtil() JsonSlurper jsonSlurper = new JsonSlurper() ObjectMapper objectMapper = new ObjectMapper() + OofUtils oofUtils = new OofUtils() TnNssmfUtils tnNssmfUtils = new TnNssmfUtils() private static final Logger logger = LoggerFactory.getLogger(TnAllocateNssi.class) @@ -96,7 +103,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { msg = "Input sliceProfile is null" logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) - } else { + } + else { execution.setVariable("sliceProfile", sliceProfile) } @@ -105,7 +113,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { msg = "Input transportSliceNetworks is null" logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) - } else { + } + else { execution.setVariable("transportSliceNetworks", transportSliceNetworks) } logger.debug("transportSliceNetworks: " + transportSliceNetworks) @@ -115,7 +124,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { msg = "Input nsiInfo is null" logger.debug(msg) exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) - } else { + } + else { execution.setVariable("nsiInfo", nsiInfoStr) } @@ -123,6 +133,14 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { "enableSdnc", "enableSdnc"))) { tnNssmfUtils.setEnableSdncConfig(execution) } + + if (isBlank(additionalPropJsonStr) || + isBlank(tnNssmfUtils.setExecVarFromJsonIfExists(execution, + additionalPropJsonStr, + "enableOof", "enableOof"))) { + tnNssmfUtils.setEnableOofConfig(execution) + } + } catch (BpmnError e) { throw e } catch (Exception ex) { @@ -169,6 +187,7 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { //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) { @@ -188,7 +207,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { String msg = "Exception in TN NSST processDecomposition. There is no NSST associated with TN NSST " logger.info(msg) //exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) - } else { + } + else { execution.setVariable("tnNsstInfoList", nsstInfoList) execution.setVariable("tnModelVersion", tnModelVersion) execution.setVariable("tnModelName", tnModelName) @@ -196,6 +216,8 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { execution.setVariable("maxIndex", maxIndex) } + execution.setVariable("tnNfSliceProfile", execution.getVariable("sliceProfile")) + execution.setVariable("tnModelName", tnModelName) logger.debug("End processDecomposition") } @@ -205,90 +227,52 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { 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 messageType = "NSSISelectionResponse" + Map<String, Object> profileInfo = (Map<String, Object>) objectMapper.readValue(execution.getVariable("tnNfSliceProfile"), 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_Url", "/api/oof/selection/nssi/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) + String oofRequest = oofUtils.buildSelectNSSIRequest(requestId, messageType, modelUuid, modelInvariantUuid, modelName, profileInfo) 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) + String solutions = jsonUtil.getJsonValue(oofResponse, "solutions") + JsonParser parser = new JsonParser() + JsonArray solution = parser.parse(solutions) as JsonArray + if (solution.size() >= 1) { + JsonObject sol = solution.get(0) as JsonObject + String tnNfNssiId = sol.get("NSSIId").getAsString() + String invariantUuid = sol.get("invariantUUID").getAsString() + String uuid = sol.get("UUID").getAsString() + String nssiName = sol.get("NSSIName").getAsString() + execution.setVariable("TnServiceInstanceId", tnNfNssiId) + execution.setVariable("TNNFInvariantUUID", invariantUuid) + execution.setVariable("TNNFUUID", uuid) + execution.setVariable("servicename", nssiName) + logger.debug("TnServiceInstanceId from OOF " + tnNfNssiId) execution.setVariable("isOofTnNssiSelected", true) - } else { - def sliceProfiles = jsonUtil.getJsonValue(solution.get(0), "newNSISolution.sliceProfiles") - execution.setVariable("tnConstituentSliceProfiles", sliceProfiles) + } + else { + logger.debug("No solutions returned from OOF .. Create new TN NF NSSI") execution.setVariable("isOofTnNssiSelected", false) - logger.debug("tnConstituentSliceProfiles list from OOF " + sliceProfiles) } - } else { + } + 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) @@ -297,6 +281,77 @@ class TnAllocateNssi extends AbstractServiceTaskProcessor { logger.debug(Prefix + "processOofSelection method finished") } + void prepareModifyTnNssiInputs(DelegateExecution execution) { + logger.debug(Prefix + "prepareModifyTnNssiInputs method start") + String jobId = UUID.randomUUID().toString() + execution.setVariable("modifyTnNssiJobId", jobId) + String additionalPropJsonStr = execution.getVariable("sliceParams") + String sliceProfile = execution.getVariable("sliceProfile") + String snssaiList = jsonUtil.getJsonValue(sliceProfile, "snssaiList") + String sliceProfileId = jsonUtil.getJsonValue(sliceProfile, "sliceProfileId") + String nsiInfo = jsonUtil.getJsonValue(additionalPropJsonStr, "nsiInfo") + String scriptName = jsonUtil.getJsonValue(additionalPropJsonStr, "scriptName") + String modelInvariantUuid = execution.getVariable("modelInvariantUuid") + String modelUuid = execution.getVariable("modelUuid") + String serviceInstanceID = execution.getVariable("TnServiceInstanceId") + String servicename = execution.getVariable("servicename") + String transportSliceNetworks = jsonUtil.getJsonValue(additionalPropJsonStr, "transportSliceNetworks") + + JsonObject modifySliceParams = new JsonObject() + modifySliceParams.addProperty("nsiInfo", nsiInfo) + modifySliceParams.addProperty("serviceInstanceID", serviceInstanceID) + modifySliceParams.addProperty("servicename", servicename) + modifySliceParams.addProperty("sliceProfile", sliceProfile) + modifySliceParams.addProperty("sliceProfileId", sliceProfileId) + modifySliceParams.addProperty("modelInvariantUuid", modelInvariantUuid) + modifySliceParams.addProperty("modelUuid", modelUuid) + modifySliceParams.addProperty("scriptName", scriptName) + modifySliceParams.addProperty("snssaiList", snssaiList) + modifySliceParams.addProperty("transportSliceNetworks", transportSliceNetworks) + + execution.setVariable("modifySliceParams", modifySliceParams.toString()) + + logger.debug(Prefix + "prepareModifyTnNssiInputs method finished") + } + + def createModifyNssiQueryJobStatus = { DelegateExecution execution -> + logger.debug(Prefix + "createModifyNssiQueryJobStatus method start") + JsonObject esrInfo = new JsonObject() + esrInfo.addProperty("networkType", "tn") + esrInfo.addProperty("vendor", "ONAP_internal") + + execution.setVariable("esrInfo", esrInfo.toString()) + + JsonObject serviceInfo = new JsonObject() + serviceInfo.addProperty("nssiId", execution.getVariable("TnServiceInstanceId") as String) + serviceInfo.addProperty("nsiId", execution.getVariable("nsiId") as String) + serviceInfo.addProperty("nssiName", execution.getVariable("servicename") as String) + serviceInfo.addProperty("sST", execution.getVariable("sst") as String) + serviceInfo.addProperty("PLMNIdList", objectMapper.writeValueAsString(execution.getVariable("pLMNIdList"))) + serviceInfo.addProperty("globalSubscriberId", execution.getVariable("globalSubscriberId") as String) + serviceInfo.addProperty("subscriptionServiceType", execution.getVariable("subscriptionServiceType") as String) + serviceInfo.addProperty("serviceInvariantUuid", execution.getVariable("modelInvariantUuid") as String) + serviceInfo.addProperty("serviceUuid", execution.getVariable("modelUuid") as String) + execution.setVariable("serviceInfo", serviceInfo.toString()) + execution.setVariable("responseId", "") + } + + 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, "status") + String nssi = jsonUtil.getJsonValue(jobResponse, "nssiId") + if (status.equalsIgnoreCase("finished")) { + logger.debug("Job successfully completed ... proceeding with flow for nssi : " + nssi) + } + else { + String statusDescription = jsonUtil.getJsonValue(jobResponse, "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) + } + } + void updateAAIOrchStatus(DelegateExecution execution) { logger.debug("Start updateAAIOrchStatus") String sliceServiceInstanceId = execution.getVariable("sliceServiceInstanceId") 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 index 6ea2be8e55..b7cddd2d5a 100644 --- 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 @@ -31,9 +31,12 @@ import org.onap.aaiclient.client.aai.entities.uri.AAIResourceUri import org.onap.aaiclient.client.aai.entities.uri.AAIUriFactory import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder.Types +import org.onap.so.beans.nsmf.oof.TemplateInfo import org.onap.so.bpmn.common.scripts.MsoGroovyTest +import org.onap.so.bpmn.common.scripts.OofUtils import static org.junit.Assert.assertNotNull +import static org.junit.Assert.assertEquals import static org.mockito.ArgumentMatchers.eq import static org.mockito.Mockito.* @@ -166,4 +169,55 @@ class DoAllocateTnNssiTest extends MsoGroovyTest { }""" return expect.replaceAll("\\\\s+", "") } + + @Test + void testPrepareOofSelection() { + when(mockExecution.getVariable("msoRequestId")).thenReturn("10dad82d-4bd9-467a-b113-5f8ea7eaae3c") + when(mockExecution.getVariable("modelUuid")).thenReturn("e2eb2fe3-92a7-447b-8582-077db5cd0862") + when(mockExecution.getVariable("modelInvariantUuid")).thenReturn("22e6ce80-a55f-4171-a457-a7ecb1865669") + when(mockExecution.getVariable("tnModelName")).thenReturn("Tn_ONAP_internal_BH") + when(mockExecution.getVariable("mso.adapters.oof.timeout")).thenReturn("") + TnAllocateNssi obj = spy(TnAllocateNssi.class) + OofUtils oofUtils = spy(OofUtils.class) + String requestId = "10dad82d-4bd9-467a-b113-5f8ea7eaae3c" + String nsstInfo = "\"{\"UUID\":\"e2eb2fe3-92a7-447b-8582-077db5cd0862\",\"invariantUUID\":\"22e6ce80-a55f-4171-a457-a7ecb1865669\",\"name\":\"Tn_ONAP_internal_BH\"}" + String messageType = "NSSISelectionResponse" + String sliceProfile = "{\"maxBandwidth\":3000,\"sliceProfileId\":\"ab9af40f13f721b5f13539d87484098\",\"latency\":10,\"snssaiList\":[\"001-100001\"],\"pLMNIdList\":[\"460-00\",\"460-01\"],\"perfReq\":{},\"coverageAreaTAList\":[],\"resourceSharingLevel\":\"shared\"}}" + Integer timeout = 600 + + when(oofUtils.buildSelectNSSIRequest(requestId, nsstInfo as TemplateInfo, messageType, sliceProfile, timeout)).thenReturn(""" + { + "apiPath": "/api/oof/selection/nssi/v1", + "requestDetails": "{\\"requestInfo\\":{\\"transactionId\\":\\"10dad82d-4bd9-467a-b113-5f8ea7eaae3c\\",\\"requestId\\":\\"10dad82d-4bd9-467a-b113-5f8ea7eaae3c\\",\\"callbackUrl\\":\\"http://so-oof-adapter.onap:8090/so/adapters/oof/callback/v1/NSSISelectionResponse/10dad82d-4bd9-467a-b113-5f8ea7eaae3c\\",\\"sourceId\\":\\"SO\\",\\"timeout\\":600,\\"numSolutions\\":1},\\"NSSTInfo\\":{\\"UUID\\":\\"e2eb2fe3-92a7-447b-8582-077db5cd0862\\",\\"invariantUUID\\":\\"22e6ce80-a55f-4171-a457-a7ecb1865669\\",\\"name\\":\\"Tn_ONAP_internal_BH\\"},\\"sliceProfile\\":{\\"maxBandwidth\\":3000,\\"sliceProfileId\\":\\"ab9af40f13f721b5f13539d87484098\\",\\"latency\\":10,\\"snssaiList\\":[\\"001-100001\\"],\\"pLMNIdList\\":[\\"460-00\\",\\"460-01\\"],\\"perfReq\\":{},\\"coverageAreaTAList\\":[],\\"resourceSharingLevel\\":\\"shared\\"}}" + }""".replaceAll("\\\\s+", "")) + obj.prepareOofSelection(mockExecution) + verify(mockExecution, times(1)).setVariable(eq("nssiSelection_oofRequest"), captor.capture()) + String nssiSelection_oofRequest = captor.getValue() + assertNotNull(nssiSelection_oofRequest) + } + + @Test + void testprocessOofSelection() { + when(mockExecution.getVariable("nssiSelection_oofRequest")).thenReturn(""" + { + "requestId": "a727643a-bf89-4fd9-b33c-b7bdda18c2b7", + "transactionId": "a727643a-bf89-4fd9-b33c-b7bdda18c2b7", + "requestStatus": "completed", + "statusMessage": "", + "solutions": [ + { + "UUID": "e2eb2fe3-92a7-447b-8582-077db5cd0862", + "invariantUUID": "22e6ce80-a55f-4171-a457-a7ecb1865669", + "NSSIName": "nssi_tnservice12", + "NSSIId": "fe26a924-3845-4001-b84e-a439a27a88c0" + } + ] + }""".replaceAll("\\\\s+", "")) + TnAllocateNssi obj = spy(TnAllocateNssi.class) + ArrayList<String> solution = new ArrayList<>() + assertEquals(1, solution.size()) + verify(mockExecution, times(1)).setVariable(eq("isOofTnNssiSelected"), captor.capture()) + String isOofTnNssiSelected = captor.getValue() + assertEquals("true", isOofTnNssiSelected) + } } |