diff options
Diffstat (limited to 'bpmn/so-bpmn-tasks/src/main')
10 files changed, 309 insertions, 108 deletions
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java index e3181c3e91..55edf0bb6c 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAICreateTasks.java @@ -260,7 +260,7 @@ public class AAICreateTasks { public void createPnf(BuildingBlockExecution execution) { try { Pnf pnf = extractPojosForBB.extractByKey(execution, ResourceKey.PNF); - aaiPnfResources.checkIfPnfExistsInAaiAndCanBeUsed(pnf.getPnfName()); + aaiPnfResources.checkIfPnfExistsInAaiAndCanBeUsed(pnf); ServiceInstance serviceInstance = extractPojosForBB.extractByKey(execution, ResourceKey.SERVICE_INSTANCE_ID); aaiPnfResources.createPnfAndConnectServiceInstance(pnf, serviceInstance); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java index cc630232c2..6c989093ab 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/aai/tasks/AAIUpdateTasks.java @@ -90,6 +90,13 @@ public class AAIUpdateTasks { } /** + * BPMN access method to update status of Pnf to Inventoried in AAI + */ + public void updateOrchestrationStatusInventoriedPnf(BuildingBlockExecution execution) { + updateOrchestrationStatusForPnf(execution, OrchestrationStatus.INVENTORIED); + } + + /** * BPMN access method to update status of Pnf to Active in AAI */ public void updateOrchestrationStatusActivePnf(BuildingBlockExecution execution) { diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java index 6831a656a8..92ed61df67 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/SdncInputParametersProvider.java @@ -50,11 +50,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; public class SdncInputParametersProvider extends AbstractInputParametersProvider<GenericVnf> { private static final Logger LOGGER = LoggerFactory.getLogger(SdncInputParametersProvider.class); - private static final String VNF_PARAMETERS_PATH = "$..vnf-parameters"; - private final SDNCClient sdncClient; - private final ObjectMapper mapper; @Autowired @@ -68,34 +65,12 @@ public class SdncInputParametersProvider extends AbstractInputParametersProvider final String vnfName = genericVnf.getVnfName(); final String vnfType = getVnfType(genericVnf); final String url = getPreloadVnfsUrl(vnfName, vnfType); + final InputParameter inputParameter = parseInputParametersUsingUrl(url); - try { - LOGGER.debug("Will query sdnc for input parameters using url: {}", url); - final String jsonResponse = sdncClient.get(url); - final String json = JsonPathUtil.getInstance().locateResult(jsonResponse, VNF_PARAMETERS_PATH).orElse(null); - - try { - - if (json != null) { - final List<VnfParameter> vnfParametersArray = - mapper.readValue(json, new TypeReference<List<VnfParameter>>() {}); - final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParametersArray); - final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap); - final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap); - final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks); - LOGGER.info("InputParameter found in sdnc response : {}", inputParameter); - return inputParameter; - } - - } catch (final IOException exception) { - LOGGER.error("Unable to parse vnf parameters : {}", json, exception); - } - } catch (final Exception exception) { - LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception); - } + if (inputParameter != null) + return inputParameter; LOGGER.warn("No input parameters found ..."); return NullInputParameter.NULL_INSTANCE; - } private List<ExternalVirtualLink> getExtVirtualLinks(final Map<String, String> vnfParametersMap) { @@ -109,19 +84,18 @@ public class SdncInputParametersProvider extends AbstractInputParametersProvider private Map<String, String> getAdditionalParameters(final Map<String, String> vnfParametersMap) { final String additionalParamsString = vnfParametersMap.get(ADDITIONAL_PARAMS); + if (additionalParamsString != null && !additionalParamsString.isEmpty()) { return parseAdditionalParameters(additionalParamsString); } return Collections.emptyMap(); } - private Map<String, String> getVnfParameterMap(final List<VnfParameter> array) { if (array != null) { return array.stream().filter(vnfParam -> vnfParam.getName() != null && vnfParam.getValue() != null) .collect(Collectors.toMap(VnfParameter::getName, VnfParameter::getValue)); } - return Collections.emptyMap(); } @@ -131,10 +105,43 @@ public class SdncInputParametersProvider extends AbstractInputParametersProvider private String getVnfType(final GenericVnf genericVnf) { final ModelInfoGenericVnf modelInfoGenericVnf = genericVnf.getModelInfoGenericVnf(); - if (modelInfoGenericVnf != null && modelInfoGenericVnf.getModelName() != null) { + if (modelInfoGenericVnf != null) { return modelInfoGenericVnf.getModelName(); } return genericVnf.getVnfType(); } + private InputParameter parseInputParametersUsingUrl(String url) { + try { + LOGGER.debug("Will query sdnc for input parameters using url: {}", url); + final String jsonResponse = sdncClient.get(url); + final String json = JsonPathUtil.getInstance().locateResult(jsonResponse, VNF_PARAMETERS_PATH).orElse(null); + final InputParameter inputParameter = parseVnfParameters(json); + + if (inputParameter != null) + return inputParameter; + } catch (final Exception exception) { + LOGGER.error("Unable to retrieve/parse input parameters using URL: {} ", url, exception); + } + return null; + } + + private InputParameter parseVnfParameters(String json) { + try { + if (json != null) { + final List<VnfParameter> vnfParametersArray = + mapper.readValue(json, new TypeReference<List<VnfParameter>>() {}); + final Map<String, String> vnfParametersMap = getVnfParameterMap(vnfParametersArray); + final Map<String, String> additionalParameters = getAdditionalParameters(vnfParametersMap); + final List<ExternalVirtualLink> extVirtualLinks = getExtVirtualLinks(vnfParametersMap); + final InputParameter inputParameter = new InputParameter(additionalParameters, extVirtualLinks); + LOGGER.info("InputParameter found in sdnc response : {}", inputParameter); + return inputParameter; + } + + } catch (final IOException exception) { + LOGGER.error("Unable to parse vnf parameters : {}", json, exception); + } + return null; + } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java index ac939d04ec..bdd738b031 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/UserParamInputParametersProvider.java @@ -40,12 +40,12 @@ public class UserParamInputParametersProvider extends AbstractInputParametersPro final InputParameter inputParameter = new InputParameter(); final Object additionalParams = userParams.get(ADDITIONAL_PARAMS); - if (additionalParams != null && additionalParams instanceof String) { + if (additionalParams instanceof String) { inputParameter.setAdditionalParams(parseAdditionalParameters(additionalParams.toString())); } final Object extVirtualLinks = userParams.get(EXT_VIRTUAL_LINKS); - if (extVirtualLinks != null && extVirtualLinks instanceof String) { + if (extVirtualLinks instanceof String) { inputParameter.setExtVirtualLinks(parseExternalVirtualLinks(extVirtualLinks.toString())); } LOGGER.info("InputParameter found in userParams : {}", inputParameter); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java index 0d45dad6fe..2491c99bc4 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/utils/VnfParameter.java @@ -35,30 +35,18 @@ public class VnfParameter { @JsonProperty("vnf-parameter-value") private String value; - /** - * @return the name - */ public String getName() { return name; } - /** - * @param name the name to set - */ public void setName(final String name) { this.name = name; } - /** - * @return the value - */ public String getValue() { return value; } - /** - * @param value the value to set - */ public void setValue(final String value) { this.value = value; } @@ -66,10 +54,9 @@ public class VnfParameter { @Override public int hashCode() { final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((value == null) ? 0 : value.hashCode()); - return Objects.hash(name, value); + int nameResult = prime + ((name == null) ? 0 : name.hashCode()); + int valueResult = prime + ((value == null) ? 0 : value.hashCode()); + return Objects.hash(nameResult, valueResult); } @Override @@ -78,7 +65,6 @@ public class VnfParameter { VnfParameter other = (VnfParameter) obj; return Objects.equals(name, other.name) && Objects.equals(value, other.value); } - return false; } @@ -86,5 +72,4 @@ public class VnfParameter { public String toString() { return "VnfParameter [name=" + name + ", value=" + value + "]"; } - } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcOrchestratorPreProcessor.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcOrchestratorPreProcessor.java index b337564dab..1f05522011 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcOrchestratorPreProcessor.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcOrchestratorPreProcessor.java @@ -78,6 +78,9 @@ public class AppcOrchestratorPreProcessor { String identityUrl = execution.getVariable("identityUrl"); appcTaskRequest.setIdentityUrl(identityUrl); + String requestorId = gBBInput.getRequestContext().getRequestorId(); + appcTaskRequest.setRequestorId(requestorId); + if (gBBInput.getRequestContext().getRequestParameters() != null) { String payload = gBBInput.getRequestContext().getRequestParameters().getPayload(); if (payload == null) { diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java new file mode 100644 index 0000000000..72a8590ad5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/flowspecific/tasks/GenericPnfDispatcher.java @@ -0,0 +1,174 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2020 Nordix Foundation. + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.so.bpmn.infrastructure.flowspecific.tasks; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.delegate.JavaDelegate; +import org.onap.aai.domain.yang.Pnf; +import org.onap.so.bpmn.core.json.JsonUtils; +import org.onap.so.bpmn.infrastructure.pnf.management.PnfManagement; +import org.onap.so.client.exception.ExceptionBuilder; +import org.onap.so.db.catalog.beans.PnfResourceCustomization; +import org.onap.so.db.catalog.client.CatalogDbClient; +import org.onap.so.serviceinstancebeans.RequestDetails; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*; + +/** + * This implementation of {@link JavaDelegate} is used to populate the execution object for pnf actions + */ +@Component +public class GenericPnfDispatcher implements JavaDelegate { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + private static final String SERVICE_INSTANCE_NAME = "serviceInstanceName"; + private static final String BPMN_REQUEST = "bpmnRequest"; + private static final String RESOURCE_CUSTOMIZATION_UUID_PARAM = "resource_customization_uuid"; + private static final String PNF_NAME = "pnfName"; + + // ERROR CODE for variable not found in the delegation Context + private static final int ERROR_CODE = 601; + + @Autowired + private PnfManagement pnfManagement; + + @Autowired + private ExceptionBuilder exceptionUtil; + + @Autowired + private CatalogDbClient catalogDbClient; + + @Autowired + private ObjectMapper mapper; + + @Override + public void execute(DelegateExecution delegateExecution) throws Exception { + logger.debug("Running execute block for activity id: {}, name: {}", delegateExecution.getCurrentActivityId(), + delegateExecution.getCurrentActivityName()); + + RequestDetails bpmnRequestDetails = requestVerification(delegateExecution); + + final String serviceInstanceName = bpmnRequestDetails.getRequestInfo().getInstanceName(); + final String pnfName; + if (delegateExecution.getVariable(PNF_NAME) == null + || String.valueOf(delegateExecution.getVariable(PNF_NAME)).trim().isEmpty()) { + pnfName = bpmnRequestDetails.getRequestParameters().getUserParamValue(PNF_NAME); + } else { + pnfName = String.valueOf(delegateExecution.getVariable(PNF_NAME)); + } + final String serviceModelUuid = bpmnRequestDetails.getModelInfo().getModelUuid(); + final List<Map<String, Object>> userParams = bpmnRequestDetails.getRequestParameters().getUserParams(); + final Pnf pnf = getPnfByPnfName(delegateExecution, pnfName); + final List<PnfResourceCustomization> pnfCustomizations = + getPnfResourceCustomizations(delegateExecution, serviceModelUuid); + final PnfResourceCustomization pnfResourceCustomization = pnfCustomizations.get(0); + final String payload = bpmnRequestDetails.getRequestParameters().getPayload(); + + populateExecution(delegateExecution, bpmnRequestDetails, pnfResourceCustomization, pnf, serviceInstanceName, + pnfName, serviceModelUuid, userParams, payload); + + logger.trace("Completed dispatcher request for PNF."); + } + + private RequestDetails requestVerification(DelegateExecution delegateExecution) throws IOException { + RequestDetails bpmnRequestDetails = mapper.readValue( + JsonUtils.getJsonValue(String.valueOf(delegateExecution.getVariable(BPMN_REQUEST)), "requestDetails"), + RequestDetails.class); + + throwIfNull(delegateExecution, bpmnRequestDetails.getModelInfo(), SERVICE_MODEL_INFO); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestInfo(), "RequestInfo"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters(), "RequestParameters"); + throwIfNull(delegateExecution, bpmnRequestDetails.getRequestParameters().getUserParams(), "UserParams"); + + return bpmnRequestDetails; + } + + private void populateExecution(DelegateExecution delegateExecution, RequestDetails bpmnRequestDetails, + PnfResourceCustomization pnfResourceCustomization, Pnf pnf, String serviceInstanceName, String pnfName, + String serviceModelUuid, List<Map<String, Object>> userParams, String payload) { + + delegateExecution.setVariable(SERVICE_MODEL_INFO, bpmnRequestDetails.getModelInfo()); + delegateExecution.setVariable(SERVICE_INSTANCE_NAME, serviceInstanceName); + delegateExecution.setVariable(PNF_CORRELATION_ID, pnfName); + delegateExecution.setVariable(MODEL_UUID, serviceModelUuid); + delegateExecution.setVariable(PNF_UUID, pnf.getPnfId()); + delegateExecution.setVariable(PRC_BLUEPRINT_NAME, pnfResourceCustomization.getBlueprintName()); + delegateExecution.setVariable(PRC_BLUEPRINT_VERSION, pnfResourceCustomization.getBlueprintVersion()); + delegateExecution.setVariable(PRC_CUSTOMIZATION_UUID, pnfResourceCustomization.getModelCustomizationUUID()); + delegateExecution.setVariable(RESOURCE_CUSTOMIZATION_UUID_PARAM, + pnfResourceCustomization.getModelCustomizationUUID()); + delegateExecution.setVariable(PRC_INSTANCE_NAME, pnfResourceCustomization.getModelInstanceName()); + delegateExecution.setVariable(PRC_CONTROLLER_ACTOR, pnfResourceCustomization.getControllerActor()); + + for (Map<String, Object> param : userParams) { + if (param.containsKey("name") && param.containsKey("value")) { + delegateExecution.setVariable(param.get("name").toString(), param.get("value").toString()); + } + } + + delegateExecution.setVariable(REQUEST_PAYLOAD, payload); + } + + private Pnf getPnfByPnfName(DelegateExecution delegateExecution, String pnfName) { + Optional<Pnf> pnfOptional = Optional.empty(); + try { + pnfOptional = pnfManagement.getEntryFor(pnfName); + } catch (IOException e) { + throwExceptionWithWarn(delegateExecution, "Unable to fetch from AAI" + e.getMessage()); + } + if (!pnfOptional.isPresent()) { + throwExceptionWithWarn(delegateExecution, "AAI entry for PNF: " + pnfName + " does not exist"); + } + return pnfOptional.get(); + } + + private List<PnfResourceCustomization> getPnfResourceCustomizations(DelegateExecution delegateExecution, + String serviceModelUuid) { + List<PnfResourceCustomization> pnfCustomizations = + catalogDbClient.getPnfResourceCustomizationByModelUuid(serviceModelUuid); + + if (pnfCustomizations == null || pnfCustomizations.isEmpty()) { + throwExceptionWithWarn(delegateExecution, + "Unable to find the PNF resource customizations of model service UUID: " + serviceModelUuid); + } + return pnfCustomizations; + } + + private void throwIfNull(DelegateExecution delegateExecution, Object obj, String param) { + if (obj == null) { + throwExceptionWithWarn(delegateExecution, + "Unable to find the parameter: " + param + " in the execution context"); + } + } + + private void throwExceptionWithWarn(DelegateExecution delegateExecution, String exceptionMsg) { + logger.warn(exceptionMsg); + exceptionUtil.buildAndThrowWorkflowException(delegateExecution, ERROR_CODE, exceptionMsg); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java index 1a49e3af7f..985114abcd 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowAction.java @@ -37,6 +37,7 @@ import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.commons.lang3.SerializationUtils; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.javatuples.Pair; import org.onap.aai.domain.yang.GenericVnf; @@ -460,9 +461,8 @@ public class WorkflowAction { return vnfcs; } - protected <T> List<T> getRelatedResourcesInVnfc(Vnfc vnfc, Class<T> resultClass, AAIObjectType type) { - - List<T> configurations = new ArrayList<>(); + protected <T> T getRelatedResourcesInVnfc(Vnfc vnfc, Class<T> resultClass, AAIObjectType type) throws Exception { + T configuration = null; AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfc.getVnfcName()); AAIResultWrapper vnfcResultsWrapper = bbInputSetupUtils.getAAIResourceDepthOne(uri); Optional<Relationships> relationshipsOp = vnfcResultsWrapper.getRelationships(); @@ -472,12 +472,19 @@ public class WorkflowAction { Relationships relationships = relationshipsOp.get(); List<AAIResultWrapper> configurationResultWrappers = this.getResultWrappersFromRelationships(relationships, type); - for (AAIResultWrapper configurationResultWrapper : configurationResultWrappers) { - Optional<T> configurationOp = configurationResultWrapper.asBean(resultClass); - configurationOp.ifPresent(configurations::add); + if (configurationResultWrappers.size() > 1) { + String multipleRelationshipsError = + "Multiple relationships exist from VNFC " + vnfc.getVnfcName() + " to Configurations"; + throw new Exception(multipleRelationshipsError); + } + if (!configurationResultWrappers.isEmpty()) { + Optional<T> configurationOp = configurationResultWrappers.get(0).asBean(resultClass); + if (configurationOp.isPresent()) { + configuration = configurationOp.get(); + } } } - return configurations; + return configuration; } protected List<AAIResultWrapper> getResultWrappersFromRelationships(Relationships relationships, @@ -519,33 +526,26 @@ public class WorkflowAction { List<org.onap.aai.domain.yang.Vnfc> vnfcs = getRelatedResourcesInVfModule(vnfId, vfModuleId, org.onap.aai.domain.yang.Vnfc.class, AAIObjectType.VNFC); for (org.onap.aai.domain.yang.Vnfc vnfc : vnfcs) { - List<org.onap.aai.domain.yang.Configuration> configurations = getRelatedResourcesInVnfc(vnfc, + WorkflowResourceIds workflowIdsCopy = SerializationUtils.clone(dataObj.getWorkflowResourceIds()); + org.onap.aai.domain.yang.Configuration configuration = getRelatedResourcesInVnfc(vnfc, org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION); - if (configurations.size() > 1) { - String multipleRelationshipsError = - "Multiple relationships exist from VNFC " + vnfc.getVnfcName() + " to Configurations"; - buildAndThrowException(dataObj.getExecution(), "Exception in getConfigBuildingBlock: ", - new Exception(multipleRelationshipsError)); - } - for (org.onap.aai.domain.yang.Configuration configuration : configurations) { - dataObj.getWorkflowResourceIds().setConfigurationId(configuration.getConfigurationId()); - for (OrchestrationFlow orchFlow : result) { - dataObj.getResourceKey().setVfModuleCustomizationId(vfModuleCustomizationUUID); - dataObj.getResourceKey().setCvnfModuleCustomizationId(vnfc.getModelCustomizationId()); - dataObj.getResourceKey().setVnfCustomizationId(vnfCustomizationUUID); - String vnfcName = getVnfcNameForConfiguration(configuration); - if (vnfcName == null || vnfcName.isEmpty()) { - buildAndThrowException(dataObj.getExecution(), "Exception in create execution list " - + ": VnfcName does not exist or is null while there is a configuration for the vfModule", - new Exception("Vnfc and Configuration do not match")); - } - ExecuteBuildingBlock ebb = - buildExecuteBuildingBlock(orchFlow, dataObj.getRequestId(), dataObj.getResourceKey(), - dataObj.getApiVersion(), dataObj.getResourceId(), dataObj.getRequestAction(), - dataObj.isaLaCarte(), dataObj.getVnfType(), dataObj.getWorkflowResourceIds(), - dataObj.getRequestDetails(), false, null, vnfcName, true, null); - flowsToExecuteConfigs.add(ebb); + workflowIdsCopy.setConfigurationId(configuration.getConfigurationId()); + for (OrchestrationFlow orchFlow : result) { + dataObj.getResourceKey().setVfModuleCustomizationId(vfModuleCustomizationUUID); + dataObj.getResourceKey().setCvnfModuleCustomizationId(vnfc.getModelCustomizationId()); + dataObj.getResourceKey().setVnfCustomizationId(vnfCustomizationUUID); + String vnfcName = vnfc.getVnfcName(); + if (vnfcName == null || vnfcName.isEmpty()) { + buildAndThrowException(dataObj.getExecution(), "Exception in create execution list " + + ": VnfcName does not exist or is null while there is a configuration for the vfModule", + new Exception("Vnfc and Configuration do not match")); } + ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, dataObj.getRequestId(), + dataObj.getResourceKey(), dataObj.getApiVersion(), dataObj.getResourceId(), + dataObj.getRequestAction(), dataObj.isaLaCarte(), dataObj.getVnfType(), workflowIdsCopy, + dataObj.getRequestDetails(), false, null, vnfcName, true, null); + flowsToExecuteConfigs.add(ebb); + } } return flowsToExecuteConfigs; @@ -613,23 +613,6 @@ public class WorkflowAction { return orchFlows; } - protected String getVnfcNameForConfiguration(org.onap.aai.domain.yang.Configuration configuration) { - AAIResultWrapper wrapper = new AAIResultWrapper(configuration); - Optional<Relationships> relationshipsOp = wrapper.getRelationships(); - if (!relationshipsOp.isPresent()) { - logger.debug("No relationships were found for Configuration in AAI"); - return null; - } - Relationships relationships = relationshipsOp.get(); - List<AAIResultWrapper> vnfcResultWrappers = relationships.getByType(AAIObjectType.VNFC); - if (vnfcResultWrappers.size() != 1) { - logger.debug("Too many vnfcs or no vnfc found that are related to configuration"); - } - Optional<Vnfc> vnfcOp = vnfcResultWrappers.get(0).asBean(Vnfc.class); - return vnfcOp.map(Vnfc::getVnfcName).orElse(null); - - } - protected List<Resource> sortVfModulesByBaseFirst(List<Resource> vfModuleResources) { int count = 0; for (Resource resource : vfModuleResources) { @@ -953,6 +936,7 @@ public class WorkflowAction { bbInputSetup.getExistingServiceInstance(serviceInstanceAAI); resourceList.add(new Resource(WorkflowType.SERVICE, serviceInstanceMSO.getServiceInstanceId(), false)); traverseServiceInstanceMSOVnfs(resourceList, aaiResourceIds, serviceInstanceMSO); + traverseServiceInstanceMSOPnfs(resourceList, aaiResourceIds, serviceInstanceMSO); if (serviceInstanceMSO.getNetworks() != null) { for (org.onap.so.bpmn.servicedecomposition.bbobjects.L3Network network : serviceInstanceMSO .getNetworks()) { @@ -1010,6 +994,18 @@ public class WorkflowAction { } } + private void traverseServiceInstanceMSOPnfs(List<Resource> resourceList, + List<Pair<WorkflowType, String>> aaiResourceIds, + org.onap.so.bpmn.servicedecomposition.bbobjects.ServiceInstance serviceInstanceMSO) { + if (serviceInstanceMSO.getPnfs() == null) { + return; + } + for (org.onap.so.bpmn.servicedecomposition.bbobjects.Pnf pnf : serviceInstanceMSO.getPnfs()) { + aaiResourceIds.add(new Pair<>(WorkflowType.PNF, pnf.getPnfId())); + resourceList.add(new Resource(WorkflowType.PNF, pnf.getPnfId(), false)); + } + } + private void traverseVnfModules(List<Resource> resourceList, List<Pair<WorkflowType, String>> aaiResourceIds, org.onap.so.bpmn.servicedecomposition.bbobjects.GenericVnf vnf) { if (vnf.getVfModules() == null) { diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java index 343b25eb97..7420df144a 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/workflow/tasks/WorkflowActionBBTasks.java @@ -334,6 +334,7 @@ public class WorkflowActionBBTasks { && !rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("FabricConfiguration")) { rollbackFlowsFiltered.remove(rollbackFlow); } else if (rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("Delete") + && !rollbackFlow.getBuildingBlock().getBpmnFlowName().contains("FabricConfiguration") && ROLLBACKTOCREATED.equals(handlingCode)) { rollbackFlowsFiltered.remove(rollbackFlow); } @@ -458,11 +459,10 @@ public class WorkflowActionBBTasks { } } - protected String getConfigurationId(Vnfc vnfc) { - List<Configuration> configurations = + protected String getConfigurationId(Vnfc vnfc) throws Exception { + Configuration configuration = workflowAction.getRelatedResourcesInVnfc(vnfc, Configuration.class, AAIObjectType.CONFIGURATION); - if (!configurations.isEmpty()) { - Configuration configuration = configurations.get(0); + if (configuration != null) { return configuration.getConfigurationId(); } else { return UUID.randomUUID().toString(); diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java index 3b22cd9d81..3da17194ff 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/client/orchestration/AAIPnfResources.java @@ -22,6 +22,7 @@ package org.onap.so.client.orchestration; import com.google.common.base.Strings; import java.util.Optional; +import org.apache.commons.lang3.StringUtils; import org.onap.aai.domain.yang.RelatedToProperty; import org.onap.aai.domain.yang.Relationship; import org.onap.aai.domain.yang.RelationshipData; @@ -68,11 +69,39 @@ public class AAIPnfResources { injectionHelper.getAaiClient().update(pnfURI, aaiObjectMapper.mapPnf(pnfCopy)); } - public void checkIfPnfExistsInAaiAndCanBeUsed(String pnfName) throws Exception { - Optional<org.onap.aai.domain.yang.Pnf> pnfFromAai = injectionHelper.getAaiClient() - .get(org.onap.aai.domain.yang.Pnf.class, AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnfName)); + public void checkIfPnfExistsInAaiAndCanBeUsed(Pnf pnf) throws Exception { + Optional<org.onap.aai.domain.yang.Pnf> pnfFromAai = + injectionHelper.getAaiClient().get(org.onap.aai.domain.yang.Pnf.class, + AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnf.getPnfName())); if (pnfFromAai.isPresent()) { checkIfPnfCanBeUsed(pnfFromAai.get()); + updatePnfInAAI(pnf, pnfFromAai.get()); + } + } + + private void updatePnfInAAI(Pnf pnf, org.onap.aai.domain.yang.Pnf pnfFromAai) { + updatePnfFields(pnf, pnfFromAai); + injectionHelper.getAaiClient().update(AAIUriFactory.createResourceUri(AAIObjectType.PNF, pnf.getPnfName()), + pnfFromAai); + logger.debug("updatePnfInAAI: {}", pnfFromAai); + } + + private void updatePnfFields(Pnf pnf, org.onap.aai.domain.yang.Pnf pnfFromAai) { + if (pnf.getModelInfoPnf() != null + && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelCustomizationUuid())) { + pnfFromAai.setModelCustomizationId(pnf.getModelInfoPnf().getModelCustomizationUuid()); + } + if (pnf.getModelInfoPnf() != null && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelInvariantUuid())) { + pnfFromAai.setModelInvariantId(pnf.getModelInfoPnf().getModelInvariantUuid()); + } + if (pnf.getModelInfoPnf() != null && StringUtils.isNotBlank(pnf.getModelInfoPnf().getModelUuid())) { + pnfFromAai.setModelVersionId(pnf.getModelInfoPnf().getModelUuid()); + } + if (pnf.getOrchestrationStatus() != null && StringUtils.isNotBlank(pnf.getOrchestrationStatus().toString())) { + pnfFromAai.setOrchestrationStatus(pnf.getOrchestrationStatus().toString()); + } + if (StringUtils.isNotBlank(pnf.getRole())) { + pnfFromAai.setNfRole(pnf.getRole()); } } |