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 --- .../main/resources/db/migration/R__MacroData.sql | 22 +++ .../service/ApplicationControllerTask.java | 11 +- .../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 +++- .../java/org/onap/so/client/ruby/RubyClient.java | 87 --------- .../java/org/onap/so/client/ruby/beans/Event.java | 64 ------- .../org/onap/so/client/ruby/beans/MsoRequest.java | 199 -------------------- .../java/org/onap/so/client/ruby/beans/Ruby.java | 64 ------- .../dmaap/RubyCreateTicketRequestPublisher.java | 55 ------ common/src/test/java/org/onap/so/BeansTest.java | 1 - .../onap/so/client/ruby/RubyCheckClientTest.java | 101 ---------- .../onap/so/client/ruby/beans/RubyBeansTest.java | 55 ------ .../ruby/create-ticket/create-ticket-request.json | 15 -- .../org/onap/so/apihandlerinfra/ManualTasks.java | 2 +- .../onap/so/apihandlerinfra/ManualTasksTest.java | 2 +- .../InPlaceSoftwareUpdateTenantId.json | 2 +- 29 files changed, 911 insertions(+), 894 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 delete mode 100644 common/src/main/java/org/onap/so/client/ruby/RubyClient.java delete mode 100644 common/src/main/java/org/onap/so/client/ruby/beans/Event.java delete mode 100644 common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java delete mode 100644 common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java delete mode 100644 common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java delete mode 100644 common/src/test/java/org/onap/so/client/ruby/RubyCheckClientTest.java delete mode 100644 common/src/test/java/org/onap/so/client/ruby/beans/RubyBeansTest.java delete mode 100644 common/src/test/resources/org/onap/so/client/ruby/create-ticket/create-ticket-request.json diff --git a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql index f5c7cd65c2..ede499f9ee 100644 --- a/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql +++ b/adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql @@ -873,3 +873,25 @@ VALUES UPDATE vnf_recipe SET ORCHESTRATION_URI = '/mso/async/services/WorkflowActionBB' WHERE NF_ROLE = 'GR-API-DEFAULT' AND ACTION = 'inPlaceSoftwareUpdate'; + +INSERT INTO rainy_day_handler_macro (FLOW_NAME, SERVICE_TYPE, VNF_TYPE, ERROR_CODE, WORK_STEP, POLICY, SECONDARY_POLICY, REG_EX_ERROR_MESSAGE, SERVICE_ROLE) +VALUES +('VNFCheckPserversLockedFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFCheckInMaintFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFSetInMaintFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFCheckClosedLoopDisabledFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFSetClosedLoopDisabledFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFLockActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUpgradePreCheckActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFQuiesceTrafficActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFStopActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFSnapShotActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFStartActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUpgradeBackupActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUpgradeSoftwareActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUpgradePostCheckActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFResumeTrafficActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUnlockActivity','*','*','*','*','Manual','Abort','*', '*'), +('SDNOVnfHealthCheckBB','*','*','*','*','Manual','Abort','*', '*'), +('VNFUnsetInMaintFlagActivity','*','*','*','*','Manual','Abort','*', '*'), +('VNFUnsetClosedLoopDisabledActivity','*','*','*','*','Manual','Abort','*', '*'); diff --git a/adapters/so-appc-orchestrator/src/main/java/org/onap/so/adapters/appc/orchestrator/service/ApplicationControllerTask.java b/adapters/so-appc-orchestrator/src/main/java/org/onap/so/adapters/appc/orchestrator/service/ApplicationControllerTask.java index 181d114cc0..db70a6b5cb 100644 --- a/adapters/so-appc-orchestrator/src/main/java/org/onap/so/adapters/appc/orchestrator/service/ApplicationControllerTask.java +++ b/adapters/so-appc-orchestrator/src/main/java/org/onap/so/adapters/appc/orchestrator/service/ApplicationControllerTask.java @@ -4,6 +4,7 @@ import org.camunda.bpm.client.task.ExternalTask; import org.camunda.bpm.client.task.ExternalTaskService; import org.onap.so.adapters.appc.orchestrator.client.ApplicationControllerCallback; import org.onap.so.adapters.appc.orchestrator.client.ApplicationControllerSupport; +import org.onap.so.adapters.appc.orchestrator.client.StatusCategory; import org.onap.so.appc.orchestrator.service.beans.ApplicationControllerTaskRequest; import org.onap.so.externaltasks.logging.AuditMDCSetup; import org.onap.so.utils.ExternalTaskUtils; @@ -42,8 +43,16 @@ public class ApplicationControllerTask extends ExternalTaskUtils { try { status = applicationControllerTaskImpl.execute(msoRequestId, request, listener); + if (status != null && status.getCode() != 0 + && !applicationControllerSupport.getCategoryOf(status).equals(StatusCategory.NORMAL)) { + logger.error("The External Task Id: {} Failed locally with status {}", externalTask.getId(), + status.getMessage()); + externalTaskService.handleBpmnError(externalTask, "MSOWorkflowException", status.getMessage()); + } } catch (Exception e) { - logger.error("Error while calling appc", e.getMessage()); + logger.error("The External Task Id: {} Failed while calling appc with exception", externalTask.getId(), + e.getMessage()); + externalTaskService.handleBpmnError(externalTask, "MSOWorkflowException", e.getMessage()); } } 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); - } } diff --git a/common/src/main/java/org/onap/so/client/ruby/RubyClient.java b/common/src/main/java/org/onap/so/client/ruby/RubyClient.java deleted file mode 100644 index 6c8f48884d..0000000000 --- a/common/src/main/java/org/onap/so/client/ruby/RubyClient.java +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * ============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.client.ruby; - -import java.io.IOException; -import java.time.ZoneOffset; -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import org.onap.so.client.dmaap.DmaapPublisher; -import org.onap.so.client.ruby.beans.Event; -import org.onap.so.client.ruby.beans.MsoRequest; -import org.onap.so.client.ruby.beans.Ruby; -import org.onap.so.client.ruby.dmaap.RubyCreateTicketRequestPublisher; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - - -public class RubyClient { - - private static final String REQUEST_CLIENT_NAME = "MSO"; - private static final String ACTION = "Create Ticket"; - - protected String buildRequest(String requestId, String sourceName, String reason, String workflowId, - String notification) throws JsonProcessingException { - final MsoRequest request = new MsoRequest(); - request.withRequestClientName(REQUEST_CLIENT_NAME).withRequestId(requestId).withSourceName(sourceName) - .withWorkflowId(workflowId).withAction(ACTION); - - request.withRequestTime(this.getTime()); - - if (reason.length() <= 255) { - request.withReason(reason); - } else { - throw new IllegalArgumentException("reason exceeds 255 characters"); - } - if (notification.length() <= 1024) { - request.withNotification(notification); - } else { - throw new IllegalArgumentException("notification exceeds 1024 characters"); - } - final Event event = new Event(); - event.setMsoRequest(request); - final Ruby ruby = new Ruby(); - ruby.setEvent(event); - return this.getJson(ruby); - } - - protected String getJson(Ruby obj) throws JsonProcessingException { - final ObjectMapper mapper = new ObjectMapper(); - return mapper.writeValueAsString(obj); - } - - protected DmaapPublisher getPublisher() throws IOException { - return new RubyCreateTicketRequestPublisher(); - } - - protected String getTime() { - final ZonedDateTime currentDateTime = ZonedDateTime.now(ZoneOffset.UTC); - final DateTimeFormatter format = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z"); - return currentDateTime.format(format); - } - - public void rubyCreateTicketCheckRequest(String requestId, String sourceName, String reason, String workflowId, - String notification) throws Exception { - String request = this.buildRequest(requestId, sourceName, reason, workflowId, notification); - final DmaapPublisher publisher = this.getPublisher(); - publisher.send(request); - } -} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/Event.java b/common/src/main/java/org/onap/so/client/ruby/beans/Event.java deleted file mode 100644 index 2737342adc..0000000000 --- a/common/src/main/java/org/onap/so/client/ruby/beans/Event.java +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * ============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.client.ruby.beans; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"msoRequest"}) -public class Event { - - @JsonProperty("msoRequest") - private MsoRequest msoRequest; - - /** - * No args constructor for use in serialization - * - */ - public Event() {} - - /** - * - * @param msoRequest - */ - public Event(MsoRequest msoRequest) { - super(); - this.msoRequest = msoRequest; - } - - @JsonProperty("msoRequest") - public MsoRequest getMsoRequest() { - return msoRequest; - } - - @JsonProperty("msoRequest") - public void setMsoRequest(MsoRequest msoRequest) { - this.msoRequest = msoRequest; - } - - public Event withMsoRequest(MsoRequest msoRequest) { - this.msoRequest = msoRequest; - return this; - } - -} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java b/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java deleted file mode 100644 index 15cfc9222f..0000000000 --- a/common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java +++ /dev/null @@ -1,199 +0,0 @@ -/*- - * ============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.client.ruby.beans; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"requestClientName", "requestId", "requestTime", "sourceName", "reason", "action", "workflowId", - "notification"}) -public class MsoRequest { - - @JsonProperty("requestClientName") - private String requestClientName; - @JsonProperty("requestId") - private String requestId; - @JsonProperty("requestTime") - private String requestTime; - @JsonProperty("sourceName") - private String sourceName; - @JsonProperty("reason") - private String reason; - @JsonProperty("action") - private String action; - @JsonProperty("workflowId") - private String workflowId; - @JsonProperty("notification") - private String notification; - - /** - * No args constructor for use in serialization - * - */ - public MsoRequest() {} - - /** - * - * @param requestClientName - * @param requestTime - * @param reason - * @param requestId - * @param workflowId - * @param sourceName - * @param action - * @param notification - */ - public MsoRequest(String requestClientName, String requestId, String requestTime, String sourceName, String reason, - String action, String workflowId, String notification) { - super(); - this.requestClientName = requestClientName; - this.requestId = requestId; - this.requestTime = requestTime; - this.sourceName = sourceName; - this.reason = reason; - this.action = action; - this.workflowId = workflowId; - this.notification = notification; - } - - @JsonProperty("requestClientName") - public String getRequestClientName() { - return requestClientName; - } - - @JsonProperty("requestClientName") - public void setRequestClientName(String requestClientName) { - this.requestClientName = requestClientName; - } - - public MsoRequest withRequestClientName(String requestClientName) { - this.requestClientName = requestClientName; - return this; - } - - @JsonProperty("requestId") - public String getRequestId() { - return requestId; - } - - @JsonProperty("requestId") - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public MsoRequest withRequestId(String requestId) { - this.requestId = requestId; - return this; - } - - @JsonProperty("requestTime") - public String getRequestTime() { - return requestTime; - } - - @JsonProperty("requestTime") - public void setRequestTime(String requestTime) { - this.requestTime = requestTime; - } - - public MsoRequest withRequestTime(String requestTime) { - this.requestTime = requestTime; - return this; - } - - @JsonProperty("sourceName") - public String getSourceName() { - return sourceName; - } - - @JsonProperty("sourceName") - public void setSourceName(String sourceName) { - this.sourceName = sourceName; - } - - public MsoRequest withSourceName(String sourceName) { - this.sourceName = sourceName; - return this; - } - - @JsonProperty("reason") - public String getReason() { - return reason; - } - - @JsonProperty("reason") - public void setReason(String reason) { - this.reason = reason; - } - - public MsoRequest withReason(String reason) { - this.reason = reason; - return this; - } - - @JsonProperty("action") - public String getAction() { - return action; - } - - @JsonProperty("action") - public void setAction(String action) { - this.action = action; - } - - public MsoRequest withAction(String action) { - this.action = action; - return this; - } - - @JsonProperty("workflowId") - public String getWorkflowId() { - return workflowId; - } - - @JsonProperty("workflowId") - public void setWorkflowId(String workflowId) { - this.workflowId = workflowId; - } - - public MsoRequest withWorkflowId(String workflowId) { - this.workflowId = workflowId; - return this; - } - - @JsonProperty("notification") - public String getNotification() { - return notification; - } - - @JsonProperty("notification") - public void setNotification(String notification) { - this.notification = notification; - } - - public MsoRequest withNotification(String notification) { - this.notification = notification; - return this; - } - -} diff --git a/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java b/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java deleted file mode 100644 index 708b91638b..0000000000 --- a/common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * ============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.client.ruby.beans; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@JsonPropertyOrder({"event"}) -public class Ruby { - - @JsonProperty("event") - private Event event; - - /** - * No args constructor for use in serialization - * - */ - public Ruby() {} - - /** - * - * @param event - */ - public Ruby(Event event) { - super(); - this.event = event; - } - - @JsonProperty("event") - public Event getEvent() { - return event; - } - - @JsonProperty("event") - public void setEvent(Event event) { - this.event = event; - } - - public Ruby withEvent(Event event) { - this.event = event; - return this; - } - -} diff --git a/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java b/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java deleted file mode 100644 index 10402d9921..0000000000 --- a/common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============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.client.ruby.dmaap; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Optional; -import org.onap.so.client.dmaap.DmaapPublisher; - -public class RubyCreateTicketRequestPublisher extends DmaapPublisher { - public RubyCreateTicketRequestPublisher() throws FileNotFoundException, IOException { - super(); - } - - @Override - public String getAuth() { - return msoProperties.get("ruby.create-ticket-request.dmaap.auth"); - } - - @Override - public String getKey() { - return msoProperties.get("mso.msoKey"); - } - - @Override - public String getTopic() { - return msoProperties.get("ruby.create-ticket-request.publisher.topic"); - } - - @Override - public Optional getHost() { - return Optional.ofNullable(msoProperties.get("ruby.create-ticket-request.publisher.host")); - } - -} - - diff --git a/common/src/test/java/org/onap/so/BeansTest.java b/common/src/test/java/org/onap/so/BeansTest.java index 9e8a0184ab..01bdc4db38 100644 --- a/common/src/test/java/org/onap/so/BeansTest.java +++ b/common/src/test/java/org/onap/so/BeansTest.java @@ -63,7 +63,6 @@ public class BeansTest { test("org.onap.so.appc.orchestrator.service.beans"); test("org.onap.so.client.policy.entities"); test("org.onap.so.client.grm.beans"); - test("org.onap.so.client.ruby.beans"); test("org.onap.so.client.sdno.beans"); test("org.onap.so.entity"); test("org.onap.so.serviceinstancebeans"); diff --git a/common/src/test/java/org/onap/so/client/ruby/RubyCheckClientTest.java b/common/src/test/java/org/onap/so/client/ruby/RubyCheckClientTest.java deleted file mode 100644 index 1ca8942ac1..0000000000 --- a/common/src/test/java/org/onap/so/client/ruby/RubyCheckClientTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/*- - * ============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.client.ruby; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.text.ParseException; -import java.time.format.DateTimeFormatter; -import org.junit.Test; -import org.onap.so.client.ruby.beans.Ruby; -import static org.apache.commons.lang3.StringUtils.*; -import com.fasterxml.jackson.databind.ObjectMapper; - -public class RubyCheckClientTest { - private final String fileLocation = "src/test/resources/org/onap/so/client/ruby/create-ticket/"; - private static final String REQUEST_ID = "abc123"; - private static final String SOURCE_NAME = "source-name"; - private static final String TIME = "test-time"; - private static final String REASON = "reason"; - private static final String WORK_FLOW_ID = "work-flow-Id"; - private static final String NOTIFICATION = "notification"; - - - - @Test - public void verifyRubyCreateTicketRequest() throws IOException, ParseException { - String content = this.getJson("create-ticket-request.json"); - ObjectMapper mapper = new ObjectMapper(); - Ruby expected = mapper.readValue(content, Ruby.class); - RubyClient client = new RubyClient(); - RubyClient spy = spy(client); - when(spy.getTime()).thenReturn(TIME); - String actual = spy.buildRequest(REQUEST_ID, SOURCE_NAME, REASON, WORK_FLOW_ID, NOTIFICATION); - assertEquals("payloads are equal", mapper.writeValueAsString(expected), actual); - } - - - @Test - public void verifyTimeFormat() { - RubyClient client = new RubyClient(); - String time = client.getTime(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE, dd MMM yyyy HH:mm:ss Z"); - formatter.parse(time); - } - - - @Test - public void verifyReasonCharLimit() throws IOException { - final String reasonLong = repeat("*", 256); - RubyClient client = new RubyClient(); - try { - client.buildRequest(REQUEST_ID, SOURCE_NAME, reasonLong, WORK_FLOW_ID, NOTIFICATION); - fail("Should have thrown IllegalArgumentException but did not!"); - } catch (final IllegalArgumentException e) { - final String msg = "reason exceeds 255 characters"; - assertEquals(msg, e.getMessage()); - } - } - - @Test - public void verifyNotificationCharLimit() throws IOException { - final String notificationLong = repeat("*", 1025); - RubyClient client = new RubyClient(); - try { - client.buildRequest(REQUEST_ID, SOURCE_NAME, REASON, WORK_FLOW_ID, notificationLong); - fail("Should have thrown IllegalArgumentException but did not!"); - } catch (final IllegalArgumentException e) { - final String msg = "notification exceeds 1024 characters"; - assertEquals(msg, e.getMessage()); - } - } - - private String getJson(String filename) throws IOException { - return new String(Files.readAllBytes(Paths.get(fileLocation + filename))); - } - -} - diff --git a/common/src/test/java/org/onap/so/client/ruby/beans/RubyBeansTest.java b/common/src/test/java/org/onap/so/client/ruby/beans/RubyBeansTest.java deleted file mode 100644 index ca80930468..0000000000 --- a/common/src/test/java/org/onap/so/client/ruby/beans/RubyBeansTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/*- - * ============LICENSE_START======================================================= - * ONAP - SO - * ================================================================================ - * Copyright (C) 2018 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.client.ruby.beans; - -import org.junit.Test; -import com.openpojo.reflection.PojoClass; -import com.openpojo.reflection.PojoClassFilter; -import com.openpojo.reflection.filters.FilterEnum; -import com.openpojo.reflection.filters.FilterPackageInfo; -import com.openpojo.validation.Validator; -import com.openpojo.validation.ValidatorBuilder; -import com.openpojo.validation.rule.impl.GetterMustExistRule; -import com.openpojo.validation.rule.impl.SetterMustExistRule; -import com.openpojo.validation.test.impl.GetterTester; -import com.openpojo.validation.test.impl.SetterTester; - -public class RubyBeansTest { - - private PojoClassFilter filterTestClasses = new FilterTestClasses(); - - @Test - public void pojoStructure() { - test("org.onap.so.client.ruby.beans"); - } - - private void test(String pojoPackage) { - Validator validator = ValidatorBuilder.create().with(new GetterMustExistRule()).with(new SetterMustExistRule()) - .with(new SetterTester()).with(new GetterTester()).build(); - validator.validate(pojoPackage, new FilterPackageInfo(), new FilterEnum(), filterTestClasses); - } - - private static class FilterTestClasses implements PojoClassFilter { - public boolean include(PojoClass pojoClass) { - return !pojoClass.getSourcePath().contains("/test-classes/"); - } - } -} diff --git a/common/src/test/resources/org/onap/so/client/ruby/create-ticket/create-ticket-request.json b/common/src/test/resources/org/onap/so/client/ruby/create-ticket/create-ticket-request.json deleted file mode 100644 index e388d3e9ad..0000000000 --- a/common/src/test/resources/org/onap/so/client/ruby/create-ticket/create-ticket-request.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "event": { - "msoRequest": { - "requestClientName": "MSO", - "requestId": "abc123", - "requestTime": "test-time", - "sourceName": "source-name", - "reason": "reason", - "action": "Create Ticket", - "workflowId": "work-flow-Id", - "notification": "notification" - } -} -} - diff --git a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java index 7e4452aeb3..34eca2f266 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java +++ b/mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java @@ -66,7 +66,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; -@Path("/tasks") +@Path("/onap/so/infra/tasks") @Component public class ManualTasks { private static Logger logger = LoggerFactory.getLogger(ManualTasks.class); diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java index b8d1e56cf7..fcf25b23e9 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java +++ b/mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java @@ -52,7 +52,7 @@ import com.github.tomakehurst.wiremock.http.Fault; public class ManualTasksTest extends BaseTest { - private final String basePath = "/tasks/v1/"; + private final String basePath = "/onap/so/infra/tasks/v1/"; @Test public void testCreateOpEnvObjectMapperError() throws IOException { diff --git a/mso-api-handlers/mso-api-handler-infra/src/test/resources/MsoRequestTest/CloudConfiguration/InPlaceSoftwareUpdateTenantId.json b/mso-api-handlers/mso-api-handler-infra/src/test/resources/MsoRequestTest/CloudConfiguration/InPlaceSoftwareUpdateTenantId.json index 686faf15c0..ef7acdcb65 100644 --- a/mso-api-handlers/mso-api-handler-infra/src/test/resources/MsoRequestTest/CloudConfiguration/InPlaceSoftwareUpdateTenantId.json +++ b/mso-api-handlers/mso-api-handler-infra/src/test/resources/MsoRequestTest/CloudConfiguration/InPlaceSoftwareUpdateTenantId.json @@ -35,7 +35,7 @@ ], "requestParameters": { "autoBuildVfModules": false, - "payload": "{\"existing-software-version\": \"3.1\",\"new-software-version\": \"3.2\", \"operations-timeout\": \"3600\"}" + "payload": "{\"existing_software_version\": \"3.1\",\"new_software_version\": \"3.2\", \"operations_timeout\": \"3600\"}" } } } \ No newline at end of file -- cgit 1.2.3-korg