From 2eb23f4ac862f700f0abf6f2dc5b9fa662ec9c60 Mon Sep 17 00:00:00 2001 From: "Kuleshov, Elena" Date: Fri, 24 Jan 2020 16:33:39 -0500 Subject: add manual handling to rainy day handling for bbs Initial Manual Handling addition to Rainy Day BB handling. Reenable task API, add task variable setup. TaskTimeout will come from the configuration settings. Update the base path for the APIH manual tasks junit. Additional JUNIT tests for manual handling Add Manual as a primary policy for Change Management BBs. Error handling changes and robot tests for manual handling. Correct failure data retrieval when serviceSubscription is unavailable. Correct failure data retrieval when serviceSubscription is unavailable. Keep WorkflowException when manual pause gets invoked; improved error reporting. Issue-ID: SO-2616 Signed-off-by: Benjamin, Max (mb388a) Change-Id: I98a84c1a489bb7b24b68e567f604aeb074fd7bf9 --- .../so/bpmn/common/scripts/ManualHandling.groovy | 56 ------ .../tasks/ExecuteBuildingBlockRainyDay.java | 38 +++- .../subprocess/BuildingBlock/ManualHandling.bpmn | 56 ++---- .../src/test/resources/application-test.yaml | 12 +- .../bpmn/core/plugins/WorkflowExceptionPlugin.java | 4 +- .../BuildingBlock/ExecuteBuildingBlock.bpmn | 186 +++++++++++++----- .../BuildingBlock/PauseForManualTaskRainyDay.bpmn | 164 ++++++++++++++++ .../subprocess/PauseForManualTaskRainyDayTest.java | 97 ++++++++++ .../VnfInPlaceUpdate_VID_request.json | 2 +- .../appc/tasks/AppcOrchestratorPreProcessor.java | 62 +++++- .../tasks/ExternalTicketCreation.java | 27 +++ .../manualhandling/tasks/ExternalTicketTasks.java | 106 +++++++++++ .../manualhandling/tasks/ManualHandlingTasks.java | 207 +++++++++++++-------- .../tasks/ExternalTicketTasksTest.java | 75 ++++++++ .../tasks/ManualHandlingTasksTest.java | 33 +++- 15 files changed, 876 insertions(+), 249 deletions(-) create mode 100644 bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/PauseForManualTaskRainyDay.bpmn create mode 100644 bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskRainyDayTest.java create mode 100644 bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketCreation.java create mode 100644 bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasks.java create mode 100644 bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasksTest.java (limited to 'bpmn') diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ManualHandling.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ManualHandling.groovy index ef4291d18f..615964b2a9 100644 --- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ManualHandling.groovy +++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ManualHandling.groovy @@ -45,7 +45,6 @@ import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor import org.onap.so.bpmn.common.scripts.ExceptionUtil import org.onap.so.bpmn.core.domain.ServiceDecomposition import org.onap.so.bpmn.core.json.JsonUtils -import org.onap.so.client.ruby.* import org.onap.so.logger.MessageEnum import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -299,59 +298,4 @@ public class ManualHandling extends AbstractServiceTaskProcessor { logger.trace("Exit prepareRequestsDBStatusUpdate of ManualHandling ") } - public void createAOTSTicket (DelegateExecution execution) { - String msg = "" - logger.trace("createAOTSTicket of ManualHandling ") - def isDebugLogEnabled = execution.getVariable('isDebugLogEnabled') - // This method will not be throwing an exception, but rather log the error - - try { - execution.setVariable("prefix", Prefix) - setBasicDBAuthHeader(execution,isDebugLogEnabled) - // check for required input - String requestId = execution.getVariable("msoRequestId") - logger.debug("requestId is: " + requestId) - def currentActivity = execution.getVariable("currentActivity") - logger.debug("currentActivity is: " + currentActivity) - def workStep = execution.getVariable("workStep") - logger.debug("workStep is: " + workStep) - def failedActivity = execution.getVariable("failedActivity") - logger.debug("failedActivity is: " + failedActivity) - def errorCode = execution.getVariable("errorCode") - logger.debug("errorCode is: " + errorCode) - def errorText = execution.getVariable("errorText") - logger.debug("errorText is: " + errorText) - def vnfName = execution.getVariable("vnfName") - logger.debug("vnfName is: " + vnfName) - - String rubyRequestId = UUID.randomUUID() - logger.debug("rubyRequestId: " + rubyRequestId) - String sourceName = vnfName - logger.debug("sourceName: " + sourceName) - String reason = "VID Workflow failed at " + failedActivity + " " + workStep + " call with error " + errorCode - logger.debug("reason: " + reason) - String workflowId = requestId - logger.debug("workflowId: " + workflowId) - String notification = "Request originated from VID | Workflow fallout on " + vnfName + " | Workflow step failure: " + workStep + " failed | VID workflow ID: " + workflowId - logger.debug("notification: " + notification) - - logger.debug("Creating AOTS Ticket request") - - RubyClient rubyClient = new RubyClient() - rubyClient.rubyCreateTicketCheckRequest(rubyRequestId, sourceName, reason, workflowId, notification) - - } catch (BpmnError e) { - msg = "BPMN error in createAOTSTicket " + ex.getMessage() - logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN", - ErrorCode.UnknownError.getValue()); - } catch (Exception ex){ - msg = "Exception in createAOTSTicket " + ex.getMessage() - logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG.toString(), msg, "BPMN", - ErrorCode.UnknownError.getValue()); - } - logger.trace("Exit createAOTSTicket of ManualHandling ") - } - - - } diff --git a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java index ae7addcc57..99767b0405 100644 --- a/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java +++ b/bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java @@ -49,6 +49,9 @@ public class ExecuteBuildingBlockRainyDay { private static final Logger logger = LoggerFactory.getLogger(ExecuteBuildingBlockRainyDay.class); public static final String HANDLING_CODE = "handlingCode"; public static final String ROLLBACK_TARGET_STATE = "rollbackTargetState"; + public static final String RAINY_DAY_SERVICE_TYPE = "rainyDayServiceType"; + public static final String RAINY_DAY_VNF_TYPE = "rainyDayVnfType"; + public static final String RAINY_DAY_VNF_NAME = "rainyDayVnfName"; @Autowired private CatalogDbClient catalogDbClient; @@ -97,8 +100,10 @@ public class ExecuteBuildingBlockRainyDay { handlingCode = "Abort"; } else { try { - serviceType = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0) - .getModelInfoServiceInstance().getServiceType(); + if (gBBInput.getCustomer().getServiceSubscription() != null) { + serviceType = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0) + .getModelInfoServiceInstance().getServiceType(); + } if (serviceType == null || serviceType.isEmpty()) { serviceType = ASTERISK; } @@ -106,19 +111,32 @@ public class ExecuteBuildingBlockRainyDay { // keep default serviceType value logger.error("Exception in serviceType retrieval", ex); } + execution.setVariable(RAINY_DAY_SERVICE_TYPE, serviceType); String vnfType = ASTERISK; + String vnfName = ASTERISK; try { - for (GenericVnf vnf : gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0) - .getVnfs()) { - if (vnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { - vnfType = vnf.getVnfType(); + if (gBBInput.getCustomer().getServiceSubscription() != null) { + for (GenericVnf vnf : gBBInput.getCustomer().getServiceSubscription().getServiceInstances() + .get(0).getVnfs()) { + if (vnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { + vnfType = vnf.getVnfType(); + vnfName = vnf.getVnfName(); + } + } + } else { + for (GenericVnf vnf : gBBInput.getServiceInstance().getVnfs()) { + if (vnf.getVnfId().equalsIgnoreCase(lookupKeyMap.get(ResourceKey.GENERIC_VNF_ID))) { + vnfType = vnf.getVnfType(); + vnfName = vnf.getVnfName(); + } } } } catch (Exception ex) { // keep default vnfType value logger.error("Exception in vnfType retrieval", ex); } - + execution.setVariable(RAINY_DAY_VNF_TYPE, vnfType); + execution.setVariable(RAINY_DAY_VNF_NAME, vnfName); String errorCode = ASTERISK; if (workflowException != null) { errorCode = "" + workflowException.getErrorCode(); @@ -151,8 +169,10 @@ public class ExecuteBuildingBlockRainyDay { String serviceRole = ASTERISK; try { - serviceRole = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0) - .getModelInfoServiceInstance().getServiceRole(); + if (gBBInput.getCustomer().getServiceSubscription() != null) { + serviceRole = gBBInput.getCustomer().getServiceSubscription().getServiceInstances().get(0) + .getModelInfoServiceInstance().getServiceRole(); + } if (serviceRole == null || serviceRole.isEmpty()) { serviceRole = ASTERISK; } diff --git a/bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/ManualHandling.bpmn b/bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/ManualHandling.bpmn index cec3e249ea..0115c078f3 100644 --- a/bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/ManualHandling.bpmn +++ b/bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/ManualHandling.bpmn @@ -43,11 +43,11 @@ def mh = new ManualHandling() mh.setTaskVariables(task)]]> - SequenceFlow_0igra4l + SequenceFlow_0b84ki5 SequenceFlow_192yimz - + @@ -116,14 +116,6 @@ def mh = new ManualHandling() mh.preProcessRequest(execution)]]> - - - SequenceFlow_0b84ki5 - SequenceFlow_0igra4l - - @@ -136,9 +128,9 @@ mh.createAOTSTicket(execution)]]> - + - + @@ -181,14 +173,14 @@ mh.createAOTSTicket(execution)]]> - - + + - + - + @@ -199,23 +191,25 @@ mh.createAOTSTicket(execution)]]> - + + + - + - - + + - + - - + + - + @@ -225,10 +219,10 @@ mh.createAOTSTicket(execution)]]> - + - + @@ -240,16 +234,6 @@ mh.createAOTSTicket(execution)]]> - - - - - - - - - - diff --git a/bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml b/bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml index afdb800ffe..ba2d19b626 100644 --- a/bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml +++ b/bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml @@ -111,6 +111,9 @@ mso: rainyDay: retryDurationMultiplier: '2' defaultCode: Abort + manualTask: + taskTimeout: PT1M + validResponses: retry,abort,rollback,skip site-name: localDevEnv workflow: default: @@ -189,15 +192,6 @@ sniro: headers.patchVersion: 1 headers.minorVersion: 1 headers.latestVersion: 2 -ruby: - create-ticket-request: - dmaap: - username: m04768@mso.ecomp.att.com - password: alRyMzJ3NUNeakxl - publisher: - topic: com.att.pdas.exp.msoCMFallout-v1 - host: https://olsd004.wnsnet.attws.com:3905 - auth: 81B7E3533B91A6706830611FB9A8ECE529BBCCE754B1F1520FA7C8698B42F97235BEFA993A387E664D6352C63A6185D68DA7F0B1D360637CBA102CB166E3E62C11EB1F75386D3506BCECE51E54 spring: datasource: jdbc-url: jdbc:mariadb://localhost:3307/camundabpmn diff --git a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/WorkflowExceptionPlugin.java b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/WorkflowExceptionPlugin.java index 42c6ef059f..869c917cc2 100644 --- a/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/WorkflowExceptionPlugin.java +++ b/bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/WorkflowExceptionPlugin.java @@ -58,6 +58,7 @@ public class WorkflowExceptionPlugin extends AbstractProcessEnginePlugin { private static final Logger logger = LoggerFactory.getLogger(WorkflowExceptionPlugin.class); private static final String WORKFLOW_EXCEPTION = "WorkflowException"; + private static final String PAUSE_FOR_MANUAL_TASK_RAINY_DAY_ID = "PauseForManualTaskRainyDay"; @Override public void preInit(ProcessEngineConfigurationImpl processEngineConfiguration) { @@ -89,7 +90,8 @@ public class WorkflowExceptionPlugin extends AbstractProcessEnginePlugin { for (ActivityImpl activity : activities) { String type = (String) activity.getProperty("type"); - if ("callActivity".equals(type)) { + if ("callActivity".equals(type) + && !PAUSE_FOR_MANUAL_TASK_RAINY_DAY_ID.equals(activity.getActivityId())) { // Add a WorkflowExceptionResetListener to clear the WorkflowException // variable when each Call Activity starts. diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn index e64c44eb94..443a571312 100644 --- a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn @@ -1,5 +1,5 @@ - + SequenceFlow_0rq4c5r @@ -44,8 +44,12 @@ SequenceFlow_0a62t4c + SequenceFlow_05le7o3 SequenceFlow_0fwsjva SequenceFlow_0h8v45y + SequenceFlow_1xh5ngw + SequenceFlow_0xyd2zl + SequenceFlow_1g7oq3t SequenceFlow_0ndt8ft @@ -87,6 +91,7 @@ SequenceFlow_0541bid + SequenceFlow_1g7oq3t SequenceFlow_12ps9at @@ -99,6 +104,36 @@ SequenceFlow_09synl9 SequenceFlow_0vdeqxv + + + + + + + + + SequenceFlow_0xyd2zl + SequenceFlow_1ynai9j + + + + + + + + + + + SequenceFlow_1xh5ngw + SequenceFlow_05le7o3 + + + SequenceFlow_1ynai9j + + + + + @@ -169,63 +204,63 @@ - + - + - + - + - + - + - - + + - + - - + + - + - - + + - + - + - - + + - + - - + + - + - + @@ -251,25 +286,25 @@ - - + + - + - + - + - + - + - + @@ -312,51 +347,102 @@ - - + + - + - - + + - + - + - + - + - - + + - + - + - + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/PauseForManualTaskRainyDay.bpmn b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/PauseForManualTaskRainyDay.bpmn new file mode 100644 index 0000000000..29657e17af --- /dev/null +++ b/bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/PauseForManualTaskRainyDay.bpmn @@ -0,0 +1,164 @@ + + + + + SequenceFlow_0jav6cu + + + SequenceFlow_14cyk9v + + + + + + + + + + + + SequenceFlow_0igra4l + SequenceFlow_192yimz + + + + + SequenceFlow_1idwudp + SequenceFlow_0b84ki5 + + + SequenceFlow_192yimz + SequenceFlow_14cyk9v + + + + SequenceFlow_01k6zgt + + + + + + SequenceFlow_0b84ki5 + SequenceFlow_0igra4l + + + + SequenceFlow_01k6zgt + SequenceFlow_16bjdgj + + + + SequenceFlow_16bjdgj + + + + SequenceFlow_0jav6cu + SequenceFlow_1idwudp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskRainyDayTest.java b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskRainyDayTest.java new file mode 100644 index 0000000000..576f9c4f01 --- /dev/null +++ b/bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskRainyDayTest.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.bpmn.subprocess; + +import static org.camunda.bpm.engine.test.assertions.ProcessEngineTests.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doThrow; +import org.camunda.bpm.engine.ManagementService; +import org.camunda.bpm.engine.TaskService; +import org.camunda.bpm.engine.delegate.BpmnError; +import org.camunda.bpm.engine.runtime.Job; +import org.camunda.bpm.engine.runtime.ProcessInstance; +import org.camunda.bpm.engine.delegate.DelegateExecution; +import org.camunda.bpm.engine.task.Task; +import org.camunda.bpm.engine.test.assertions.bpmn.BpmnAwareAssertions; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.onap.so.bpmn.BaseBPMNTest; +import org.onap.so.bpmn.common.BuildingBlockExecution; + + +public class PauseForManualTaskRainyDayTest extends BaseBPMNTest { + private static final String TIMEOUT_10_S = "PT10S"; + + @Autowired + protected ManagementService managementService; + + @Autowired + protected TaskService taskService; + + @Test + public void sunnyDayPauseForManualTaskRainyDayTimeout_Test() throws InterruptedException { + variables.put("taskTimeout", TIMEOUT_10_S); + ProcessInstance pi = runtimeService.startProcessInstanceByKey("PauseForManualTaskRainyDay", variables); + assertThat(pi).isNotNull(); + BpmnAwareAssertions.assertThat(pi).isWaitingAt("ManualUserTask"); + Task task = taskService.createTaskQuery().active().list().get(0); + assertThat(pi).task().isNotNull(); + assertNotNull(task); + + Job job = managementService.createJobQuery().activityId("ManualTaskTimer").singleResult(); + assertNotNull(job); + managementService.executeJob(job.getId()); + + assertThat(pi).isStarted().hasPassedInOrder("PauseForManualTaskRainyDay_Start", "InitRainyDayManualHandling", + "UpdateDbStatusToPendingManualTask", "CreateExternalTicket", "ManualTaskTimer", + "UpdateDBStatusToTimeout", "PauseForManualTaskRainyDay_Timeout"); + } + + @Test + public void sunnyDayPauseForManualTaskCompleted_Test() throws InterruptedException { + variables.put("taskTimeout", TIMEOUT_10_S); + ProcessInstance pi = runtimeService.startProcessInstanceByKey("PauseForManualTaskRainyDay", variables); + assertThat(pi).isNotNull(); + BpmnAwareAssertions.assertThat(pi).isWaitingAt("ManualUserTask"); + assertThat(pi).task().isNotNull(); + Task task = taskService.createTaskQuery().active().list().get(0); + assertNotNull(task); + taskService.complete(task.getId()); + + assertThat(pi).isStarted().hasPassedInOrder("PauseForManualTaskRainyDay_Start", "InitRainyDayManualHandling", + "UpdateDbStatusToPendingManualTask", "CreateExternalTicket", "ManualUserTask", + "UpdateDbStatusToInProgress", "PauseForManualTaskRainyDay_End"); + assertThat(pi).isEnded(); + } + + @Test + public void rainyDayPauseForManualTask_Test() throws Exception { + doThrow(new BpmnError("7000", "TESTING ERRORS")).when(manualHandlingTasks) + .createExternalTicket((any(BuildingBlockExecution.class))); + ProcessInstance pi = runtimeService.startProcessInstanceByKey("PauseForManualTaskRainyDay", variables); + assertThat(pi).isNotNull().isStarted() + .hasPassedInOrder("PauseForManualTaskRainyDay_Start", "InitRainyDayManualHandling", + "UpdateDbStatusToPendingManualTask", "CreateExternalTicket") + .hasNotPassed("ManualUserTask", "UpdateDbStatusToInProgress", "PauseForManualTaskRainyDay_End"); + } + +} diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/__files/InfrastructureFlows/VnfInPlaceUpdate_VID_request.json b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/__files/InfrastructureFlows/VnfInPlaceUpdate_VID_request.json index eb2d9faa2a..0a211e6b08 100644 --- a/bpmn/so-bpmn-infrastructure-flows/src/test/resources/__files/InfrastructureFlows/VnfInPlaceUpdate_VID_request.json +++ b/bpmn/so-bpmn-infrastructure-flows/src/test/resources/__files/InfrastructureFlows/VnfInPlaceUpdate_VID_request.json @@ -10,7 +10,7 @@ }, "requestParameters": { "payload": -"{\"existing-software-version\": \"3.1\",\"new-software-version\": \"3.2\", \"operations-timeout\": \"3600\"}" +"{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}" } } } \ No newline at end of file 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 4b967c7bc4..9697246b03 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 @@ -24,6 +24,7 @@ import org.onap.so.client.exception.ExceptionBuilder; import org.onap.so.client.orchestration.AAIVnfResources; import org.onap.so.db.catalog.beans.ControllerSelectionReference; import org.onap.so.db.catalog.client.CatalogDbClient; +import org.onap.so.exceptions.ValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +78,11 @@ public class AppcOrchestratorPreProcessor { if (payload == null) { payload = ""; } - String existingSoftwareVersion = JsonUtils.getJsonValue(payload, "existing-software-version"); + String existingSoftwareVersion = JsonUtils.getJsonValue(payload, "existing_software_version"); appcTaskRequest.setExistingSoftwareVersion(existingSoftwareVersion); - String newSoftwareVersion = JsonUtils.getJsonValue(payload, "new-software-version"); + String newSoftwareVersion = JsonUtils.getJsonValue(payload, "new_software_version"); appcTaskRequest.setNewSoftwareVersion(newSoftwareVersion); - String operationsTimeout = JsonUtils.getJsonValue(payload, "operations-timeout"); + String operationsTimeout = JsonUtils.getJsonValue(payload, "operations_timeout"); appcTaskRequest.setOperationsTimeout(operationsTimeout); } @@ -123,9 +124,12 @@ public class AppcOrchestratorPreProcessor { applicationControllerVnf.setVnfName(vnfName); appcTaskRequest.setApplicationControllerVnf(applicationControllerVnf); + verifyApplicationControllerTaskRequest(execution, appcTaskRequest); + execution.setVariable("appcOrchestratorRequest", appcTaskRequest); + logger.debug("SET APPC ORCHESTRATOR REQUEST"); } catch (Exception e) { - logger.error("Error building ApplicationControllerTaskRequest Object", e); + logger.error("Error building ApplicationControllerTaskRequest Object", e.getMessage()); exceptionUtil.buildAndThrowWorkflowException(execution, 7000, e); } } @@ -186,4 +190,54 @@ public class AppcOrchestratorPreProcessor { } } } + + protected void verifyApplicationControllerTaskRequest(BuildingBlockExecution execution, + ApplicationControllerTaskRequest appcTaskRequest) throws ValidationException { + String errorMessage = null; + switch (appcTaskRequest.getAction()) { + case QuiesceTraffic: + if (appcTaskRequest.getOperationsTimeout() == null + || appcTaskRequest.getOperationsTimeout().isEmpty()) { + errorMessage = "APPC action QuiesceTraffic is missing operations_timeout parameter. "; + } + break; + case UpgradePreCheck: + case UpgradePostCheck: + case UpgradeBackup: + case UpgradeSoftware: + if (appcTaskRequest.getExistingSoftwareVersion() == null + || appcTaskRequest.getExistingSoftwareVersion().isEmpty()) { + errorMessage = + "APPC action " + appcTaskRequest.getAction() + " is missing existing_software parameter. "; + } + if (appcTaskRequest.getNewSoftwareVersion() == null + || appcTaskRequest.getNewSoftwareVersion().isEmpty()) { + errorMessage = + "APPC action " + appcTaskRequest.getAction() + " is missing new_software parameter. "; + } + break; + case Snapshot: + if (appcTaskRequest.getApplicationControllerVnf().getApplicationControllerVm() != null) { + if (appcTaskRequest.getApplicationControllerVnf().getApplicationControllerVm().getVmId() == null + || appcTaskRequest.getApplicationControllerVnf().getApplicationControllerVm().getVmId() + .isEmpty()) { + errorMessage = "APPC action Snapshot is missing vmId parameter. "; + } + if (appcTaskRequest.getApplicationControllerVnf().getApplicationControllerVm() + .getVserverId() == null + || appcTaskRequest.getApplicationControllerVnf().getApplicationControllerVm().getVserverId() + .isEmpty()) { + errorMessage = "APPC action Snapshot is missing vserverId parameter. "; + } + break; + } + default: + break; + } + if (errorMessage != null) { + logger.debug("verifyApplicationControllerTaskRequest() failed with " + errorMessage); + throw new ValidationException(errorMessage, false); + } + return; + } } diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketCreation.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketCreation.java new file mode 100644 index 0000000000..70d56db26b --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketCreation.java @@ -0,0 +1,27 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.manualhandling.tasks; + +import org.onap.so.bpmn.common.BuildingBlockExecution; + +public interface ExternalTicketCreation { + public void createExternalTicket(BuildingBlockExecution execution); +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasks.java new file mode 100644 index 0000000000..6bfe618460 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasks.java @@ -0,0 +1,106 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.manualhandling.tasks; + +import org.onap.so.logger.LoggingAnchor; +import org.camunda.bpm.engine.delegate.BpmnError; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.client.ticket.ExternalTicket; +import org.onap.so.logger.ErrorCode; +import org.onap.so.logger.MessageEnum; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class ExternalTicketTasks implements ExternalTicketCreation { + private static final Logger logger = LoggerFactory.getLogger(ExternalTicketTasks.class); + + protected static final String VNF_TYPE = "vnfType"; + protected static final String DESCRIPTION = "description"; + protected static final String SERVICE_TYPE = "serviceType"; + protected static final String MSO_REQUEST_ID = "mso-request-id"; + protected static final String REQUESTOR_ID = "requestorId"; + protected static final String ERROR_CODE = "errorCode"; + protected static final String VALID_RESPONSES = "validResponses"; + protected static final String TASK_TIMEOUT = "taskTimeout"; + protected static final String RESPONSE_VALUE_TASK = "responseValueTask"; + protected static final String RESPONSE_VALUE = "responseValue"; + protected static final String WORKSTEP = "workStep"; + + protected static final String TASK_VARIABLE_TYPE = "type"; + protected static final String TASK_VARIABLE_NFROLE = "nfRole"; + protected static final String TASK_VARIABLE_SUBSCRIPTION_SERVICE_TYPE = "subscriptionServiceType"; + protected static final String TASK_VARIABLE_ORIGINAL_REQUEST_ID = "originalRequestId"; + protected static final String TASK_VARIABLE_ORIGINAL_REQUESTOR_ID = "originalRequestorId"; + protected static final String TASK_VARIABLE_ERROR_SOURCE = "errorSource"; + protected static final String TASK_VARIABLE_ERROR_CODE = "errorCode"; + protected static final String TASK_VARIABLE_ERROR_MESSAGE = "errorMessage"; + protected static final String TASK_VARIABLE_BUILDING_BLOCK_NAME = "buildingBlockName"; + protected static final String TASK_VARIABLE_BUILDING_BLOCK_STEP = "buildingBlockStep"; + protected static final String TASK_VARIABLE_DESCRIPTION = "description"; + protected static final String TASK_VARIABLE_TIMEOUT = "timeout"; + protected static final String TASK_VARIABLE_VALID_RESPONSES = "validResponses"; + + protected static final String BPMN_EXCEPTION = "BPMN exception: "; + protected static final String RAINY_DAY_SERVICE_TYPE = "rainyDayServiceType"; + protected static final String RAINY_DAY_VNF_TYPE = "rainyDayVnfType"; + protected static final String RAINY_DAY_VNF_NAME = "rainyDayVnfName"; + protected static final String G_BUILDING_BLOCK_EXECUTION = "gBuildingBlockExecution"; + protected static final String WORKFLOW_EXCEPTION = "WorkflowException"; + + public void createExternalTicket(BuildingBlockExecution execution) { + + logger.debug("Creating ExternalTicket()"); + try { + ExternalTicket ticket = getExternalTicket(); + + ticket.setRequestId((String) execution.getVariable(MSO_REQUEST_ID)); + ticket.setCurrentActivity((String) execution.getVariable("currentActivity")); + ticket.setNfRole((String) execution.getVariable(VNF_TYPE)); + ticket.setDescription((String) execution.getVariable(DESCRIPTION)); + ticket.setSubscriptionServiceType((String) execution.getVariable(SERVICE_TYPE)); + ticket.setRequestorId((String) execution.getVariable(REQUESTOR_ID)); + ticket.setTimeout((String) execution.getVariable(TASK_TIMEOUT)); + ticket.setErrorSource((String) execution.getVariable("failedActivity")); + ticket.setErrorCode((String) execution.getVariable(ERROR_CODE)); + ticket.setErrorMessage((String) execution.getVariable("errorText")); + ticket.setWorkStep((String) execution.getVariable(WORKSTEP)); + + ticket.createTicket(); + } catch (BpmnError e) { + String msg = "BPMN error in createExternalTicket " + e.getMessage(); + logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", + ErrorCode.UnknownError.getValue()); + } catch (Exception ex) { + String msg = "Exception in createExternalTicket " + ex.getMessage(); + logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", + ErrorCode.UnknownError.getValue()); + } + + } + + protected ExternalTicket getExternalTicket() { + return new ExternalTicket(); + } + + +} diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java index 7e45c3b640..d9f5e65ba3 100644 --- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java +++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java @@ -21,22 +21,23 @@ package org.onap.so.bpmn.infrastructure.manualhandling.tasks; import java.util.Map; +import java.time.Duration; +import java.util.Date; import java.util.HashMap; -import org.onap.so.logger.LoggingAnchor; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.BpmnError; import org.camunda.bpm.engine.delegate.DelegateTask; import org.camunda.bpm.engine.delegate.DelegateExecution; import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.core.WorkflowException; import org.onap.so.client.exception.ExceptionBuilder; -import org.onap.so.client.ticket.ExternalTicket; +import org.onap.so.constants.Status; import org.onap.so.db.request.beans.InfraActiveRequests; import org.onap.so.db.request.client.RequestsDbClient; -import org.onap.so.logger.ErrorCode; -import org.onap.so.logger.MessageEnum; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component @@ -46,13 +47,38 @@ public class ManualHandlingTasks { private static final String TASK_TYPE_PAUSE = "pause"; private static final String TASK_TYPE_FALLOUT = "fallout"; public static final String VNF_TYPE = "vnfType"; + public static final String DESCRIPTION = "description"; public static final String SERVICE_TYPE = "serviceType"; public static final String MSO_REQUEST_ID = "mso-request-id"; public static final String REQUESTOR_ID = "requestorId"; public static final String ERROR_CODE = "errorCode"; public static final String VALID_RESPONSES = "validResponses"; - public static final String DESCRIPTION = "description"; + public static final String TASK_TIMEOUT = "taskTimeout"; + public static final String RESPONSE_VALUE_TASK = "responseValueTask"; + public static final String RESPONSE_VALUE = "responseValue"; + private static final String ASTERISK = "*"; + private static final String WORKSTEP = "workStep"; + + public static final String TASK_VARIABLE_TYPE = "type"; + public static final String TASK_VARIABLE_NFROLE = "nfRole"; + public static final String TASK_VARIABLE_SUBSCRIPTION_SERVICE_TYPE = "subscriptionServiceType"; + public static final String TASK_VARIABLE_ORIGINAL_REQUEST_ID = "originalRequestId"; + public static final String TASK_VARIABLE_ORIGINAL_REQUESTOR_ID = "originalRequestorId"; + public static final String TASK_VARIABLE_ERROR_SOURCE = "errorSource"; + public static final String TASK_VARIABLE_ERROR_CODE = "errorCode"; + public static final String TASK_VARIABLE_ERROR_MESSAGE = "errorMessage"; + public static final String TASK_VARIABLE_BUILDING_BLOCK_NAME = "buildingBlockName"; + public static final String TASK_VARIABLE_BUILDING_BLOCK_STEP = "buildingBlockStep"; + public static final String TASK_VARIABLE_DESCRIPTION = "description"; + public static final String TASK_VARIABLE_TIMEOUT = "timeout"; + public static final String TASK_VARIABLE_VALID_RESPONSES = "validResponses"; + public static final String BPMN_EXCEPTION = "BPMN exception: "; + public static final String RAINY_DAY_SERVICE_TYPE = "rainyDayServiceType"; + public static final String RAINY_DAY_VNF_TYPE = "rainyDayVnfType"; + public static final String RAINY_DAY_VNF_NAME = "rainyDayVnfName"; + public static final String G_BUILDING_BLOCK_EXECUTION = "gBuildingBlockExecution"; + public static final String WORKFLOW_EXCEPTION = "WorkflowException"; @Autowired private ExceptionBuilder exceptionUtil; @@ -60,40 +86,91 @@ public class ManualHandlingTasks { @Autowired private RequestsDbClient requestDbclient; + @Autowired + private Environment environment; + + @Autowired + private ExternalTicketCreation externalTicketCreation; + + protected String manualTaskTimeoutPath = "mso.rainyDay.manualTask.taskTimeout"; + protected String validResponsesPath = "mso.rainyDay.manualTask.validResponses"; + + + public void initRainyDayManualHandling(BuildingBlockExecution execution) { + try { + String manualTaskTimeout = this.environment.getProperty(manualTaskTimeoutPath); + execution.setVariable(TASK_TIMEOUT, manualTaskTimeout); + } catch (Exception e) { + logger.error("Exception occurred", e); + throw new BpmnError("Unknown error reading configuration for manual task handling"); + } + } + public void setFalloutTaskVariables(DelegateTask task) { DelegateExecution execution = task.getExecution(); try { + logger.debug("Setting fallout task variables:"); String taskId = task.getId(); logger.debug("taskId is: " + taskId); String type = TASK_TYPE_FALLOUT; - String nfRole = (String) execution.getVariable(VNF_TYPE); - String subscriptionServiceType = (String) execution.getVariable(SERVICE_TYPE); + BuildingBlockExecution gBuildingBlockExecution = + (BuildingBlockExecution) execution.getVariable(G_BUILDING_BLOCK_EXECUTION); + WorkflowException workflowException = (WorkflowException) execution.getVariable(WORKFLOW_EXCEPTION); + String nfRole = (String) execution.getVariable(RAINY_DAY_VNF_TYPE); + logger.debug(TASK_VARIABLE_NFROLE + ": " + nfRole); + String subscriptionServiceType = (String) execution.getVariable(RAINY_DAY_SERVICE_TYPE); + logger.debug(TASK_VARIABLE_SUBSCRIPTION_SERVICE_TYPE + ": " + subscriptionServiceType); String originalRequestId = (String) execution.getVariable(MSO_REQUEST_ID); - String originalRequestorId = (String) execution.getVariable(REQUESTOR_ID); - String description = ""; - String timeout = ""; - String errorSource = (String) execution.getVariable("failedActivity"); - String errorCode = (String) execution.getVariable(ERROR_CODE); - String errorMessage = (String) execution.getVariable("errorText"); - String buildingBlockName = (String) execution.getVariable("currentActivity"); - String buildingBlockStep = (String) execution.getVariable("workStep"); - String validResponses = (String) execution.getVariable(VALID_RESPONSES); + logger.debug(TASK_VARIABLE_ORIGINAL_REQUEST_ID + ": " + originalRequestId); + String originalRequestorId = + gBuildingBlockExecution.getGeneralBuildingBlock().getRequestContext().getRequestorId(); + logger.debug(TASK_VARIABLE_ORIGINAL_REQUESTOR_ID + ": " + originalRequestorId); + String description = "Manual user task to handle a failure of a BB execution"; + logger.debug(TASK_VARIABLE_DESCRIPTION + ": " + description); + String taskTimeout = (String) gBuildingBlockExecution.getVariable(TASK_TIMEOUT); + String timeout = Date.from((new Date()).toInstant().plus(Duration.parse(taskTimeout))).toGMTString(); + logger.debug(TASK_VARIABLE_TIMEOUT + ": " + timeout); + String errorSource = ASTERISK; + if (workflowException != null && workflowException.getExtSystemErrorSource() != null) { + errorSource = workflowException.getExtSystemErrorSource().toString(); + } + logger.debug(TASK_VARIABLE_ERROR_SOURCE + ": " + errorSource); + String errorCode = ASTERISK; + if (workflowException != null) { + errorCode = workflowException.getErrorCode() + ""; + } + logger.debug(TASK_VARIABLE_ERROR_CODE + ": " + errorCode); + String errorMessage = ASTERISK; + if (workflowException != null) { + errorMessage = workflowException.getErrorMessage(); + } + logger.debug(TASK_VARIABLE_ERROR_MESSAGE + ": " + errorMessage); + String buildingBlockName = gBuildingBlockExecution.getFlowToBeCalled(); + logger.debug(TASK_VARIABLE_BUILDING_BLOCK_NAME + ": " + buildingBlockName); + String buildingBlockStep = ASTERISK; + if (workflowException != null) { + buildingBlockStep = workflowException.getWorkStep(); + } + execution.setVariable(WORKSTEP, buildingBlockStep); + logger.debug(TASK_VARIABLE_BUILDING_BLOCK_STEP + ": " + buildingBlockStep); + String validResponses = this.environment.getProperty(validResponsesPath); + logger.debug(TASK_VARIABLE_VALID_RESPONSES + ": " + validResponses); Map taskVariables = new HashMap<>(); - taskVariables.put("type", type); - taskVariables.put("nfRole", nfRole); - taskVariables.put("subscriptionServiceType", subscriptionServiceType); - taskVariables.put("originalRequestId", originalRequestId); - taskVariables.put("originalRequestorId", originalRequestorId); - taskVariables.put("errorSource", errorSource); - taskVariables.put(ERROR_CODE, errorCode); - taskVariables.put("errorMessage", errorMessage); - taskVariables.put("buildingBlockName", buildingBlockName); - taskVariables.put("buildingBlockStep", buildingBlockStep); - taskVariables.put(VALID_RESPONSES, validResponses); - taskVariables.put("tmeout", timeout); - taskVariables.put(DESCRIPTION, description); + taskVariables.put(TASK_VARIABLE_TYPE, type); + taskVariables.put(TASK_VARIABLE_NFROLE, nfRole); + taskVariables.put(TASK_VARIABLE_SUBSCRIPTION_SERVICE_TYPE, subscriptionServiceType); + taskVariables.put(TASK_VARIABLE_ORIGINAL_REQUEST_ID, originalRequestId); + taskVariables.put(TASK_VARIABLE_ORIGINAL_REQUESTOR_ID, originalRequestorId); + taskVariables.put(TASK_VARIABLE_ERROR_SOURCE, errorSource); + taskVariables.put(TASK_VARIABLE_ERROR_CODE, errorCode); + taskVariables.put(TASK_VARIABLE_ERROR_MESSAGE, errorMessage); + taskVariables.put(TASK_VARIABLE_BUILDING_BLOCK_NAME, buildingBlockName); + taskVariables.put(TASK_VARIABLE_BUILDING_BLOCK_STEP, buildingBlockStep); + taskVariables.put(TASK_VARIABLE_VALID_RESPONSES, validResponses); + taskVariables.put(TASK_VARIABLE_TIMEOUT, timeout); + taskVariables.put(TASK_VARIABLE_DESCRIPTION, description); TaskService taskService = execution.getProcessEngineServices().getTaskService(); taskService.setVariables(taskId, taskVariables); @@ -116,33 +193,34 @@ public class ManualHandlingTasks { String taskId = task.getId(); logger.debug("taskId is: " + taskId); String type = TASK_TYPE_PAUSE; + String nfRole = (String) execution.getVariable(VNF_TYPE); String subscriptionServiceType = (String) execution.getVariable(SERVICE_TYPE); String originalRequestId = (String) execution.getVariable(MSO_REQUEST_ID); String originalRequestorId = (String) execution.getVariable(REQUESTOR_ID); String description = (String) execution.getVariable(DESCRIPTION); String timeout = ""; - String errorSource = ""; - String errorCode = ""; - String errorMessage = ""; - String buildingBlockName = ""; - String buildingBlockStep = ""; + String errorSource = ASTERISK; + String errorCode = ASTERISK; + String errorMessage = ASTERISK; + String buildingBlockName = ASTERISK; + String buildingBlockStep = ASTERISK; String validResponses = (String) execution.getVariable(VALID_RESPONSES); Map taskVariables = new HashMap<>(); - taskVariables.put("type", type); - taskVariables.put("nfRole", nfRole); - taskVariables.put(DESCRIPTION, description); - taskVariables.put("timeout", timeout); - taskVariables.put("subscriptionServiceType", subscriptionServiceType); - taskVariables.put("originalRequestId", originalRequestId); - taskVariables.put("originalRequestorId", originalRequestorId); - taskVariables.put("errorSource", errorSource); - taskVariables.put(ERROR_CODE, errorCode); - taskVariables.put("errorMessage", errorMessage); - taskVariables.put("buildingBlockName", buildingBlockName); - taskVariables.put("buildingBlockStep", buildingBlockStep); - taskVariables.put(VALID_RESPONSES, validResponses); + taskVariables.put(TASK_VARIABLE_TYPE, type); + taskVariables.put(TASK_VARIABLE_NFROLE, nfRole); + taskVariables.put(TASK_VARIABLE_DESCRIPTION, description); + taskVariables.put(TASK_VARIABLE_TIMEOUT, timeout); + taskVariables.put(TASK_VARIABLE_SUBSCRIPTION_SERVICE_TYPE, subscriptionServiceType); + taskVariables.put(TASK_VARIABLE_ORIGINAL_REQUEST_ID, originalRequestId); + taskVariables.put(TASK_VARIABLE_ORIGINAL_REQUESTOR_ID, originalRequestorId); + taskVariables.put(TASK_VARIABLE_ERROR_SOURCE, errorSource); + taskVariables.put(TASK_VARIABLE_ERROR_CODE, errorCode); + taskVariables.put(TASK_VARIABLE_ERROR_MESSAGE, errorMessage); + taskVariables.put(TASK_VARIABLE_BUILDING_BLOCK_NAME, buildingBlockName); + taskVariables.put(TASK_VARIABLE_BUILDING_BLOCK_STEP, buildingBlockStep); + taskVariables.put(TASK_VARIABLE_VALID_RESPONSES, validResponses); TaskService taskService = execution.getProcessEngineServices().getTaskService(); taskService.setVariables(taskId, taskVariables); @@ -169,14 +247,14 @@ public class ManualHandlingTasks { TaskService taskService = execution.getProcessEngineServices().getTaskService(); Map taskVariables = taskService.getVariables(taskId); - String responseValue = (String) taskVariables.get("responseValue"); + String responseValue = (String) taskVariables.get(RESPONSE_VALUE); logger.debug("Received responseValue on completion: " + responseValue); // Have to set the first letter of the response to upper case String responseValueUppercaseStart = responseValue.substring(0, 1).toUpperCase() + responseValue.substring(1); logger.debug("ResponseValue to taskListener: " + responseValueUppercaseStart); - execution.setVariable("responseValueTask", responseValueUppercaseStart); + execution.setVariable(RESPONSE_VALUE_TASK, responseValueUppercaseStart); } catch (BpmnError e) { logger.debug(BPMN_EXCEPTION + e.getMessage()); @@ -190,33 +268,7 @@ public class ManualHandlingTasks { } public void createExternalTicket(BuildingBlockExecution execution) { - - try { - ExternalTicket ticket = new ExternalTicket(); - - ticket.setRequestId((String) execution.getVariable(MSO_REQUEST_ID)); - ticket.setCurrentActivity((String) execution.getVariable("currentActivity")); - ticket.setNfRole((String) execution.getVariable(VNF_TYPE)); - ticket.setDescription((String) execution.getVariable(DESCRIPTION)); - ticket.setSubscriptionServiceType((String) execution.getVariable(SERVICE_TYPE)); - ticket.setRequestorId((String) execution.getVariable(REQUESTOR_ID)); - ticket.setTimeout((String) execution.getVariable("taskTimeout")); - ticket.setErrorSource((String) execution.getVariable("failedActivity")); - ticket.setErrorCode((String) execution.getVariable(ERROR_CODE)); - ticket.setErrorMessage((String) execution.getVariable("errorText")); - ticket.setWorkStep((String) execution.getVariable("workStep")); - - ticket.createTicket(); - } catch (BpmnError e) { - String msg = "BPMN error in createAOTSTicket " + e.getMessage(); - logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", - ErrorCode.UnknownError.getValue()); - } catch (Exception ex) { - String msg = "Exception in createExternalTicket " + ex.getMessage(); - logger.error(LoggingAnchor.FOUR, MessageEnum.BPMN_GENERAL_EXCEPTION_ARG, msg, "BPMN", - ErrorCode.UnknownError.getValue()); - } - + externalTicketCreation.createExternalTicket(execution); } public void updateRequestDbStatus(BuildingBlockExecution execution, String status) { @@ -224,6 +276,9 @@ public class ManualHandlingTasks { String requestId = (String) execution.getVariable(MSO_REQUEST_ID); InfraActiveRequests request = requestDbclient.getInfraActiveRequestbyRequestId(requestId); + if (status.equalsIgnoreCase(Status.TIMEOUT.name())) { + execution.setVariable(RESPONSE_VALUE_TASK, "Timeout"); + } request.setRequestStatus(status); request.setLastModifiedBy("ManualHandling"); diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasksTest.java new file mode 100644 index 0000000000..f8ecf01579 --- /dev/null +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasksTest.java @@ -0,0 +1,75 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP - SO + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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.manualhandling.tasks; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.camunda.bpm.extension.mockito.delegate.DelegateExecutionFake; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.onap.so.bpmn.BaseTaskTest; +import org.onap.so.bpmn.common.BuildingBlockExecution; +import org.onap.so.bpmn.common.DelegateExecutionImpl; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.ticket.ExternalTicket; + +public class ExternalTicketTasksTest extends BaseTaskTest { + + @Mock + private BuildingBlockExecution buildingBlockExecution; + + @Mock + private GeneralBuildingBlock generalBuildingBlock; + + @Mock + private RequestContext requestContext; + + @Mock + private ExternalTicket MOCK_externalTicket; + + @Before + public void before() throws Exception { + delegateExecution = new DelegateExecutionFake(); + buildingBlockExecution = new DelegateExecutionImpl(delegateExecution); + generalBuildingBlock = new GeneralBuildingBlock(); + requestContext = new RequestContext(); + requestContext.setRequestorId("someRequestorId"); + generalBuildingBlock.setRequestContext(requestContext); + buildingBlockExecution.setVariable("mso-request-id", ("testMsoRequestId")); + buildingBlockExecution.setVariable("vnfType", "testVnfType"); + buildingBlockExecution.setVariable("gBBInput", generalBuildingBlock); + buildingBlockExecution.setVariable("rainyDayVnfName", "someVnfName"); + buildingBlockExecution.setVariable("workStep", "someWorkstep"); + buildingBlockExecution.setVariable("taskTimeout", "PT5M"); + } + + @Test + public void createExternalTicket_Test() throws Exception { + ExternalTicketTasks externalTicketTasksSpy = spy(new ExternalTicketTasks()); + when(externalTicketTasksSpy.getExternalTicket()).thenReturn(MOCK_externalTicket); + externalTicketTasksSpy.createExternalTicket(buildingBlockExecution); + verify(MOCK_externalTicket, times(1)).createTicket(); + } +} diff --git a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java index b40195c07b..b6dcd96534 100644 --- a/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java +++ b/bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java @@ -37,9 +37,13 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.onap.so.bpmn.BaseTaskTest; import org.onap.so.bpmn.common.BuildingBlockExecution; import org.onap.so.bpmn.common.DelegateExecutionImpl; +import org.onap.so.bpmn.servicedecomposition.entities.GeneralBuildingBlock; +import org.onap.so.bpmn.servicedecomposition.generalobjects.RequestContext; +import org.onap.so.client.ticket.ExternalTicket; import org.onap.so.db.request.beans.InfraActiveRequests; public class ManualHandlingTasksTest extends BaseTaskTest { @@ -61,14 +65,36 @@ public class ManualHandlingTasksTest extends BaseTaskTest { @Mock private BuildingBlockExecution buildingBlockExecution; + @Mock + private GeneralBuildingBlock generalBuildingBlock; + + @Mock + private RequestContext requestContext; + + @Mock + private ExternalTicket MOCK_externalTicket; + @Before public void before() throws Exception { + MockitoAnnotations.initMocks(this); delegateExecution = new DelegateExecutionFake(); buildingBlockExecution = new DelegateExecutionImpl(delegateExecution); + generalBuildingBlock = new GeneralBuildingBlock(); + requestContext = new RequestContext(); + requestContext.setRequestorId("someRequestorId"); + generalBuildingBlock.setRequestContext(requestContext); + buildingBlockExecution.setVariable("mso-request-id", ("testMsoRequestId")); + buildingBlockExecution.setVariable("vnfType", "testVnfType"); + buildingBlockExecution.setVariable("gBBInput", generalBuildingBlock); + buildingBlockExecution.setVariable("rainyDayVnfName", "someVnfName"); + buildingBlockExecution.setVariable("workStep", "someWorkstep"); + buildingBlockExecution.setVariable("taskTimeout", "PT5M"); } @Test public void setFalloutTaskVariables_Test() { + when(mockExecution.getVariable("gBuildingBlockExecution")).thenReturn(buildingBlockExecution); + buildingBlockExecution.setVariable("gBBInput", generalBuildingBlock); when(task.getId()).thenReturn("taskId"); when(task.getExecution()).thenReturn(mockExecution); when(mockExecution.getProcessEngineServices()).thenReturn(processEngineServices); @@ -103,7 +129,6 @@ public class ManualHandlingTasksTest extends BaseTaskTest { @Test public void updateRequestDbStatus_Test() throws Exception { InfraActiveRequests mockedRequest = new InfraActiveRequests(); - buildingBlockExecution.setVariable("mso-request-id", "msoRequestId"); when(requestsDbClient.getInfraActiveRequestbyRequestId(any(String.class))).thenReturn(mockedRequest); doNothing().when(requestsDbClient).updateInfraActiveRequests(any(InfraActiveRequests.class)); manualHandlingTasks.updateRequestDbStatus(buildingBlockExecution, "IN_PROGRESS"); @@ -111,10 +136,4 @@ public class ManualHandlingTasksTest extends BaseTaskTest { assertEquals(mockedRequest.getRequestStatus(), "IN_PROGRESS"); } - @Test - public void createExternalTicket_Test() throws Exception { - buildingBlockExecution.setVariable("mso-request-id", ("testMsoRequestId")); - buildingBlockExecution.setVariable("vnfType", "testVnfType"); - manualHandlingTasks.createExternalTicket(buildingBlockExecution); - } } -- cgit 1.2.3-korg