diff options
Diffstat (limited to 'bpmn/so-bpmn-tasks/src/main')
4 files changed, 96 insertions, 18 deletions
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/MonitorVnfmDeleteJobTask.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/MonitorVnfmDeleteJobTask.java index c4804c05c2..e13d1e4dda 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/MonitorVnfmDeleteJobTask.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/adapter/vnfm/tasks/MonitorVnfmDeleteJobTask.java @@ -2,6 +2,8 @@ * ============LICENSE_START======================================================= * Copyright (C) 2019 Ericsson. All rights reserved. * ================================================================================ + * Modifications Copyright (c) 2019 Samsung + * ================================================================================ * 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 @@ -85,8 +87,7 @@ public class MonitorVnfmDeleteJobTask extends MonitorVnfmJobTask { + (deleteVnfResponse != null ? deleteVnfResponse.getJobId() : "null") + "Unable to retrieve OperationStatus"; LOGGER.error(message); exceptionUtil.buildAndThrowWorkflowException(execution, 1214, message); - } - if (operationStatusOption.isPresent()) { + } else if (operationStatusOption != null && operationStatusOption.isPresent()) { final OperationStateEnum operationStatus = operationStatusOption.get(); if (operationStatus != OperationStateEnum.COMPLETED) { final String message = diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/exceptions/SDNCErrorResponseException.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/exceptions/SDNCErrorResponseException.java new file mode 100644 index 0000000000..e0f88a20a5 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/exceptions/SDNCErrorResponseException.java @@ -0,0 +1,13 @@ +package org.onap.so.bpmn.infrastructure.sdnc.exceptions; + +public class SDNCErrorResponseException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 7807799223298140702L; + + public SDNCErrorResponseException(String message) { + super(message); + } +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java index a4ef28496e..24f642ae72 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/sdnc/tasks/SDNCRequestTasks.java @@ -20,7 +20,15 @@ package org.onap.so.bpmn.infrastructure.sdnc.tasks; +import java.io.StringReader; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathFactory; + import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.onap.so.bpmn.infrastructure.sdnc.exceptions.SDNCErrorResponseException; import org.onap.so.client.exception.BadResponseException; import org.onap.so.client.exception.ExceptionBuilder; import org.onap.so.client.exception.MapperException; @@ -31,6 +39,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.client.HttpClientErrorException; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; @@ -44,6 +54,7 @@ public class SDNCRequestTasks { private static final String MESSAGE = "_MESSAGE"; private static final String CORRELATOR = "_CORRELATOR"; protected static final String IS_CALLBACK_COMPLETED = "isCallbackCompleted"; + protected static final String SDNC_SUCCESS = "200"; @Autowired private ExceptionBuilder exceptionBuilder; @@ -82,9 +93,24 @@ public class SDNCRequestTasks { try { SDNCRequest request = (SDNCRequest)execution.getVariable(SDNC_REQUEST); String asyncRequest = (String) execution.getVariable(request.getCorrelationName()+MESSAGE); - String finalMessageIndicator = JsonPath.read(asyncRequest, "$.input.ack-final-indicator"); + + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance (); + DocumentBuilder db = dbf.newDocumentBuilder(); + Document doc = db.parse(new InputSource(new StringReader(asyncRequest))); + + String finalMessageIndicator = getXmlElement(doc, "/input/ack-final-indicator"); boolean isCallbackCompleted = convertIndicatorToBoolean(finalMessageIndicator); execution.setVariable(IS_CALLBACK_COMPLETED, isCallbackCompleted); + if(isCallbackCompleted) { + String responseCode = getXmlElement(doc, "/input/response-code"); + String responseMessage = getXmlElement(doc, "/input/response-message"); + if(!SDNC_SUCCESS.equalsIgnoreCase(responseCode)) { + throw new SDNCErrorResponseException(responseMessage); + } + } + } catch (SDNCErrorResponseException e) { + logger.error("SDNC error response - " + e.getMessage()); + exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, e.getMessage()); } catch (Exception e) { logger.error("Error procesing SDNC callback", e); exceptionBuilder.buildAndThrowWorkflowException(execution, 7000, "Error procesing SDNC callback"); @@ -99,4 +125,9 @@ public class SDNCRequestTasks { return "Y".equals(finalMessageIndicator); } + protected String getXmlElement(Document doc, String exp) throws Exception { + XPath xPath = XPathFactory.newInstance().newXPath(); + return xPath.evaluate(exp, doc); + } + } 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 867be2ec95..7562bd964e 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 @@ -372,6 +372,31 @@ public class WorkflowAction { return vnfcs; } + protected <T> List<T> getRelatedResourcesInVnfc(Vnfc vnfc, Class<T> resultClass, AAIObjectType type) { + + List<T> configurations = new ArrayList<>(); + AAIResourceUri uri = AAIUriFactory.createResourceUri(AAIObjectType.VNFC, vnfc.getVnfcName()); + AAIResultWrapper vnfcResultsWrapper = bbInputSetupUtils.getAAIResourceDepthOne(uri); + Optional<Relationships> relationshipsOp = vnfcResultsWrapper.getRelationships(); + if (!relationshipsOp.isPresent()) { + logger.debug("No relationships were found for VNFC in AAI"); + } else { + Relationships relationships = relationshipsOp.get(); + List<AAIResultWrapper> configurationResultWrappers = this.getResultWrappersFromRelationships(relationships, type); + for(AAIResultWrapper configurationResultWrapper : configurationResultWrappers) { + Optional<T> configurationOp = configurationResultWrapper.asBean(resultClass); + if(configurationOp.isPresent()) { + configurations.add(configurationOp.get()); + } + } + } + return configurations; + } + + protected List<AAIResultWrapper> getResultWrappersFromRelationships(Relationships relationships, AAIObjectType type){ + return relationships.getByType(type); + } + protected boolean isConfiguration(List<OrchestrationFlow> orchFlows) { for(OrchestrationFlow flow : orchFlows) { if(flow.getFlowName().contains("Configuration")) { @@ -384,6 +409,7 @@ public class WorkflowAction { protected List<ExecuteBuildingBlock> getConfigBuildingBlocks(ServiceInstancesRequest sIRequest, List<OrchestrationFlow> orchFlows, String requestId, Resource resourceKey, String apiVersion, String resourceId, String requestAction, boolean aLaCarte, String vnfType, WorkflowResourceIds workflowResourceIds, RequestDetails requestDetails, DelegateExecution execution) { + List<ExecuteBuildingBlock> flowsToExecuteConfigs = new ArrayList<>(); List<OrchestrationFlow> result = new ArrayList<>(orchFlows); result = orchFlows.stream().filter(item -> item.getFlowName().contains(FABRIC_CONFIGURATION)).collect(Collectors.toList()); @@ -392,22 +418,29 @@ public class WorkflowAction { String vnfCustomizationUUID = bbInputSetupUtils.getAAIGenericVnf(vnfId).getModelCustomizationId(); String vfModuleCustomizationUUID = bbInputSetupUtils.getAAIVfModule(vnfId, vfModuleId).getModelCustomizationId(); - List<org.onap.aai.domain.yang.Configuration> configurations = getRelatedResourcesInVfModule(vnfId, vfModuleId, org.onap.aai.domain.yang.Configuration.class, AAIObjectType.CONFIGURATION); - - for(org.onap.aai.domain.yang.Configuration configuration : configurations) { - workflowResourceIds.setConfigurationId(configuration.getConfigurationId()); - for(OrchestrationFlow orchFlow : result) { - resourceKey.setVfModuleCustomizationId(vfModuleCustomizationUUID); - resourceKey.setCvnfModuleCustomizationId(configuration.getModelCustomizationId()); - resourceKey.setVnfCustomizationId(vnfCustomizationUUID); - ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, requestId, resourceKey, apiVersion, resourceId, - requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false, null, true); - String vnfcName = getVnfcNameForConfiguration(configuration); - if(vnfcName == null || vnfcName.isEmpty()) { - buildAndThrowException(execution, "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")); + + 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, 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(execution, multipleRelationshipsError, new Exception(multipleRelationshipsError)); + } + for(org.onap.aai.domain.yang.Configuration configuration : configurations) { + workflowResourceIds.setConfigurationId(configuration.getConfigurationId()); + for(OrchestrationFlow orchFlow : result) { + resourceKey.setVfModuleCustomizationId(vfModuleCustomizationUUID); + resourceKey.setCvnfModuleCustomizationId(vnfc.getModelCustomizationId()); + resourceKey.setVnfCustomizationId(vnfCustomizationUUID); + ExecuteBuildingBlock ebb = buildExecuteBuildingBlock(orchFlow, requestId, resourceKey, apiVersion, resourceId, + requestAction, aLaCarte, vnfType, workflowResourceIds, requestDetails, false, null, true); + String vnfcName = getVnfcNameForConfiguration(configuration); + if(vnfcName == null || vnfcName.isEmpty()) { + buildAndThrowException(execution, "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")); + } + ebb.getConfigurationResourceKeys().setVnfcName(vnfcName); + flowsToExecuteConfigs.add(ebb); } - ebb.getConfigurationResourceKeys().setVnfcName(vnfcName); - flowsToExecuteConfigs.add(ebb); } } return flowsToExecuteConfigs; |