From b5a882256f9c2ef053c9b5e90ed7420d054a8219 Mon Sep 17 00:00:00 2001 From: hetengjiao Date: Wed, 13 May 2020 11:14:19 +0800 Subject: update nsmf because the oof inteface modify Issue-ID: SO-2919 Change-Id: I6d4b9ba0f92ed95d3d9751f1dd69b8188951e82f Signed-off-by: hetengjiao --- .../scripts/DoCreateSliceServiceOption.groovy | 377 +++++++++------------ 1 file changed, 155 insertions(+), 222 deletions(-) (limited to 'bpmn/so-bpmn-infrastructure-common/src/main') diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy index c66a89b9c6..303b8c892e 100644 --- a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy +++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/DoCreateSliceServiceOption.groovy @@ -1,13 +1,29 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + # Copyright (c) 2019, CMCC Technologies Co., Ltd. + # + # Licensed under the Apache License, Version 2.0 (the "License") + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + * ============LICENSE_END========================================================= + */ + package org.onap.so.bpmn.infrastructure.scripts import com.fasterxml.jackson.core.type.TypeReference -import groovy.json.JsonBuilder +import com.fasterxml.jackson.databind.ObjectMapper import groovy.json.JsonSlurper -import org.camunda.bpm.engine.delegate.BpmnError import org.camunda.bpm.engine.delegate.DelegateExecution -import org.onap.aai.domain.yang.Relationship -import org.onap.aai.domain.yang.RelationshipList -import org.onap.aai.domain.yang.ServiceInstance import org.onap.logging.filter.base.ONAPComponents import org.onap.so.beans.nsmf.SliceTaskParams import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor @@ -24,57 +40,43 @@ import org.onap.so.client.aai.AAIResourcesClient import org.onap.so.client.aai.entities.AAIResultWrapper import org.onap.so.client.aai.entities.uri.AAIResourceUri import org.onap.so.client.aai.entities.uri.AAIUriFactory -import org.onap.so.db.request.client.RequestsDbClient -import org.onap.so.db.request.beans.OrchestrationTask 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 -public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ +class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ private static final Logger logger = LoggerFactory.getLogger( DoCreateSliceServiceOption.class) - ExceptionUtil exceptionUtil = new ExceptionUtil() JsonUtils jsonUtil = new JsonUtils() - RequestsDbClient requestsDbClient = new RequestsDbClient() - OofUtils oofUtils = new OofUtils() - /** - * Pre Process the BPMN Flow Request - * Inclouds: - * generate the nsOperationKey - * generate the nsParameters - */ - void preProcessRequest (DelegateExecution execution) { - String msg = "" - logger.trace("Enter preProcessRequest()") - String taskID = execution.getVariable("taskID") - Boolean isSharable = true - String resourceSharingLevel = execution.getVariable("resourceSharingLevel") - if (resourceSharingLevel.equals("shared")) - isSharable = true - execution.setVariable("isSharable",isSharable) - logger.trace("Exit preProcessRequest") + ObjectMapper objectMapper = new ObjectMapper() + void preProcessRequest (DelegateExecution execution) { } void getNSIOptionfromOOF(DelegateExecution execution) { + //解析sliceProfile + logger.debug("start parseServiceProfile") + parseServiceProfile(execution) + logger.debug("end parseServiceProfile") + String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution) logger.debug( "get NSI option OOF Url: " + urlString) + boolean isNSISuggested = true execution.setVariable("isNSISuggested",isNSISuggested) - String nsiInstanceId = "" - String nsiName = "" - SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + //Prepare auth for OOF - Begin def authHeader = "" String basicAuth = UrnPropertiesReader.getVariable("mso.oof.auth", execution) @@ -100,117 +102,127 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ String requestId = execution.getVariable("msoRequestId") Map profileInfo = execution.getVariable("serviceProfile") - String nstModelUuid = execution.getVariable("nstModelUuid") - String nstModelInvariantUuid = execution.getVariable("nstModelInvariantUuid") - String nstInfo = """"NSTInfo" : { - "invariantUUID":"${nstModelInvariantUuid}", - "UUID":"${nstModelUuid}" + Map nstSolution = execution.getVariable("nstSolution") + logger.debug("Get NST selection from OOF: " + nstSolution.toString()) + String nstInfo = """{ + "modelInvariantId":"${nstSolution.invariantUUID}", + "modelVersionId":"${nstSolution.UUID}", + "modelName":"${nstSolution.NSTName}" }""" - String oofRequest = oofUtils.buildSelectNSIRequest(execution, requestId, nstInfo, profileInfo) + String oofRequest = oofUtils.buildSelectNSIRequest(requestId, nstInfo, profileInfo) + logger.debug("Sending request to OOF: " + oofRequest) //send request to get NSI option - Begin - URL url = new URL(urlString+"/api/oof/v1/selectnsi") + URL url = new URL(urlString+"/api/oof/selection/nsi/v1") HttpClient httpClient = new HttpClientFactory().newJsonClient(url, ONAPComponents.OOF) httpClient.addAdditionalHeader("Authorization", authHeader) Response httpResponse = httpClient.post(oofRequest) + processOOFResponse(httpResponse, execution) + } + + private void processOOFResponse(Response httpResponse, DelegateExecution execution) { int responseCode = httpResponse.getStatus() logger.debug("OOF sync response code is: " + responseCode) - if(responseCode != 200){ + if (responseCode != 200) { exceptionUtil.buildAndThrowWorkflowException(execution, responseCode, "Received a Bad Sync Response from OOF.") - logger.debug("Info: No NSI suggested by OOF" ) + logger.debug("Info: No NSI suggested by OOF") } - if(httpResponse.hasEntity()){ + SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + if (httpResponse.hasEntity()) { String OOFResponse = httpResponse.readEntity(String.class) + logger.debug("NSI OOFResponse is: " + OOFResponse) execution.setVariable("OOFResponse", OOFResponse) - int index = 0 //This needs to be changed to derive a value when we add policy to decide the solution options. + int index = 0 + //This needs to be changed to derive a value when we add policy to decide the solution options. Map OOFResponseObject = new JsonSlurper().parseText(OOFResponse) - if(execution.getVariable("isSharable" ) == true && OOFResponseObject.get("solutions").containsKey("sharedNSIsolutions")) { - nsiInstanceId = OOFResponseObject.get("solutions").get("sharedNSIsolutions").get(0).get("NSISolution").NSIId - nsiName = OOFResponseObject.get("solutions").get("sharedNSIsolutions").get(0).get("NSISolution").NSIName - sliceTaskParams.setNstId(nsiInstanceId) - sliceTaskParams.setSuggestNsiName(nsiName) - execution.setVariable("nsiInstanceId",nsiInstanceId) - execution.setVariable("nsiName",nsiName) - }else { - if(OOFResponseObject.get("solutions").containsKey("newNSISolutions")) { - List NSSImap = OOFResponseObject.get("solutions").get("newNSISolutions").get(index).get("NSSISolutions") - for(Map nssi : NSSImap) { - String nssiName = nssi.get("NSSISolution").NSSIName - String nssiId = nssi.get("NSSISolution").NSSIId - String domain = nssi.get("NSSISolution").domain.toUpperCase() - switch (domain) { - case "AN": - sliceTaskParams.setAnSuggestNssiId(nssiId) - sliceTaskParams.setAnSuggestNssiName(nssiName) - break; - case "CN": - sliceTaskParams.setCnSuggestNssiId(nssiId) - sliceTaskParams.setCnSuggestNssiName(nssiName) - break; - case "TN": - sliceTaskParams.setTnSuggestNssiId(nssiId) - sliceTaskParams.setTnSuggestNssiName(nssiName) - break; - default: - break; + Map solutions = OOFResponseObject.get("solutions") + + Boolean isSharable = false + String resourceSharingLevel = execution.getVariable("resourceSharingLevel") + if (resourceSharingLevel.equals("shared")) + isSharable = true + + if (solutions != null) { + if (isSharable) { + //sharedNSISolution + processSharedNSISolutions(solutions, execution) + } else { + //TODO test OOF don't implement in Frankfurt release + if (solutions.containsKey("newNSISolutions")) { + List newNSISolutions = solutions.get("newNSISolutions") + List NSSImap = new ArrayList<>() + if (newNSISolutions != null && newNSISolutions.size() > 0) { + NSSImap = newNSISolutions.get(index).get("NSSISolutions") as List } + for (Map nssi : NSSImap) { + def nssiSolution = nssi.get("NSSISolution") as Map + String nssiName = nssiSolution.getOrDefault("NSSIName", "") + String nssiId = nssiSolution.getOrDefault("NSSIId", "") + String domain = nssiSolution.getOrDefault("domainName", "").toString().toUpperCase() + switch (domain) { + case "AN": + sliceTaskParams.setAnSuggestNssiId(nssiId) + sliceTaskParams.setAnSuggestNssiName(nssiName) + break + case "CN": + sliceTaskParams.setCnSuggestNssiId(nssiId) + sliceTaskParams.setCnSuggestNssiName(nssiName) + break + case "TN": + sliceTaskParams.setTnSuggestNssiId(nssiId) + sliceTaskParams.setTnSuggestNssiName(nssiName) + break + default: + break + } + } + //TODO sliceProfile } } - } execution.setVariable("sliceTaskParams", sliceTaskParams) - logger.debug("Info: No NSI suggested by OOF" ) + logger.debug("Info: No NSI suggested by OOF") } - //send request to get NSI option - Begin - + logger.debug("*** Completed options Call to OOF ***") + } - //send request to get NSI service Info - Begin - - /*** - * Need to check whether its needed. - */ -// logger.debug("Begin to query OOF suggetsed NSI from AAI ") -// if(isBlank(nsiInstanceId)){ -// isNSISuggested = false -// execution.setVariable("isNSISuggested",isNSISuggested) -// }else -// { -// try { -// String globalSubscriberId = execution.getVariable('globalSubscriberId') -// String serviceType = execution.getVariable('subscriptionServiceType') -// AAIResourcesClient resourceClient = new AAIResourcesClient() -// AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, nsiInstanceId) -// AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class) -// Optional si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class) -// org.onap.aai.domain.yang.ServiceInstance nsiServiceInstance = si.get() -// execution.setVariable("nsiServiceInstance",nsiServiceInstance) -// isNSISuggested = true -// execution.setVariable("isNSISuggested",isNSISuggested) -// SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") -// sliceTaskParams.setSuggestNsiId(nsiInstanceId) -// sliceTaskParams.setSuggestNsiName(si.get().getServiceInstanceName()) -// execution.setVariable("sliceTaskParams", sliceTaskParams) -// logger.debug("Info: NSI suggested by OOF exist in AAI ") -// }catch(BpmnError e) { -// throw e -// }catch(Exception ex) { -// String msg = "Internal Error in getServiceInstance: " + ex.getMessage() -// //exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) -// logger.debug("Info: NSI suggested by OOF doesnt exist in AAI " + nsiInstanceId) -// } -// } - //send request to get NSI service Info - End - //${OrchestrationTaskHandler.createOrchestrationTask(execution.getVariable("OrchestrationTask"))} - logger.debug( "*** Completed options Call to OOF ***") + private void processSharedNSISolutions(Map solutions, DelegateExecution execution) { + if (!solutions.containsKey("sharedNSISolutions")) + { + logger.error("OOF don't return sharedNSISolutions") + return + } + String nsiName, nsiInstanceId, nssiId, nssiName + Map sliceProfile + SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") + Map sharedNSIsolution = ((List) solutions.get("sharedNSISolutions")).get(0) + nsiInstanceId = sharedNSIsolution.getOrDefault("NSIId", "") + nsiName = sharedNSIsolution.getOrDefault("NSIName", "") + sliceTaskParams.setNstId(nsiInstanceId) + sliceTaskParams.setSuggestNsiName(nsiName) + + //Temporary modification + List NSSIs = sharedNSIsolution.get("NSSIs") + if(NSSIs.size()==1){ + Map nssi = NSSIs.get(0) + nssiId = nssi.getOrDefault("NSSIId","") + nssiName = nssi.getOrDefault("NSSIName","") + sliceTaskParams.setCnSuggestNssiId(nssiId) + sliceTaskParams.setCnSuggestNssiName(nssiName) + sliceProfile = ((List)nssi.get("sliceProfile"))?.get(0) +// execution.setVariable("sliceProfileCn", sliceProfile) +// sliceTaskParams.setSliceProfileCn(sliceProfile) + } + logger.debug("OOF sharedNSISolution nsiInstanceId:${nsiInstanceId}, nsiName:${nsiName}, nssiId:${nssiId}, nssiName:${nssiName}") + logger.debug("OOF SliceProfile:"+sliceProfile.toString()) } - - public void parseServiceProfile(DelegateExecution execution) { + void parseServiceProfile(DelegateExecution execution) { logger.debug("Start parseServiceProfile") String serviceType = execution.getVariable("serviceType") Map serviceProfile = execution.getVariable("serviceProfile") @@ -230,9 +242,27 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ logger.debug("Finish parseServiceProfile") } - public Map getSliceProfile(String serviceType, String domain, Map serviceProfile) { - String variablePath = "nsmf." + serviceType + ".profileMap" + domain - String profileMapStr = UrnPropertiesReader.getVariable(variablePath) + Map getSliceProfile(String serviceType, String domain, Map serviceProfile) { + //String variablePath = "nsmf." + serviceType + ".profileMap" + domain + //String profileMapStr = UrnPropertiesReader.getVariable(variablePath) + String profileMapStr = """ { + "skip_post_instantiation_configuration":"skip_post_instantiation_configuration", + "controller_actor":"controller_actor", + "areaTrafficCapDL":"areaTrafficCapDL", + "maxNumberofUEs":"maxNumberofUEs", + "latency":"latency", + "expDataRateUL":"expDataRateUL", + "sNSSAI":"sNSSAI", + "plmnIdList":"plmnIdList", + "sST":"sST", + "areaTrafficCapUL":"areaTrafficCapUL", + "uEMobilityLevel":"uEMobilityLevel", + "expDataRateDL":"expDataRateDL", + "coverageAreaTAList":"coverageAreaTAList", + "activityFactor":"activityFactor", + "resourceSharingLevel":"resourceSharingLevel" + } + """.trim().replaceAll(" ", "") logger.debug("Profile map for " + domain + " : " + profileMapStr) Map profileMaps = objectMapper.readValue(profileMapStr, new TypeReference>(){}) Map sliceProfileTn = [:] @@ -243,92 +273,20 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ return sliceProfileTn } + void processDecomposition(DelegateExecution execution){ + logger.debug("Start processDecomposition") - void prepareNSSIList(DelegateExecution execution) - { ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition") - List nssiAssociated = new ArrayList<>() - Map nssimap = new HashMap<>() - String nsiInstanceId=execution.getVariable("nsiInstanceId") - String globalSubscriberId = execution.getVariable("globalSubscriberId") - String serviceType = execution.getVariable("subscriptionServiceType") - - try { - - ServiceInstance si = execution.getVariable("nsiServiceInstance") - //List relationships = si.getRelationshipList().getRelationship().stream().filter(relation -> - // relation.getRelatedTo().equalsIgnoreCase("service-instance")) - RelationshipList relationshipList = si.getRelationshipList() - List relationships = relationshipList.getRelationship() - for(Relationship relationship in relationships) - { - if(relationship.getRelatedTo().equalsIgnoreCase("service-instance")) - { - String NSSIassociated = relationship.getRelatedLink().substring(relationship.getRelatedLink().lastIndexOf("/") + 1); - if(!NSSIassociated.equals(nsiInstanceId)) - nssiAssociated.add(NSSIassociated) - } - } - }catch(BpmnError e) { - throw e - }catch(Exception ex) { - String msg = "Internal Error in getServiceInstance: " + ex.getMessage() - exceptionUtil.buildAndThrowWorkflowException(execution, 7000, msg) - } - Map params = execution.getVariable("params") SliceTaskParams sliceTaskParams = execution.getVariable("sliceTaskParams") - for(String nssiID in nssiAssociated) - { - try { - AAIResourcesClient resourceClient = new AAIResourcesClient() - AAIResourceUri serviceInstanceUri = AAIUriFactory.createResourceUri(AAIObjectType.SERVICE_INSTANCE, globalSubscriberId, serviceType, nssiID) - AAIResultWrapper wrapper = resourceClient.get(serviceInstanceUri, NotFoundException.class) - Optional si = wrapper.asBean(org.onap.aai.domain.yang.ServiceInstance.class) - org.onap.aai.domain.yang.ServiceInstance nssi = si.get() - - String domain = nssi.getEnvironmentContext().toString().toUpperCase() - switch (domain) { - case "AN": - sliceTaskParams.setAnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setAnSuggestNssiName(nssi.getServiceInstanceName()) - break; - case "CN": - sliceTaskParams.setCnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setCnSuggestNssiName(nssi.getServiceInstanceName()) - break; - case "TN": - sliceTaskParams.setTnSuggestNssiId(nssi.getServiceInstanceId()) - sliceTaskParams.setTnSuggestNssiName(nssi.getServiceInstanceName()) - break; - default: - break; - } - }catch(NotFoundException e) - { - logger.debug("NSSI Service Instance not found in AAI: " + nssiID) - }catch(Exception e) - { - logger.debug("NSSI Service Instance not found in AAI: " + nssiID) - } - - } String nstName = serviceDecomposition.getModelInfo().getModelName() sliceTaskParams.setNstName(nstName) String nstId = serviceDecomposition.getModelInfo().getModelUuid() sliceTaskParams.setNstId(nstId) - execution.setVariable("sliceTaskParams",sliceTaskParams) + logger.debug("End processDecomposition") } - void updateOptionsInDB(DelegateExecution execution) { - logger.debug("Updating options with default value since not sharable : Begin ") - String taskID = execution.getVariable("taskID") - String params = execution.getVariable("params") - logger.debug("Updating options with default value since not sharable : End ") - - } - void prepareNSTDecompose(DelegateExecution execution) { String modelUuid = execution.getVariable("nstModelUuid") @@ -364,14 +322,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ } - void updateStatusInDB(DelegateExecution execution) { - - String taskID = execution.getVariable("taskID") - //OrchestrationTask orchestrationTask = requestsDbClient.getNetworkSliceOption(taskID); - //orchestrationTask.setTaskStage("wait to confirm") - //requestsDbClient.updateNetworkSliceOption(orchestrationTask) - } - void prepareNSSTlistfromNST(DelegateExecution execution) { //Need to update this part from decomposition. logger.trace("Enter prepareNSSTlistfromNST()") @@ -400,7 +350,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ } - void getNSSTOption(DelegateExecution execution) { ServiceDecomposition serviceDecomposition= execution.getVariable("serviceDecomposition") String urlString = UrnPropertiesReader.getVariable("mso.oof.endpoint", execution) @@ -483,17 +432,17 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ case "AN": sliceTaskParams.setAnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setAnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break case "CN": sliceTaskParams.setCnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setCnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break case "TN": sliceTaskParams.setTnSuggestNssiId(nssi.getServiceInstanceId()) sliceTaskParams.setTnSuggestNssiName(nssi.getServiceInstanceName()) - break; + break default: - break; + break } }catch(NotFoundException e) { @@ -503,22 +452,6 @@ public class DoCreateSliceServiceOption extends AbstractServiceTaskProcessor{ logger.debug("NSSI Service Instance not found in AAI: " + nssiInstanceId) } } - - - //Prepare send request to OOF - End - -// String content = serviceDecomposition.getServiceInfo().getServiceArtifact().get(0).getContent() -// String nsstID = jsonUtil.getJsonValue(content, "metadata.id") -// String vendor = jsonUtil.getJsonValue(content, "metadata.vendor") -// String domain = jsonUtil.getJsonValue(content, "metadata.domainType") -// String type = jsonUtil.getJsonValue(content, "metadata.type") -// String nsstContentInfo = """{ -// "NsstID":"${nsstID}", -// "Vendor":"${vendor}", -// "type":"${type}" -// }""" - logger.debug("Prepare NSSI option completed ") } -} - +} \ No newline at end of file -- cgit 1.2.3-korg