From 9fa22d016a6aa0d818831119c6bf2108449d9aba Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 23 Aug 2021 19:36:36 +0300 Subject: Changes in Modify and Deallocate Core NSSI flows Issue-ID: SO-3703 Change-Id: I22391ae0ff142fd6923cb62621fb537708a3cd19 Signed-off-by: Alex --- .../infrastructure/scripts/DoCommonCoreNSSI.groovy | 703 ++++++++++++++------- .../scripts/DoDeallocateCoreNSSI.groovy | 328 +++++++--- .../infrastructure/scripts/DoModifyCoreNSSI.groovy | 154 ++++- 3 files changed, 838 insertions(+), 347 deletions(-) (limited to 'bpmn/so-bpmn-infrastructure-common/src/main/groovy') diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCommonCoreNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCommonCoreNSSI.groovy index 646861a6a0..67e4b9227d 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCommonCoreNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCommonCoreNSSI.groovy @@ -21,6 +21,7 @@ package org.onap.so.bpmn.infrastructure.scripts import com.fasterxml.jackson.databind.ObjectMapper +import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution import org.json.JSONArray import org.json.JSONObject @@ -42,6 +43,7 @@ import org.onap.so.serviceinstancebeans.* import org.slf4j.Logger import org.slf4j.LoggerFactory +import javax.ws.rs.NotFoundException import javax.ws.rs.core.Response import static org.apache.commons.lang3.StringUtils.isBlank @@ -50,6 +52,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { private final String PREFIX ="DoCommonCoreNSSI" + private static final String SLICE_PROFILE_TEMPLATE = "{\"sliceProfileId\": \"%s\"}" + private static final Logger LOGGER = LoggerFactory.getLogger( DoCommonCoreNSSI.class) private JsonUtils jsonUtil = new JsonUtils() @@ -58,7 +62,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { @Override void preProcessRequest(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start preProcessRequest") + LOGGER.debug("${getPrefix()} Start preProcessRequest") def currentNSSI = execution.getVariable("currentNSSI") if (!currentNSSI) { @@ -89,19 +93,33 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { // Slice Profile - String sliceProfile = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "sliceProfile") - if (isBlank(sliceProfile)) { - String msg = "Slice Profile is null" - exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) - } else { - currentNSSI['sliceProfile'] = sliceProfile + String sliceProfile = execution.getVariable("sliceParams") + + /* if(jsonUtil.jsonValueExists(execution.getVariable("sliceParams"), "sliceProfile")) { + sliceProfile = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "sliceProfile") } + else { // In case of Deallocate flow or Modify flow with deletion of Slice Profile Instance + if(jsonUtil.jsonValueExists(execution.getVariable("sliceParams"), "sliceProfileId")) { + sliceProfile = String.format(SLICE_PROFILE_TEMPLATE, jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "sliceProfileId")) + } + else { + String msg = "Either Slice Profile or Slice Profile Id should be provided" + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + } */ + + LOGGER.debug("sliceProfile=" + sliceProfile) + currentNSSI['sliceProfile'] = sliceProfile // S-NSSAI - def snssaiList = jsonUtil.StringArrayToList(jsonUtil.getJsonValue(sliceProfile, "snssaiList")) + String strList = jsonUtil.getJsonValue(sliceProfile, "snssaiList") + + if(strList != null) { + def snssaiList = jsonUtil.StringArrayToList(strList) - String sNssai = snssaiList.get(0) - currentNSSI['S-NSSAI'] = sNssai + String sNssai = snssaiList.get(0) + currentNSSI['S-NSSAI'] = sNssai + } // Slice Profile id @@ -110,8 +128,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { execution.setVariable("currentNSSI", currentNSSI) - - LOGGER.trace("***** ${getPrefix()} Exit preProcessRequest") + LOGGER.debug("***** ${getPrefix()} Exit preProcessRequest") } @@ -120,7 +137,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void getNetworkServiceInstance(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start getNetworkServiceInstance") + LOGGER.debug("${getPrefix()} Start getNetworkServiceInstance") AAIResourcesClient client = getAAIClient() @@ -144,7 +161,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } - LOGGER.trace("${getPrefix()} Exit getNetworkServiceInstance") + LOGGER.debug("${getPrefix()} Exit getNetworkServiceInstance") } @@ -156,6 +173,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return Network Service Instance */ private ServiceInstance handleNetworkInstance(DelegateExecution execution, String nssiId, AAIResourceUri nssiUri, AAIResourcesClient client ) { + LOGGER.debug("${getPrefix()} Start handleNetworkInstance") + ServiceInstance networkServiceInstance = null def currentNSSI = execution.getVariable("currentNSSI") @@ -169,7 +188,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { if (networkServiceInstanceOpt.isPresent()) { networkServiceInstance = networkServiceInstanceOpt.get() - if (networkServiceInstance.getServiceRole() == "Network Service") { // Network Service role + if (networkServiceInstance.getServiceRole() == null /* WorkAround */ || networkServiceInstance.getServiceRole() == "Network Service") { // Network Service role currentNSSI['networkServiceInstanceUri'] = networkServiceInstanceUri break } @@ -180,6 +199,12 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } } + + if (currentNSSI['networkServiceInstanceUri'] == null) { + String msg = String.format("Network Service Instance URI is null") + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) + } } else { String msg = String.format("No relationship presented for NSSI %s in AAI", nssiId) @@ -193,6 +218,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } + LOGGER.debug("${getPrefix()} Exit handleNetworkInstance") + return networkServiceInstance } @@ -202,7 +229,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void getConstituteVNFFromNetworkServiceInst(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start getConstituteVNFFromNetworkServiceInst") + LOGGER.debug("${getPrefix()} Start getConstituteVNFFromNetworkServiceInst") def currentNSSI = execution.getVariable("currentNSSI") @@ -211,6 +238,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { AAIResourceUri networkServiceInstanceUri = (AAIResourceUri)currentNSSI['networkServiceInstanceUri'] AAIResultWrapper wrapper = client.get(networkServiceInstanceUri); Optional relationships = wrapper.getRelationships() + if (relationships.isPresent()) { for (AAIResourceUri constituteVnfUri : relationships.get().getRelatedUris(Types.GENERIC_VNF)) { currentNSSI['constituteVnfUri'] = constituteVnfUri @@ -234,126 +262,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) } - LOGGER.trace("${getPrefix()} Exit getConstituteVNFFromNetworkServiceInst") - - } - - - /** - * Retrieves NSSI associated profiles from AAI - * @param execution - */ - void getNSSIAssociatedProfiles(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start getNSSIAssociatedProfiles") - - List associatedProfiles = new ArrayList<>() - - AAIResourcesClient client = getAAIClient() - - def currentNSSI = execution.getVariable("currentNSSI") - - ServiceInstance nssi = (ServiceInstance)currentNSSI['nssi'] - - String nssiId = currentNSSI['nssiId'] - - // NSSI - AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) - AAIResultWrapper nssiWrapper = client.get(nssiUri) - Optional nssiRelationships = nssiWrapper.getRelationships() - - if (nssiRelationships.isPresent()) { - // Allotted Resource - for (AAIResourceUri allottedResourceUri : nssiRelationships.get().getRelatedUris(Types.ALLOTTED_RESOURCE)) { - AAIResultWrapper arWrapper = client.get(allottedResourceUri) - Optional arRelationships = arWrapper.getRelationships() - - boolean isFound = false - if(arRelationships.isPresent()) { - // Slice Profile Instance - for (AAIResourceUri sliceProfileInstanceUri : arRelationships.get().getRelatedUris(Types.SERVICE_INSTANCE)) { - Optional sliceProfileInstanceOpt = client.get(ServiceInstance.class, sliceProfileInstanceUri) - - if (sliceProfileInstanceOpt.isPresent()) { - ServiceInstance sliceProfileInstance = sliceProfileInstanceOpt.get() - if(sliceProfileInstance.getServiceRole().equals("slice-profile-instance")) { // Service instance as a Slice Profile Instance - associatedProfiles = sliceProfileInstance.getSliceProfiles()?.getSliceProfile() - - currentNSSI['sliceProfileInstanceUri'] = sliceProfileInstanceUri - - isFound = true - break // Should be only one - } - } - else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No Slice Profile Instance found") - } - } - } - else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No relationships found for Allotted Resource") - } - - if(isFound) { - break - } - } - } - else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No relationships found for nssi id = " + nssiId) - } - - if(associatedProfiles.isEmpty()) { - String msg = String.format("No associated profiles found for NSSI %s in AAI", nssi.getServiceInstanceId()) - LOGGER.error(msg) - exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) - } - else { - currentNSSI['associatedProfiles'] = associatedProfiles - } - - LOGGER.trace("${getPrefix()} Exit getNSSIAssociatedProfiles") - } - - - /** - * Calculates a final list of S-NSSAI - * @param execution - */ - void calculateSNSSAI(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start calculateSNSSAI") - - def currentNSSI = execution.getVariable("currentNSSI") - - List associatedProfiles = (List)currentNSSI['associatedProfiles'] - - String currentSNSSAI = currentNSSI['S-NSSAI'] - - List snssais = new ArrayList<>() - - String isCreateSliceProfileInstanceVar = execution.getVariable("isCreateSliceProfileInstance" ) // Not exist in case of Deallocate - - boolean isCreateSliceProfileInstance = Boolean.parseBoolean(isCreateSliceProfileInstanceVar) - - if(isCreateSliceProfileInstance) { // Slice Profile Instance has to be created - for (SliceProfile associatedProfile : associatedProfiles) { - snssais.add(associatedProfile.getSNssai()) - } - - snssais.add(currentSNSSAI) - } - else { // Slice profile instance has to be deleted - for (SliceProfile associatedProfile : associatedProfiles) { - if (!associatedProfile.getSNssai().equals(currentSNSSAI)) { // not current S-NSSAI - snssais.add(associatedProfile.getSNssai()) - } else { - currentNSSI['sliceProfileS-NSSAI'] = associatedProfile - } - } - } - - currentNSSI['S-NSSAIs'] = snssais + LOGGER.debug("${getPrefix()} Exit getConstituteVNFFromNetworkServiceInst") - LOGGER.trace("${getPrefix()} Exit calculateSNSSAI") } @@ -362,7 +272,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void invokePUTServiceInstance(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start invokePUTServiceInstance") + LOGGER.debug("${getPrefix()} Start invokePUTServiceInstance") def currentNSSI = execution.getVariable("currentNSSI") @@ -372,15 +282,18 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { ServiceInstance networkServiceInstance = (ServiceInstance)currentNSSI['networkServiceInstance'] - String url = String.format("${nsmfЕndPoint}/serviceInstantiation/v7/serviceInstances/%s", networkServiceInstance.getServiceInstanceId()) + GenericVnf constituteVnf = (GenericVnf)currentNSSI['constituteVnf'] - currentNSSI['putServiceInstanceURL'] = url + // http://so.onap:8080/onap/so/infra/serviceInstantiation/v7/serviceInstances/de6a0aa2-19f2-41fe-b313-a5a9f159acd7/vnfs/3abbb373-8d33-4977-aa4b-2bfee496b6d5 + String url = String.format("${nsmfЕndPoint}/serviceInstantiation/v7/serviceInstances/%s/vnfs/%s", networkServiceInstance.getServiceInstanceId(), constituteVnf.getVnfId()) String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) - String basicAuth = UrnPropertiesReader.getVariable("mso.infra.endpoint.auth", execution) - def authHeader = "" - String basicAuthValue = encryptBasicAuth(basicAuth, msoKey) //utils.encrypt(basicAuth, msoKey) + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) + + def authHeader = utils.getBasicAuth(basicAuth, msoKey) // "" + /* String basicAuthValue = encryptBasicAuth(basicAuth, msoKey) //utils.encrypt(basicAuth, msoKey) + String responseAuthHeader = getAuthHeader(execution, basicAuthValue, msoKey) //utils.getBasicAuth(basicAuthValue, msoKey) String errorCode = jsonUtil.getJsonValue(responseAuthHeader, "errorCode") @@ -389,11 +302,15 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } else { exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(errorCode), jsonUtil.getJsonValue(responseAuthHeader, "errorMessage")) - } + } */ def requestDetails = "" + String prepareRequestDetailsResponse = prepareRequestDetails(execution) - errorCode = jsonUtil.getJsonValue(prepareRequestDetailsResponse, "errorCode") + LOGGER.debug("invokePUTServiceInstance: prepareRequestDetailsResponse=" + prepareRequestDetailsResponse) + + String errorCode = jsonUtil.getJsonValue(prepareRequestDetailsResponse, "errorCode") + LOGGER.debug("invokePUTServiceInstance: errorCode=" + errorCode) if(errorCode == null || errorCode.isEmpty()) { // No error requestDetails = prepareRequestDetailsResponse } @@ -402,15 +319,13 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } String callPUTServiceInstanceResponse = callPUTServiceInstance(url, authHeader, requestDetails) - String putServiceInstanceResponse = "" - if(errorCode == null || errorCode.isEmpty()) { // No error - putServiceInstanceResponse = callPUTServiceInstanceResponse - } - else { - LOGGER.error(jsonUtil.getJsonValue(callPUTServiceInstanceResponse, "errorMessage")) - exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(errorCode), jsonUtil.getJsonValue(callPUTServiceInstanceResponse, "errorMessage")) - } + String macroOperationId = jsonUtil.getJsonValue(callPUTServiceInstanceResponse, "requestReferences.requestId") + String requestSelfLink = jsonUtil.getJsonValue(callPUTServiceInstanceResponse, "requestReferences.requestSelfLink") + + execution.setVariable("macroOperationId", macroOperationId) + execution.setVariable("requestSelfLink", requestSelfLink) + currentNSSI['requestSelfLink'] = requestSelfLink } catch (any) { String msg = "Exception in ${getPrefix()}.invokePUTServiceInstance. " + any.getCause() @@ -418,29 +333,36 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } - LOGGER.trace("${getPrefix()} Exit invokePUTServiceInstance") + LOGGER.debug("${getPrefix()} Exit invokePUTServiceInstance") } String callPUTServiceInstance(String url, String authHeader, String requestDetailsStr) { + LOGGER.debug("${getPrefix()} Start callPUTServiceInstance") + String errorCode = "" String errorMessage = "" String response + LOGGER.debug("callPUTServiceInstance: url = " + url) + LOGGER.debug("callPUTServiceInstance: authHeader = " + authHeader) + try { - HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.EXTERNAL) + HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) httpClient.addAdditionalHeader("Authorization", authHeader) httpClient.addAdditionalHeader("Accept", "application/json") - Response httpResponse = httpClient.put(requestDetailsStr) // check http code ??? - + Response httpResponse = httpClient.put(requestDetailsStr) - if (httpResponse.hasEntity()) { + int soResponseCode = httpResponse.getStatus() + if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) { response = httpResponse.readEntity(String.class) + + LOGGER.debug("callPUTServiceInstance: response = " + response) } else { errorCode = 500 - errorMessage = "No response received." + errorMessage = "Response code is " + soResponseCode response = "{\n" + " \"errorCode\": \"${errorCode}\",\n" + @@ -461,6 +383,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { return response + LOGGER.debug("${getPrefix()} Exit callPUTServiceInstance") } @@ -471,6 +394,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return ModelInfo */ ModelInfo prepareModelInfo(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareModelInfo") def currentNSSI = execution.getVariable("currentNSSI") ServiceInstance networkServiceInstance = (ServiceInstance)currentNSSI['networkServiceInstance'] @@ -491,6 +415,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { modelInfo.setModelVersion(modelVerOpt.get().getModelVersion()) } + LOGGER.debug("${getPrefix()} Exit prepareModelInfo") + return modelInfo } @@ -501,6 +427,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return SubscriberInfo */ SubscriberInfo prepareSubscriberInfo(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareSubscriberInfo") + def currentNSSI = execution.getVariable("currentNSSI") String globalSubscriberId = execution.getVariable("globalSubscriberId") @@ -545,6 +473,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } */ + LOGGER.debug("${getPrefix()} Exit prepareSubscriberInfo") + return subscriberInfo } @@ -555,6 +485,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return RequestInfo */ RequestInfo prepareRequestInfo(DelegateExecution execution, ServiceInstance networkServiceInstance) { + LOGGER.debug("${getPrefix()} Start prepareRequestInfo") + def currentNSSI = execution.getVariable("currentNSSI") String productFamilyId = execution.getVariable("productFamilyId") @@ -566,6 +498,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { requestInfo.setProductFamilyId(productFamilyId) requestInfo.setRequestorId("NBI") + LOGGER.debug("${getPrefix()} Exit prepareRequestInfo") + return requestInfo } @@ -577,6 +511,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return ModelInfo */ ModelInfo prepareServiceModelInfo(ServiceInstance networkServiceInstance, ModelInfo modelInfo) { + LOGGER.debug("${getPrefix()} Start prepareServiceModelInfo") ModelInfo serviceModelInfo = new ModelInfo() serviceModelInfo.setModelType(ModelType.service) @@ -586,6 +521,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { serviceModelInfo.setModelName(modelInfo.getModelName()) serviceModelInfo.setModelVersion(modelInfo.getModelVersion()) + LOGGER.debug("${getPrefix()} Exit prepareServiceModelInfo") + return serviceModelInfo } @@ -596,6 +533,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return CloudConfiguration */ CloudConfiguration prepareCloudConfiguration(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareCloudConfiguration") + def currentNSSI = execution.getVariable("currentNSSI") CloudConfiguration cloudConfiguration = new CloudConfiguration() @@ -603,6 +542,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { AAIResourcesClient client = getAAIClient() AAIResourceUri constituteVnfUri = currentNSSI['constituteVnfUri'] + AAIResultWrapper wrapper = client.get(constituteVnfUri) Optional cloudRegionRelationshipsOps = wrapper.getRelationships() @@ -617,9 +557,29 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { if (cloudRegionrOpt.isPresent()) { cloudRegion = cloudRegionrOpt.get() cloudConfiguration.setLcpCloudRegionId(cloudRegion.getCloudRegionId()) - for (Tenant tenant : cloudRegion.getTenants().getTenant()) { - cloudConfiguration.setTenantId(tenant.getTenantId()) - break // only one is required + + if(cloudRegion.getTenants() != null && cloudRegion.getTenants().getTenant() != null) { + for (Tenant tenant : cloudRegion.getTenants().getTenant()) { + cloudConfiguration.setTenantId(tenant.getTenantId()) + cloudConfiguration.setTenantName(tenant.getTenantName()) + break // only one is required + } + } + else { + List tenantRelatedAAIUris = cloudRegionRelationshipsOps.get().getRelatedUris(Types.TENANT) + if (!(tenantRelatedAAIUris == null || tenantRelatedAAIUris.isEmpty())) { + Optional tenantOpt = client.get(Tenant.class, tenantRelatedAAIUris.get(0)) + Tenant tenant = null + if (tenantOpt.isPresent()) { + tenant = tenantOpt.get() + + LOGGER.debug("prepareCloudConfiguration: tenantId=" + tenant.getTenantId()) + LOGGER.debug("prepareCloudConfiguration: tenantName=" + tenant.getTenantName()) + + cloudConfiguration.setTenantId(tenant.getTenantId()) + cloudConfiguration.setTenantName(tenant.getTenantName()) + } + } } cloudConfiguration.setCloudOwner(cloudRegion.getCloudOwner()) @@ -627,6 +587,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } } + LOGGER.debug("${getPrefix()} Exit prepareCloudConfiguration") + return cloudConfiguration } @@ -638,33 +600,100 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return List */ List prepareVfModules(DelegateExecution execution, GenericVnf constituteVnf) { + LOGGER.debug("${getPrefix()} Start prepareVfModules") AAIResourcesClient client = getAAIClient() + def currentNSSI = execution.getVariable("currentNSSI") + List vfModuless = new ArrayList<>() - for (VfModule vfModule : constituteVnf.getVfModules().getVfModule()) { - org.onap.so.serviceinstancebeans.VfModules vfmodules = new org.onap.so.serviceinstancebeans.VfModules() - ModelInfo vfModuleModelInfo = new ModelInfo() - vfModuleModelInfo.setModelInvariantUuid(vfModule.getModelInvariantId()) - vfModuleModelInfo.setModelCustomizationId(vfModule.getModelCustomizationId()) + ServiceInstance networkServiceInstance = (ServiceInstance)currentNSSI['networkServiceInstance'] + + String networkServiceModelInvariantUuid = networkServiceInstance.getModelInvariantId() + + String serviceVnfs=""; + String msg="" + try{ + CatalogDbUtils catalogDbUtils = getCatalogDbUtilsFactory().create() + + String json = catalogDbUtils.getServiceResourcesByServiceModelInvariantUuidString(execution, networkServiceModelInvariantUuid) + LOGGER.debug("***** JSON IS: "+json) - AAIResourceUri vfModuleUrl = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.serviceDesignAndCreation().model(vfModule.getModelInvariantId()).modelVer(vfModule.getModelVersionId())) + serviceVnfs = jsonUtil.getJsonValue(json, "serviceResources.serviceVnfs") ?: "" - Optional vfModuleModelVerOpt = client.get(ModelVer.class, vfModuleUrl) + ObjectMapper mapper = new ObjectMapper() - if (vfModuleModelVerOpt.isPresent()) { - vfModuleModelInfo.setModelVersionId(vfModuleModelVerOpt.get().getModelVersionId()) - vfModuleModelInfo.setModelName(vfModuleModelVerOpt.get().getModelName()) - vfModuleModelInfo.setModelVersion(vfModuleModelVerOpt.get().getModelVersion()) + List vnfList = mapper.readValue(serviceVnfs, List.class) + LOGGER.debug("vnfList: "+vnfList) + + Map vnfMap = vnfList.get(0) + ModelInfo vnfModelInfo = vnfMap.get("modelInfo") + vnfModelInfo.setModelCustomizationId(vnfModelInfo.getModelCustomizationUuid()) + vnfModelInfo.setModelVersionId(vnfModelInfo.getModelId()) + LOGGER.debug("vnfModelInfo "+vnfModelInfo) + + //List of VFModules + List> vfModuleList = vnfMap.get("vfModules") + LOGGER.debug("vfModuleList "+vfModuleList) + + //List of VfModules + List vfModelInfoList = new ArrayList<>() + + //Traverse VFModules List and add in vfModelInfoList + for (vfModule in vfModuleList) { + ModelInfo vfModelInfo = vfModule.get("modelInfo") + vfModelInfo.setModelCustomizationId(vfModelInfo.getModelCustomizationUuid()) + vfModelInfo.setModelVersionId(vfModelInfo.getModelId()) + LOGGER.debug("vfModelInfo "+vfModelInfo) + vfModelInfoList.add(vfModelInfo) } - vfmodules.setModelInfo(vfModuleModelInfo) - vfmodules.setInstanceName(vfModule.getVfModuleName()) + for (ModelInfo vfModuleModelInfo : vfModelInfoList) { + org.onap.so.serviceinstancebeans.VfModules vfModules = new org.onap.so.serviceinstancebeans.VfModules() + vfModules.setModelInfo(vfModuleModelInfo) + vfModules.setInstanceName(vfModuleModelInfo.getModelName()) + + List> vfModuleInstanceParams = new ArrayList<>() + vfModules.setInstanceParams(vfModuleInstanceParams) + vfModuless.add(vfModules) + } - vfModuless.add(vfmodules) + } catch (Exception ex){ + msg = "Exception in prepareVfModules " + ex.getMessage() + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } + /* + List vfModuless = new ArrayList<>() + if(constituteVnf.getVfModules() != null && constituteVnf.getVfModules().getVfModule() != null) { + for (VfModule vfModule : constituteVnf.getVfModules().getVfModule()) { + org.onap.so.serviceinstancebeans.VfModules vfmodules = new org.onap.so.serviceinstancebeans.VfModules() + + ModelInfo vfModuleModelInfo = new ModelInfo() + vfModuleModelInfo.setModelInvariantUuid(vfModule.getModelInvariantId()) + vfModuleModelInfo.setModelCustomizationId(vfModule.getModelCustomizationId()) + + AAIResourceUri vfModuleUrl = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.serviceDesignAndCreation().model(vfModule.getModelInvariantId()).modelVer(vfModule.getModelVersionId())) + + Optional vfModuleModelVerOpt = client.get(ModelVer.class, vfModuleUrl) + + if (vfModuleModelVerOpt.isPresent()) { + vfModuleModelInfo.setModelVersionId(vfModuleModelVerOpt.get().getModelVersionId()) + vfModuleModelInfo.setModelName(vfModuleModelVerOpt.get().getModelName()) + vfModuleModelInfo.setModelVersion(vfModuleModelVerOpt.get().getModelVersion()) + } + vfmodules.setModelInfo(vfModuleModelInfo) + + vfmodules.setInstanceName(vfModule.getVfModuleName()) + + vfModuless.add(vfmodules) + } + } */ + + LOGGER.debug("${getPrefix()} Exit prepareVfModules") + return vfModuless } @@ -676,6 +705,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return ModelInfo */ ModelInfo prepareVNFModelInfo(DelegateExecution execution, GenericVnf constituteVnf) { + LOGGER.debug("${getPrefix()} Start prepareVNFModelInfo") + ModelInfo vnfModelInfo = new ModelInfo() AAIResourcesClient client = getAAIClient() @@ -694,11 +725,15 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { vnfModelInfo.setModelVersion(vnfModelVerOpt.get().getModelVersion()) } + LOGGER.debug("${getPrefix()} Exit prepareVNFModelInfo") + return vnfModelInfo } List> prepareInstanceParams(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareInstanceParams") + def currentNSSI = execution.getVariable("currentNSSI") List> instanceParams = new ArrayList<>() @@ -734,6 +769,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { instanceParamsMap.put("supportedNssai", supportedNssaiDetailsStr) instanceParams.add(instanceParamsMap) + LOGGER.debug("${getPrefix()} Exit prepareInstanceParams") + return instanceParams } @@ -743,6 +780,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return Resources */ Resources prepareResources(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareResources") + def currentNSSI = execution.getVariable("currentNSSI") Resources resources = new Resources() @@ -781,6 +820,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { vnfs.add(vnf) resources.setVnfs(vnfs) + LOGGER.debug("${getPrefix()} Exit prepareResources") + return resources } @@ -790,6 +831,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return Service */ org.onap.so.serviceinstancebeans.Service prepareService(DelegateExecution execution, ServiceInstance networkServiceInstance, ModelInfo modelInfo) { + LOGGER.debug("${getPrefix()} Start prepareService") + org.onap.so.serviceinstancebeans.Service service = new org.onap.so.serviceinstancebeans.Service() // Model Info @@ -800,6 +843,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { // Resources service.setResources(prepareResources(execution)) + LOGGER.debug("${getPrefix()} Exit prepareService") + return service } @@ -811,6 +856,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return RequestParameters */ RequestParameters prepareRequestParameters(DelegateExecution execution, ServiceInstance networkServiceInstance, ModelInfo modelInfo) { + LOGGER.debug("${getPrefix()} Start prepareRequestParameters") + def currentNSSI = execution.getVariable("currentNSSI") RequestParameters requestParameters = new RequestParameters() @@ -834,6 +881,10 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { userParams.add(serviceMap) requestParameters.setUserParams(userParams) + requestParameters.setaLaCarte(false) + + LOGGER.debug("${getPrefix()} Exit prepareRequestParameters") + return requestParameters } @@ -844,6 +895,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return OwningEntity */ org.onap.so.serviceinstancebeans.OwningEntity prepareOwningEntity(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareOwningEntity") + def currentNSSI = execution.getVariable("currentNSSI") AAIResourcesClient client = getAAIClient() @@ -866,6 +919,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } } + LOGGER.debug("${getPrefix()} Exit prepareOwningEntity") + return owningEntity } @@ -876,6 +931,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return Project */ org.onap.so.serviceinstancebeans.Project prepareProject(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareProject") + def currentNSSI = execution.getVariable("currentNSSI") AAIResourcesClient client = getAAIClient() @@ -898,6 +955,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } } + LOGGER.debug("${getPrefix()} Exit prepareProject") + return project } @@ -908,6 +967,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @return */ String prepareRequestDetails(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start prepareRequestDetails") + String errorCode = "" String errorMessage = "" String response @@ -941,9 +1002,12 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { // Project requestDetails.setProject(prepareProject(execution)) + Map requestDetailsMap = new LinkedHashMap<>() + requestDetailsMap.put("requestDetails", requestDetails) + ObjectMapper mapper = new ObjectMapper() - response = mapper.writeValueAsString(requestDetails) + response = mapper.writeValueAsString(requestDetailsMap) } catch (any) { String msg = "Exception in ${getPrefix()}.prepareRequestDetails. " + any.getCause() @@ -956,6 +1020,8 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } + LOGGER.debug("${getPrefix()} Exit prepareRequestDetails") + return response } @@ -990,60 +1056,145 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { /** - * Removes Slice Profile association with NSSI + * Retrieves NSSI associated profiles from AAI * @param execution */ - void removeSPAssociationWithNSSI(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start removeSPAssociationWithNSSI") + void getNSSIAssociatedProfiles(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start getNSSIAssociatedProfiles") + + List associatedProfiles = new ArrayList<>() AAIResourcesClient client = getAAIClient() def currentNSSI = execution.getVariable("currentNSSI") + ServiceInstance nssi = (ServiceInstance)currentNSSI['nssi'] + String nssiId = currentNSSI['nssiId'] + + String givenSliceProfileId = currentNSSI['sliceProfileId'] + + // NSSI AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) + AAIResultWrapper nssiWrapper = client.get(nssiUri) + Optional nssiRelationships = nssiWrapper.getRelationships() + + if (nssiRelationships.isPresent()) { + // Allotted Resource + for (AAIResourceUri allottedResourceUri : nssiRelationships.get().getRelatedUris(Types.ALLOTTED_RESOURCE)) { + AAIResultWrapper arWrapper = client.get(allottedResourceUri) + Optional arRelationships = arWrapper.getRelationships() + + if(arRelationships.isPresent()) { + // Slice Profile Instance + for (AAIResourceUri sliceProfileInstanceUri : arRelationships.get().getRelatedUris(Types.SERVICE_INSTANCE)) { + Optional sliceProfileInstanceOpt = client.get(ServiceInstance.class, sliceProfileInstanceUri) + + if (sliceProfileInstanceOpt.isPresent()) { + ServiceInstance sliceProfileInstance = sliceProfileInstanceOpt.get() + if(sliceProfileInstance.getServiceRole().equals("slice-profile-instance")) { // Service instance as a Slice Profile Instance - AAIResourceUri sliceProfileInstanceUri = (AAIResourceUri)currentNSSI['sliceProfileInstanceUri'] + String globalSubscriberId = execution.getVariable("globalSubscriberId") + String subscriptionServiceType = execution.getVariable("subscriptionServiceType") - Optional sliceProfileInstanceOpt = client.get(ServiceInstance.class, sliceProfileInstanceUri) - if (sliceProfileInstanceOpt.isPresent()) { - ServiceInstance sliceProfileInstance = sliceProfileInstanceOpt.get() + org.onap.aaiclient.client.generated.fluentbuilders.SliceProfiles sliceProfilesType = + AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(subscriptionServiceType).serviceInstance(sliceProfileInstance.getServiceInstanceId()).sliceProfiles() - List associatedProfiles = sliceProfileInstance.getSliceProfiles()?.getSliceProfile() + def sliceProfilesUri = AAIUriFactory.createResourceUri(sliceProfilesType) + LOGGER.debug("client.exists(sliceProfilesUri = " + client.exists(sliceProfilesUri)) + if (!client.exists(sliceProfilesUri)) { + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, "Slice Profiles URI doesn't exist") + } - String currentSNSSAI = currentNSSI['S-NSSAI'] + AAIResultWrapper sliceProfilesWrapper = client.get(sliceProfilesUri) + Optional sliceProfilesOpt = sliceProfilesWrapper.asBean(SliceProfiles.class) + if(sliceProfilesOpt.isPresent()) { + SliceProfiles sliceProfiles = sliceProfilesOpt.get() - if(!(associatedProfiles == null || associatedProfiles.isEmpty())) { - // Removes slice profile which contains given S-NSSAI and updates Slice Profile Instance - associatedProfiles.removeIf({ associatedProfile -> (associatedProfile.getSNssai().equals(currentSNSSAI)) }) + LOGGER.debug("getNSSIAssociatedProfiles: sliceProfiles.getSliceProfile().size() = " + sliceProfiles.getSliceProfile().size()) + LOGGER.debug("getNSSIAssociatedProfiles: givenSliceProfileId = " + givenSliceProfileId) + for(SliceProfile sliceProfile: sliceProfiles.getSliceProfile()) { + LOGGER.debug("getNSSIAssociatedProfiles: sliceProfile.getProfileId() = " + sliceProfile.getProfileId()) + if(sliceProfile.getProfileId().equals(givenSliceProfileId)) { // Slice profile id equals to received slice profile id + currentNSSI['sliceProfileInstanceUri'] = sliceProfileInstanceUri + } - try { - client.update(sliceProfileInstanceUri, sliceProfileInstance) + } - currentNSSI['sliceProfileInstance'] = sliceProfileInstance - } catch (Exception e) { - exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while Slice Profile association with NSSI update call: " + e.getMessage()) + associatedProfiles.addAll(sliceProfiles.getSliceProfile()) // Adds all slice profiles + } + + } + } + else { + exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No Slice Profile Instance found") + } + } + } + else { + exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No relationships found for Allotted Resource") } - } - else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No slice profiles found") - } + } } else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No slice profile instance found") + exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No relationships found for nssi id = " + nssiId) } - // Removes SLice Profile Instance association with NSSI - try { - client.disconnect(nssiUri, sliceProfileInstanceUri) + checkAssociatedProfiles(execution, associatedProfiles, nssi) + + currentNSSI['associatedProfiles'] = associatedProfiles + + LOGGER.debug("${getPrefix()} Exit getNSSIAssociatedProfiles") + } + + + void checkAssociatedProfiles(DelegateExecution execution, List associatedProfiles, ServiceInstance nssi) {} + + + /** + * Removes Slice Profile association with NSSI + * @param execution + */ + void removeSPAssociationWithNSSI(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start removeSPAssociationWithNSSI") + + AAIResourcesClient client = getAAIClient() + + def currentNSSI = execution.getVariable("currentNSSI") + + String nssiId = currentNSSI['nssiId'] + AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) + + String isTerminateNSSIVar = execution.getVariable("isTerminateNSSI" ) + + boolean isTerminateNSSI = Boolean.parseBoolean(isTerminateNSSIVar) + + AAIResourceUri sliceProfileInstanceUri = null + if(!isTerminateNSSI) { // In case of NSSI non-termination associated Slice Profile Instance should be presented + def spURI = currentNSSI['sliceProfileInstanceUri'] + if(spURI != null) { + sliceProfileInstanceUri = (AAIResourceUri)spURI + } + else { + String msg = "Slice Profile URI not found" + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } } - catch (Exception e) { - exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while Slice Profile Instance association with NSSI dosconnect call: " + e.getMessage()) + + // Removes SLice Profile Instance association with NSSI + if(sliceProfileInstanceUri != null) { // NSSI should not be terminated + try { + client.disconnect(nssiUri, sliceProfileInstanceUri) + } + catch (Exception e) { + exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while Slice Profile Instance association with NSSI dosconnect call: " + e.getMessage()) + } } - LOGGER.trace("${getPrefix()} Exit removeSPAssociationWithNSSI") + LOGGER.debug("${getPrefix()} Exit removeSPAssociationWithNSSI") } @@ -1052,21 +1203,38 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void deleteSliceProfileInstance(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start deleteSliceProfileInstance") + LOGGER.debug("${getPrefix()} Start deleteSliceProfileInstance") AAIResourcesClient client = getAAIClient() def currentNSSI = execution.getVariable("currentNSSI") - AAIResourceUri sliceProfileInstanceURI = (AAIResourceUri)currentNSSI['sliceProfileInstanceUri'] + String isTerminateNSSIVar = execution.getVariable("isTerminateNSSI" ) - try { - client.delete(sliceProfileInstanceURI) - }catch(Exception e){ - exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while Slice Profile Instance delete call: " + e.getMessage()) + boolean isTerminateNSSI = Boolean.parseBoolean(isTerminateNSSIVar) + + AAIResourceUri sliceProfileInstanceUri = null + if(!isTerminateNSSI) { // In case of NSSI non-termination associated Slice Profile Instance should be presented + def spURI = currentNSSI['sliceProfileInstanceUri'] + if(spURI != null) { + sliceProfileInstanceUri = (AAIResourceUri)spURI + } + else { + String msg = "Slice Profile URI not found" + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) + } } - LOGGER.trace("${getPrefix()} Exit deleteSliceProfileInstance") + if(sliceProfileInstanceUri != null) { // NSSI should not be terminated + try { + client.delete(sliceProfileInstanceUri) + } catch (Exception e) { + exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while Slice Profile Instance delete call: " + e.getMessage()) + } + } + + LOGGER.debug("${getPrefix()} Exit deleteSliceProfileInstance") } @@ -1075,7 +1243,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void prepareUpdateResourceOperationStatus(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start updateServiceOperationStatus") + LOGGER.debug("${getPrefix()} Start updateServiceOperationStatus") def currentNSSI = execution.getVariable("currentNSSI") @@ -1092,7 +1260,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { setResourceOperationStatus(execution, "finished", "100", "Core NSSI ${getAction()} successful") - LOGGER.trace("${getPrefix()} Exit updateServiceOperationStatus") + LOGGER.debug("${getPrefix()} Exit updateServiceOperationStatus") } @@ -1102,26 +1270,31 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param operationType */ void setResourceOperationStatus(DelegateExecution execution, String status, String progress, String statusDesc) { - LOGGER.trace("${getPrefix()} Start setResourceOperationStatus") + LOGGER.debug("${getPrefix()} Start setResourceOperationStatus") def currentNSSI = execution.getVariable("currentNSSI") - String serviceId = currentNSSI['nssiId'] + String serviceId = currentNSSI['nsiId'] String jobId = execution.getVariable("jobId") String nsiId = currentNSSI['nsiId'] String operationType = execution.getVariable("operationType") + String resourceInstanceId = currentNSSI['nssiId'] + + ServiceInstance nssi = (ServiceInstance) currentNSSI['nssi'] + String modelUuid = nssi.getModelVersionId() ResourceOperationStatus resourceOperationStatus = new ResourceOperationStatus() resourceOperationStatus.setServiceId(serviceId) resourceOperationStatus.setOperationId(jobId) - resourceOperationStatus.setResourceTemplateUUID(nsiId) + resourceOperationStatus.setResourceTemplateUUID(modelUuid) resourceOperationStatus.setOperType(operationType) + resourceOperationStatus.setResourceInstanceID(resourceInstanceId) resourceOperationStatus.setStatus(status) resourceOperationStatus.setProgress(progress) resourceOperationStatus.setStatusDescription(statusDesc) requestDBUtil.prepareUpdateResourceOperationStatus(execution, resourceOperationStatus) - LOGGER.trace("${getPrefix()} Exit setResourceOperationStatus") + LOGGER.debug("${getPrefix()} Exit setResourceOperationStatus") } @@ -1130,11 +1303,11 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void prepareFailedOperationStatusUpdate(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start prepareFailedOperationStatusUpdate") + LOGGER.debug("${getPrefix()} Start prepareFailedOperationStatusUpdate") setResourceOperationStatus(execution, "failed", "0", "Core NSSI ${getAction()} Failed") - LOGGER.trace("${getPrefix()} Exit prepareFailedOperationStatusUpdate") + LOGGER.debug("${getPrefix()} Exit prepareFailedOperationStatusUpdate") } @@ -1143,42 +1316,58 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ public void getPUTServiceInstanceProgress(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start getPUTServiceInstanceProgress") + LOGGER.debug("${getPrefix()} Start getPUTServiceInstanceProgress") def currentNSSI = execution.getVariable("currentNSSI") - String url = currentNSSI['putServiceInstanceURL'] + ServiceInstance networkServiceInstance = (ServiceInstance)currentNSSI['networkServiceInstance'] + + String url = currentNSSI['requestSelfLink'] + + String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) - getProgress(execution, url, "putStatus") + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) - LOGGER.trace("${getPrefix()} Exit getPUTServiceInstanceProgress") + def authHeader = "" + String basicAuthValue = utils.getBasicAuth(basicAuth, msoKey) + + getProgress(execution, url, basicAuthValue, "putStatus") + + LOGGER.debug("${getPrefix()} Exit getPUTServiceInstanceProgress") } - void getProgress(DelegateExecution execution, String url, String statusVariableName) { + void getProgress(DelegateExecution execution, String url, String authHeader, String statusVariableName) { + LOGGER.debug("${getPrefix()} Start getProgress") + + LOGGER.debug("getProgress: url = " + url) + LOGGER.debug("getProgress: authHeader = " + authHeader) + String msg="" try { - ExternalAPIUtil externalAPIUtil = getExternalAPIUtilFactory().create() - Response response = externalAPIUtil.executeExternalAPIGetCall(execution, url) + HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) + httpClient.addAdditionalHeader("Authorization", authHeader) + httpClient.addAdditionalHeader("Accept", "application/json") + + Response response = httpClient.get() int responseCode = response.getStatus() - execution.setVariable("GetServiceOrderResponseCode", responseCode) + // execution.setVariable("GetServiceOrderResponseCode", responseCode) LOGGER.debug("Get ServiceOrder response code is: " + responseCode) - String extApiResponse = response.readEntity(String.class) - JSONObject responseObj = new JSONObject(extApiResponse) - execution.setVariable("GetServiceOrderResponse", extApiResponse) - LOGGER.debug("Create response body is: " + extApiResponse) + String soResponse = "" + if(response.hasEntity()) { + soResponse = response.readEntity(String.class) + // execution.setVariable("GetServiceOrderResponse", extApiResponse) + LOGGER.debug("Create response body is: " + soResponse) + } + //Process Response //200 OK 201 CREATED 202 ACCEPTED - if(responseCode == 200 || responseCode == 201 || responseCode == 202 ) - { + if (responseCode >= 200 && responseCode < 204) { LOGGER.debug("Get Create ServiceOrder Received a Good Response") - String orderState = responseObj.get("state") - if("REJECTED".equalsIgnoreCase(orderState)) { - prepareFailedOperationStatusUpdate(execution) - return - } + String requestState = jsonUtil.getJsonValue(soResponse, "request.requestStatus.requestState") + /* JSONArray items = responseObj.getJSONArray("orderItem") JSONObject item = items.get(0) JSONObject service = item.get("service") @@ -1190,21 +1379,25 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { execution.setVariable("networkServiceId", networkServiceId) String serviceOrderState = item.get("state") - execution.setVariable("ServiceOrderState", serviceOrderState) + execution.setVariable("ServiceOrderState", serviceOrderState) */ + // Get serviceOrder State and process progress - if("ACKNOWLEDGED".equalsIgnoreCase(serviceOrderState)) { + if("ACKNOWLEDGED".equalsIgnoreCase(requestState)) { execution.setVariable(statusVariableName, "processing") } - else if("INPROGRESS".equalsIgnoreCase(serviceOrderState)) { + else if("IN_PROGRESS".equalsIgnoreCase(requestState)) { execution.setVariable(statusVariableName, "processing") } - else if("COMPLETED".equalsIgnoreCase(serviceOrderState)) { + else if("COMPLETE".equalsIgnoreCase(requestState)) { execution.setVariable(statusVariableName, "completed") } - else if("FAILED".equalsIgnoreCase(serviceOrderState)) { + else if("FAILED".equalsIgnoreCase(requestState)) { msg = "ServiceOrder failed" exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } + else if("REJECTED".equalsIgnoreCase(requestState)) { + prepareFailedOperationStatusUpdate(execution) + } else { msg = "ServiceOrder failed" exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) @@ -1219,6 +1412,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { exceptionUtil.buildAndThrowWorkflowException(execution, 7000, e.getMessage()) } + LOGGER.debug("${getPrefix()} Exit getProgress") } @@ -1228,7 +1422,7 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { * @param execution */ void timeDelay(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start timeDelay") + LOGGER.debug("${getPrefix()} Start timeDelay") try { LOGGER.debug("${getPrefix()} timeDelay going to sleep for 5 sec") @@ -1240,10 +1434,20 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { LOGGER.error("${getPrefix()} ::: timeDelay exception" + e) } - LOGGER.trace("${getPrefix()} Exit timeDelay") + LOGGER.debug("${getPrefix()} Exit timeDelay") } + void postProcessRequest(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start postProcessRequest") + + execution.removeVariable("currentNSSI") + + LOGGER.debug("***** ${getPrefix()} Exit postProcessRequest") + } + + + /** * Returns AAI client * @return AAI client @@ -1258,7 +1462,16 @@ class DoCommonCoreNSSI extends AbstractServiceTaskProcessor { } - String getPrefix() { + /** + * Returns Catalog DB Util Factory + * @return ew CatalogDbUtilsFactory() + */ + CatalogDbUtilsFactory getCatalogDbUtilsFactory() { + return new CatalogDbUtilsFactory() + } + + + private String getPrefix() { return PREFIX } diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateCoreNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateCoreNSSI.groovy index fe881eb888..c559845e12 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateCoreNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoDeallocateCoreNSSI.groovy @@ -20,10 +20,14 @@ package org.onap.so.bpmn.infrastructure.scripts - +import com.fasterxml.jackson.databind.ObjectMapper +import com.google.gson.JsonObject import org.camunda.bpm.engine.delegate.DelegateExecution import org.onap.aai.domain.yang.v19.AllottedResource +import org.onap.aai.domain.yang.v19.GenericVnf import org.onap.aai.domain.yang.v19.ServiceInstance +import org.onap.aai.domain.yang.v19.SliceProfile +import org.onap.aai.domain.yang.v19.SliceProfiles import org.onap.aaiclient.client.aai.AAIResourcesClient import org.onap.aaiclient.client.aai.entities.AAIResultWrapper import org.onap.aaiclient.client.aai.entities.Relationships @@ -34,16 +38,23 @@ import org.onap.aaiclient.client.generated.fluentbuilders.AAIFluentTypeBuilder.T import org.onap.logging.filter.base.ONAPComponents import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.common.scripts.MsoUtils +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.slf4j.Logger import org.slf4j.LoggerFactory import javax.ws.rs.core.Response +import static org.apache.commons.lang3.StringUtils.isBlank +import static org.apache.commons.lang3.StringUtils.isBlank +import static org.onap.so.bpmn.common.scripts.GenericUtils.isBlank +import static org.onap.so.bpmn.common.scripts.GenericUtils.isBlank + class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { private final String PREFIX ="DoDeallocateCoreNSSI" private final String ACTION = "Deallocate" @@ -55,54 +66,84 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { private static final Logger LOGGER = LoggerFactory.getLogger( DoDeallocateCoreNSSI.class) + + @Override + void preProcessRequest(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start preProcessRequest") + + super.preProcessRequest(execution) + + execution.setVariable("operationType", "DEALLOCATE") + + LOGGER.debug("${getPrefix()} Exit preProcessRequest") + } + + + /** * Queries OOF for NSSI termination * @param execution */ void executeTerminateNSSIQuery(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start executeTerminateNSSIQuery") + LOGGER.debug("${PREFIX} Start executeTerminateNSSIQuery") String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution) + // String urlString = UrnPropertiesReader.getVariable("mso.adapters.oof.endpoint", execution) + + //API Path + String apiPath = "/api/oof/terminate/nxi/v1" + LOGGER.debug("API path for DoAllocateCoreNSSI: "+apiPath) + + urlString = urlString + apiPath //Prepare auth for OOF def authHeader = "" String basicAuth = UrnPropertiesReader.getVariable("mso.oof.auth", execution) String msokey = UrnPropertiesReader.getVariable("mso.msoKey", execution) - String basicAuthValue = encryptBasicAuth(basicAuth, msokey) - if (basicAuthValue != null) { - String responseAuthHeader = getAuthHeader(execution, basicAuthValue, msokey) - String errorCode = jsonUtil.getJsonValue(responseAuthHeader, "errorCode") - if(errorCode == null || errorCode.isEmpty()) { // No error - authHeader = responseAuthHeader - } - else { - exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(errorCode), jsonUtil.getJsonValue(responseAuthHeader, "errorMessage")) + String basicAuthValue = utils.encrypt(basicAuth, msokey) + /* if (basicAuthValue != null) { + LOGGER.debug( "Obtained BasicAuth username and password for OOF Adapter: " + basicAuthValue) + try { + authHeader = utils.getBasicAuth(basicAuthValue, msokey) + execution.setVariable("BasicAuthHeaderValue", authHeader) + } catch (Exception ex) { + LOGGER.error( "Unable to encode username and password string: " + ex) + exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to encode username and password string") } } else { LOGGER.error( "Unable to obtain BasicAuth - BasicAuth value null") - exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth " + - "value null") + exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth value null") + } */ + + + try { + authHeader = utils.getBasicAuth(basicAuthValue, msokey) + execution.setVariable("BasicAuthHeaderValue", authHeader) + } catch (Exception ex) { + LOGGER.error( "Unable to encode username and password string: " + ex) + exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - Unable to encode username and password string") } //Prepare send request to OOF String oofRequest = buildOOFRequest(execution) String callOOFResponse = callOOF(urlString, authHeader, oofRequest) + LOGGER.debug("callOOFResponse=" + callOOFResponse) + String errorCode = jsonUtil.getJsonValue(callOOFResponse, "errorCode") if(errorCode == null || errorCode.isEmpty()) { // No error - String oofResponse = callOOFResponse - String isTerminateNSSI = jsonUtil.getJsonValue(oofResponse, "terminateResponse") + String terminateNSSI = jsonUtil.getJsonValue(callOOFResponse, "terminateResponse") + LOGGER.debug("isTerminateNSSI=" + terminateNSSI) - execution.setVariable("isTerminateNSSI", Boolean.parseBoolean(isTerminateNSSI)) + execution.setVariable("isTerminateNSSI", terminateNSSI) } else { LOGGER.error(jsonUtil.getJsonValue(callOOFResponse, "errorMessage")) exceptionUtil.buildAndThrowWorkflowException(execution, Integer.parseInt(errorCode), jsonUtil.getJsonValue(callOOFResponse, "errorMessage")) } - - LOGGER.trace("${PREFIX} Exit executeTerminateNSSIQuery") + LOGGER.debug("${PREFIX} Exit executeTerminateNSSIQuery") } @@ -111,15 +152,16 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @return OOF response */ String callOOF(String urlString, String authHeader, String oofRequest) { + LOGGER.debug("${PREFIX} Start callOOF") + String errorCode = "" String errorMessage = "" String response = "" try { - URL url = new URL(urlString + "/api/oof/terminate/nxi/v1") - HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.OOF) + URL url = new URL(urlString) + HttpClient httpClient = getHttpClientFactory().newJsonClient(url, ONAPComponents.OOF) httpClient.addAdditionalHeader("Authorization", authHeader) - httpClient.addAdditionalHeader("Accept", "application/json") httpClient.addAdditionalHeader("Content-Type", "application/json") Response httpResponse = httpClient.post(oofRequest) @@ -127,7 +169,7 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { int responseCode = httpResponse.getStatus() LOGGER.debug("OOF sync response code is: " + responseCode) - if (responseCode != 202) { // Accepted + if(responseCode < 200 || responseCode >= 300) { // Wrong code errorCode = responseCode errorMessage = "Received a Bad Sync Response from OOF." @@ -161,6 +203,7 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { "}" } + LOGGER.debug("${PREFIX} Exit callOOF") return response } @@ -172,23 +215,54 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @return */ private String buildOOFRequest(DelegateExecution execution) { + LOGGER.debug("${PREFIX} Start buildOOFRequest") def currentNSSI = execution.getVariable("currentNSSI") String nssiId = currentNSSI['nssiId'] - String requestId = execution.getVariable("mso-request-id") - - String request = "{\n" + - " \"type\": \"NSSI\",\n" + - " \"NxIId\": \"${nssiId}\",\n" + - " \"requestInfo\": {\n" + - " \"transactionId\": \"${requestId}\",\n" + - " \"requestId\": \"${requestId}\",\n" + - " \"sourceId\": \"so\",\n" + - " }\n" + - "}" - - return request + + ServiceInstance nssi = null + + AAIResourcesClient client = getAAIClient() + + // NSSI + AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) + Optional nssiOpt = client.get(ServiceInstance.class, nssiUri) + + if (nssiOpt.isPresent()) { + nssi = nssiOpt.get() + } + else { + String msg = "NSSI service instance not found in AAI for nssi id " + nssiId + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + + //Setting correlator as requestId + String requestId = execution.getVariable("msoRequestId") + execution.setVariable("NSSI_correlator", requestId) + + //Setting messageType for all Core slice as cn + String messageType = "cn" + execution.setVariable("NSSI_messageType", messageType) + + //Prepare Callback + String timeout = execution.getVariable("timeout") + if (isBlank(timeout)) { + timeout = UrnPropertiesReader.getVariable("mso.oof.timeout", execution); + if (isBlank(timeout)) { + timeout = "PT30M" + } + } + + String nxlId = nssi.getServiceInstanceId() + String nxlType = "NSSI" + String oofRequest = getOofUtils().buildTerminateNxiRequest(requestId, nxlId, nxlType, messageType, nssi.getServiceInstanceId()) + LOGGER.debug("**** Terminate Nxi Request: "+oofRequest) + + LOGGER.debug("${PREFIX} Exit buildOOFRequest") + + return oofRequest } @@ -198,24 +272,29 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void deleteServiceOrder(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start deleteServiceOrder") + LOGGER.debug("${PREFIX} Start deleteServiceOrder") def currentNSSI = execution.getVariable("currentNSSI") try { //url:/nbi/api/v4/serviceOrder/" - def nbiEndpointUrl = UrnPropertiesReader.getVariable("nbi.endpoint.url", execution) + def nsmfЕndPoint = UrnPropertiesReader.getVariable("mso.infra.endpoint.url", execution) ServiceInstance networkServiceInstance = (ServiceInstance)currentNSSI['networkServiceInstance'] - String url = String.format("${nbiEndpointUrl}/api/v4/serviceOrder/%s", networkServiceInstance.getServiceInstanceId()) + //String url = String.format("${nbiEndpointUrl}/api/v4/serviceOrder/%s", networkServiceInstance.getServiceInstanceId()) + + GenericVnf constituteVnf = (GenericVnf)currentNSSI['constituteVnf'] + + // http://so.onap:8080/onap/so/infra/serviceInstantiation/v7/serviceInstances/de6a0aa2-19f2-41fe-b313-a5a9f159acd7/vnfs/3abbb373-8d33-4977-aa4b-2bfee496b6d5 + String url = String.format("${nsmfЕndPoint}/serviceInstantiation/v7/serviceInstances/%s/vnfs/%s", networkServiceInstance.getServiceInstanceId(), constituteVnf.getVnfId()) currentNSSI['deleteServiceOrderURL'] = url String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) - String basicAuth = UrnPropertiesReader.getVariable("mso.infra.endpoint.auth", execution) + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) - String basicAuthValue = encryptBasicAuth(basicAuth, msoKey) + /*String basicAuthValue = encryptBasicAuth(basicAuth, msoKey) def authHeader = "" if (basicAuthValue != null) { String responseAuthHeader = getAuthHeader(execution, basicAuthValue, msoKey) @@ -230,14 +309,21 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { LOGGER.error( "Unable to obtain BasicAuth - BasicAuth value null") exceptionUtil.buildAndThrowWorkflowException(execution, 401, "Internal Error - BasicAuth " + "value null") - } + } */ + + def authHeader = utils.getBasicAuth(basicAuth, msoKey) String callDeleteServiceOrderResponse = callDeleteServiceOrder(execution, url, authHeader) String errorCode = jsonUtil.getJsonValue(callDeleteServiceOrderResponse, "errorCode") - String deleteServcieResponse = "" if(errorCode == null || errorCode.isEmpty()) { // No error - deleteServcieResponse = callDeleteServiceOrderResponse // check the response ??? + String macroOperationId = jsonUtil.getJsonValue(callDeleteServiceOrderResponse, "requestReferences.requestId") + String requestSelfLink = jsonUtil.getJsonValue(callDeleteServiceOrderResponse, "requestReferences.requestSelfLink") + + execution.setVariable("macroOperationId", macroOperationId) + execution.setVariable("requestSelfLink", requestSelfLink) + + currentNSSI['requestSelfLink'] = requestSelfLink } else { LOGGER.error(jsonUtil.getJsonValue(callDeleteServiceOrderResponse, "errorMessage")) @@ -249,27 +335,34 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) } - LOGGER.trace("${PREFIX} Exit deleteServiceOrder") + LOGGER.debug("${PREFIX} Exit deleteServiceOrder") } - String callDeleteServiceOrder(DelegateExecution execution, String urlString, String authHeader) { + String callDeleteServiceOrder(DelegateExecution execution, String url, String authHeader) { + LOGGER.debug("${PREFIX} Start callDeleteServiceOrder") + String errorCode = "" String errorMessage = "" String response = "" try { - HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(urlString), ONAPComponents.EXTERNAL) + HttpClient httpClient = getHttpClientFactory().newJsonClient(new URL(url), ONAPComponents.SO) httpClient.addAdditionalHeader("Authorization", authHeader) httpClient.addAdditionalHeader("Accept", "application/json") Response httpResponse = httpClient.delete() - if (httpResponse.hasEntity()) { + int soResponseCode = httpResponse.getStatus() + LOGGER.debug("callDeleteServiceInstance: soResponseCode = " + soResponseCode) + + if (soResponseCode >= 200 && soResponseCode < 204 && httpResponse.hasEntity()) { response = httpResponse.readEntity(String.class) + + LOGGER.debug("callDeleteServiceInstance: response = " + response) } else { errorCode = 500 - errorMessage = "No response received." + errorMessage = "Response code is " + soResponseCode response = "{\n" + " \"errorCode\": \"${errorCode}\",\n" + @@ -278,7 +371,7 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { } } catch (any) { - String msg = "Exception in DoDeallocateCoreNSSI.deleteServiceOrder. " + any.getCause() + String msg = "Exception in DoDeallocateCoreNSSI.callDeleteServiceOrder. " + any.getCause() response = "{\n" + " \"errorCode\": \"7000\",\n" + @@ -286,6 +379,8 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { "}" } + LOGGER.debug("${PREFIX} Exit callDeleteServiceOrder") + return response } @@ -295,7 +390,7 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void removeNSSIAssociationWithNSI(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start removeNSSIAssociationWithNSI") + LOGGER.debug("${PREFIX} Start removeNSSIAssociationWithNSI") AAIResourcesClient client = getAAIClient() @@ -308,38 +403,54 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { // NSSI AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) - ServiceInstance nssi = currentNSSI['nssi'] + String allottedResourceId = null - // Removes Allotted resource - List allottedResources = nssi.getAllottedResources()?.getAllottedResource() - if(allottedResources != null && allottedResources.size() == 1) { // Shouldn contain one allotted resource - allottedResourceId = allottedResources.get(0).getId() - allottedResources.remove(0) + + AAIResultWrapper nssiWrapper = client.get(nssiUri) + Optional nssiRelationships = nssiWrapper.getRelationships() + + if (nssiRelationships.isPresent()) { + // Allotted Resource + for (AAIResourceUri allottedResourceUri : nssiRelationships.get().getRelatedUris(Types.ALLOTTED_RESOURCE)) { + AAIResultWrapper arWrapper = client.get(allottedResourceUri) + Optional arRelationships = arWrapper.getRelationships() + + if(arRelationships.isPresent()) { + // NSI + for (AAIResourceUri nsiUri : arRelationships.get().getRelatedUris(Types.SERVICE_INSTANCE)) { + Optional nsiOpt = client.get(ServiceInstance.class, nsiUri) + + if (nsiOpt.isPresent()) { + ServiceInstance nsi = nsiOpt.get() + if(nsi.getServiceRole().equals("nsi")) { // Service instance as NSI + // Removes NSSI association with NSI + try { + client.disconnect(nssiUri, nsiUri) + } + catch (Exception e) { + exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while NSSI association with NSI dosconnect call: " + e.getMessage()) + } + } + } + else { + LOGGER.warn("No NSI found for NSSI id " + nssiId) + } + } + } + else { + LOGGER.warn("No relationships found for Allotted Resource for NSSI id " + nssiId) + } + + } } else { - exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No allotted resource found for NSSI id = " + nssiId) + LOGGER.warn("No relationships found for nssi id = " + nssiId) } - try { - client.update(nssiUri, nssi) - }catch(Exception e){ - exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while NSSI association with NSI disconnect call: " + e.getMessage()) - } - - - // Remove association between NSI and Allotted Resource - AAIResourceUri nsiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nsiId)) - AAIResourceUri allottedResourceUri = AAIUriFactory.createResourceUri(AAIFluentTypeBuilder.business().customer(globalSubscriberId).serviceSubscription(subscriptionServiceType).serviceInstance(nssiId).allottedResource(allottedResourceId)) - - try { - client.disconnect(nsiUri, allottedResourceUri) - }catch(Exception e){ - exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while NSSI association with NSI disconnect call: " + e.getMessage()) - } - LOGGER.trace("${PREFIX} Exit removeNSSIAssociationWithNSI") + LOGGER.debug("${PREFIX} Exit removeNSSIAssociationWithNSI") } @@ -348,7 +459,7 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void deleteNSSIServiceInstance(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start deleteNSSIServiceInstance") + LOGGER.debug("${PREFIX} Start deleteNSSIServiceInstance") AAIResourcesClient client = getAAIClient() @@ -358,12 +469,12 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) try { - getAAIClient().delete(nssiUri) + client.delete(nssiUri) }catch(Exception e){ exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occurred while NSSI Service Instance delete call: " + e.getMessage()) } - LOGGER.trace("${PREFIX} Exit deleteNSSIServiceInstance") + LOGGER.debug("${PREFIX} Exit deleteNSSIServiceInstance") } @@ -372,19 +483,72 @@ class DoDeallocateCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void getDeleteServiceOrderProgress(DelegateExecution execution) { - LOGGER.trace("${getPrefix()} Start getDeleteServiceOrderProgress") + LOGGER.debug("${getPrefix()} Start getDeleteServiceOrderProgress") def currentNSSI = execution.getVariable("currentNSSI") - String url = currentNSSI['deleteServiceOrderURL'] + String url = currentNSSI['requestSelfLink'] + + String msoKey = UrnPropertiesReader.getVariable("mso.msoKey", execution) + + String basicAuth = UrnPropertiesReader.getVariable("mso.adapters.po.auth", execution) - getProgress(execution, url, "deleteStatus") + def authHeader = "" + String basicAuthValue = utils.getBasicAuth(basicAuth, msoKey) + + getProgress(execution, url, basicAuthValue, "deleteStatus") + LOGGER.debug("${getPrefix()} Exit getDeleteServiceOrderProgress") } - @Override - String getPrefix() { + /** + * Calculates a final list of S-NSSAI + * @param execution + */ + void calculateSNSSAI(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start calculateSNSSAI") + + def currentNSSI = execution.getVariable("currentNSSI") + + List associatedProfiles = (List)currentNSSI['associatedProfiles'] + + String givenSliceProfileId = currentNSSI['sliceProfileId'] + + List snssais = new ArrayList<>() + + String isTerminateNSSIVar = execution.getVariable("isTerminateNSSI" ) + + boolean isTerminateNSSI = Boolean.parseBoolean(isTerminateNSSIVar) + + if(!isTerminateNSSI) { // NSSI should not be terminated + LOGGER.debug("calculateSNSSAI: associatedProfiles.size()" + associatedProfiles.size()) + for (SliceProfile associatedProfile : associatedProfiles) { + if (!associatedProfile.getProfileId().equals(givenSliceProfileId)) { // not given profile id + LOGGER.debug("calculateSNSSAI: associatedProfile.getSNssai()" + associatedProfile.getSNssai()) + snssais.add(associatedProfile.getSNssai()) + } else { + currentNSSI['sliceProfileS-NSSAI'] = associatedProfile + } + } + } + + currentNSSI['S-NSSAIs'] = snssais + + LOGGER.debug("${getPrefix()} Exit calculateSNSSAI") + } + + + /** + * OofUtils + * @return new OofUtils() + */ + OofUtils getOofUtils() { + return new OofUtils() + } + + + private String getPrefix() { return PREFIX } diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyCoreNSSI.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyCoreNSSI.groovy index ff16184f02..a52763f99b 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyCoreNSSI.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoModifyCoreNSSI.groovy @@ -29,6 +29,8 @@ import org.onap.aai.domain.yang.v19.SliceProfile import org.onap.aai.domain.yang.v19.SliceProfiles import org.onap.aaiclient.client.aai.AAIResourcesClient import org.onap.aaiclient.client.aai.entities.AAIEdgeLabel +import org.onap.aaiclient.client.aai.entities.AAIResultWrapper +import org.onap.aaiclient.client.aai.entities.Relationships 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 @@ -56,15 +58,50 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { private static final Logger LOGGER = LoggerFactory.getLogger( DoModifyCoreNSSI.class) + @Override + void preProcessRequest(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start preProcessRequest") + + super.preProcessRequest(execution) + + String modifyAction = jsonUtil.getJsonValue(execution.getVariable("sliceParams"), "modifyAction") + if (isBlank(modifyAction)) { + String msg = "modifyAction is mandatory parameter" + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + else { + String createSliceProfileInstance = "" + if(modifyAction.equals("allocate")) { // In case Slice Profile should be created + createSliceProfileInstance = "true" + } + else if(modifyAction.equals("deallocate")) { // In case Slice Profile should be created + createSliceProfileInstance = "false" + } + else { + String msg = "Value of modifyAction parameter should be either allocate or deallocate" + exceptionUtil.buildAndThrowWorkflowException(execution, 500, msg) + } + + execution.setVariable("isCreateSliceProfileInstance", createSliceProfileInstance) + } + + execution.setVariable("operationType", "MODIFY") + + LOGGER.debug("${getPrefix()} Exit preProcessRequest") + } + + /** * Prepares Slice Profile * @param execution * @return SLice Profile */ SliceProfile prepareSliceProfile(DelegateExecution execution) { + LOGGER.debug("${PREFIX} Start prepareSliceProfile") + def currentNSSI = execution.getVariable("currentNSSI") - String sliceProfileID = currentNSSI['sliceProfileId'] + String givenSliceProfileId = currentNSSI['sliceProfileId'] //UUID.randomUUID().toString() Map sliceProfileMap = new ObjectMapper().readValue(currentNSSI['sliceProfile'], Map.class) SliceProfile sliceProfile = new SliceProfile() @@ -77,41 +114,43 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { sliceProfile.setConnDensity(0) sliceProfile.setSNssai(currentNSSI['S-NSSAI']) - if(!isBlank(sliceProfileMap.get("expDataRateUL"))) { + if(sliceProfileMap.get("expDataRateUL") != null) { sliceProfile.setExpDataRateUL(Integer.parseInt(sliceProfileMap.get("expDataRateUL").toString())) } - if(!isBlank(sliceProfileMap.get("expDataRateDL"))) { + if(sliceProfileMap.get("expDataRateDL") != null) { sliceProfile.setExpDataRateDL(Integer.parseInt(sliceProfileMap.get("expDataRateDL").toString())) } - if(!isBlank(sliceProfileMap.get("activityFactor"))) { + if(sliceProfileMap.get("activityFactor") != null) { sliceProfile.setActivityFactor(Integer.parseInt(sliceProfileMap.get("activityFactor").toString())) } - if(!isBlank(sliceProfileMap.get("resourceSharingLevel"))) { + if(sliceProfileMap.get("resourceSharingLevel") != null) { sliceProfile.setResourceSharingLevel(sliceProfileMap.get("resourceSharingLevel").toString()) } - if(!isBlank(sliceProfileMap.get("uEMobilityLevel"))) { + if(sliceProfileMap.get("uEMobilityLevel") != null) { sliceProfile.setUeMobilityLevel(sliceProfileMap.get("uEMobilityLevel").toString()) } - if(!isBlank(sliceProfileMap.get("coverageAreaTAList"))) { + if(sliceProfileMap.get("coverageAreaTAList") != null) { sliceProfile.setCoverageAreaTAList(sliceProfileMap.get("coverageAreaTAList").toString()) } - if(!isBlank(sliceProfileMap.get("maxNumberofUEs"))) { - sliceProfile.setMaxNumberOfUEs(Integer.parseInt(sliceProfileMap.get("maxNumberofUEs").toString())) + if(sliceProfileMap.get("maxNumberOfUEs") != null) { + sliceProfile.setMaxNumberOfUEs(Integer.parseInt(sliceProfileMap.get("maxNumberOfUEs").toString())) } - if(!isBlank(sliceProfileMap.get("latency"))) { + if(sliceProfileMap.get("latency") != null) { sliceProfile.setLatency(Integer.parseInt(sliceProfileMap.get("latency").toString())) } - sliceProfile.setProfileId(sliceProfileID) + sliceProfile.setProfileId(givenSliceProfileId) sliceProfile.setE2ELatency(0) + LOGGER.debug("${PREFIX} Exit prepareSliceProfile") + return sliceProfile } @@ -122,6 +161,7 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { * @return Slice Profile Instance */ ServiceInstance prepareSliceProfileInstance(DelegateExecution execution) { + LOGGER.debug("${PREFIX} Start prepareSliceProfileInstance") def currentNSSI = execution.getVariable("currentNSSI") @@ -152,6 +192,8 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { // TO DO: Model info + LOGGER.debug("${PREFIX} Exit prepareSliceProfileInstance") + return sliceProfileInstance } @@ -162,7 +204,7 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void createSliceProfileInstance(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start createSliceProfileInstance") + LOGGER.debug("${PREFIX} Start createSliceProfileInstance") def currentNSSI = execution.getVariable("currentNSSI") @@ -188,7 +230,7 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occurred while Slice Profile create call:" + ex.getMessage()) } - LOGGER.trace("${PREFIX} Exit createSliceProfileInstance") + LOGGER.debug("${PREFIX} Exit createSliceProfileInstance") } @@ -198,6 +240,8 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { * @return AllottedResource */ AllottedResource createAllottedResource(DelegateExecution execution) { + LOGGER.debug("${PREFIX} Start createAllottedResource") + def currentNSSI = execution.getVariable("currentNSSI") String globalSubscriberId = execution.getVariable("globalSubscriberId") @@ -223,6 +267,8 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occurred while Allotted Resource create call:" + ex.getMessage()) } + LOGGER.debug("${PREFIX} Exit createAllottedResource") + return allottedResource } @@ -233,7 +279,7 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { * @param execution */ void associateSliceProfileInstanceWithNSSI(DelegateExecution execution) { - LOGGER.trace("${PREFIX} Start associateSliceProfileInstanceWithNSSI") + LOGGER.debug("${PREFIX} Start associateSliceProfileInstanceWithNSSI") def currentNSSI = execution.getVariable("currentNSSI") @@ -247,12 +293,12 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { AllottedResource allottedResource = createAllottedResource(execution) AAIResourceUri allottedResourceUri = (AAIResourceUri)currentNSSI['allottedResourceUri'] - // Updates Slice Profile Instance with Allotted Resource + // Associates Allotted Resource with Slice Profile Instance try { AAIResourceUri sliceProfileInstanceUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(sliceProfileInstanceId)) Optional sliceProfileInstanceOpt = client.get(ServiceInstance.class, sliceProfileInstanceUri) if (sliceProfileInstanceOpt.isPresent()) { - ServiceInstance sliceProfileInstance = sliceProfileInstanceOpt.get() + /* ServiceInstance sliceProfileInstance = sliceProfileInstanceOpt.get() AllottedResources allottedResources = sliceProfileInstance.getAllottedResources() if(allottedResources == null) { @@ -262,7 +308,9 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { allottedResources.getAllottedResource().add(allottedResource) sliceProfileInstance.setAllottedResources(allottedResources) - client.update(sliceProfileInstanceUri, sliceProfileInstance) + client.update(sliceProfileInstanceUri, sliceProfileInstance) */ + + client.connect(sliceProfileInstanceUri, allottedResourceUri) } else { exceptionUtil.buildAndThrowWorkflowException(execution, 500, "No slice profile instance found with id = " + sliceProfileInstanceId) @@ -276,17 +324,83 @@ class DoModifyCoreNSSI extends DoCommonCoreNSSI { // Associates NSSI with Allotted Resource try { AAIResourceUri nssiUri = AAIUriFactory.createResourceUri(Types.SERVICE_INSTANCE.getFragment(nssiId)) - client.connect(nssiUri, allottedResourceUri, AAIEdgeLabel.USES) + client.connect(allottedResourceUri, nssiUri) } catch(Exception e){ exceptionUtil.buildAndThrowWorkflowException(execution, 25000, "Exception occured while NSSI with Allotted Resource connect call: " + e.getMessage()) } - LOGGER.trace("${PREFIX} Exit associateSliceProfileInstanceWithNSSI") + LOGGER.debug("${PREFIX} Exit associateSliceProfileInstanceWithNSSI") } @Override - String getPrefix() { + void checkAssociatedProfiles(DelegateExecution execution, List associatedProfiles, ServiceInstance nssi) { + LOGGER.debug("${PREFIX} Start checkAssociatedProfiles") + + LOGGER.debug("associatedProfiles == null = " + (associatedProfiles == null)) + if(associatedProfiles == null || associatedProfiles.isEmpty()) { + String isCreateSliceProfileInstanceVar = execution.getVariable("isCreateSliceProfileInstance" ) + boolean isCreateSliceProfileInstance = Boolean.parseBoolean(isCreateSliceProfileInstanceVar) + + if(!isCreateSliceProfileInstance) { // New Slice Profile Instance should not be created + String msg = String.format("No associated profiles found for NSSI %s in AAI", nssi.getServiceInstanceId()) + LOGGER.error(msg) + exceptionUtil.buildAndThrowWorkflowException(execution, 2500, msg) + } + } + + LOGGER.debug("${PREFIX} Exit checkAssociatedProfiles") + } + + + /** + * Calculates a final list of S-NSSAI + * @param execution + */ + void calculateSNSSAI(DelegateExecution execution) { + LOGGER.debug("${getPrefix()} Start calculateSNSSAI") + + def currentNSSI = execution.getVariable("currentNSSI") + + List associatedProfiles = (List)currentNSSI['associatedProfiles'] + + String currentSNSSAI = currentNSSI['S-NSSAI'] + + String givenSliceProfileId = currentNSSI['sliceProfileId'] + + List snssais = new ArrayList<>() + + String isCreateSliceProfileInstanceVar = execution.getVariable("isCreateSliceProfileInstance" ) + + boolean isCreateSliceProfileInstance = Boolean.parseBoolean(isCreateSliceProfileInstanceVar) + + if(isCreateSliceProfileInstance) { // Slice Profile Instance has to be created + for (SliceProfile associatedProfile : associatedProfiles) { + snssais.add(associatedProfile.getSNssai()) + } + + snssais.add(currentSNSSAI) + } + else { // Slice profile instance has to be deleted + if(associatedProfiles != null) { + for (SliceProfile associatedProfile : associatedProfiles) { + if (!associatedProfile.getProfileId().equals(givenSliceProfileId)) { // not given profile id + LOGGER.debug("calculateSNSSAI: associatedProfile.getSNssai()" + associatedProfile.getSNssai()) + snssais.add(associatedProfile.getSNssai()) + } else { + currentNSSI['sliceProfileS-NSSAI'] = associatedProfile + } + } + } + } + + currentNSSI['S-NSSAIs'] = snssais + + LOGGER.debug("${getPrefix()} Exit calculateSNSSAI") + } + + + private String getPrefix() { return PREFIX } -- cgit 1.2.3-korg