add manual handling to rainy day handling for bbs 83/100783/1
authorKuleshov, Elena <evn@att.com>
Fri, 24 Jan 2020 21:33:39 +0000 (16:33 -0500)
committerBenjamin, Max (mb388a) <mb388a@att.com>
Fri, 24 Jan 2020 21:33:40 +0000 (16:33 -0500)
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) <mb388a@att.com>
Change-Id: I98a84c1a489bb7b24b68e567f604aeb074fd7bf9

29 files changed:
adapters/mso-catalog-db-adapter/src/main/resources/db/migration/R__MacroData.sql
adapters/so-appc-orchestrator/src/main/java/org/onap/so/adapters/appc/orchestrator/service/ApplicationControllerTask.java
bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/ManualHandling.groovy
bpmn/MSOCommonBPMN/src/main/java/org/onap/so/bpmn/servicedecomposition/tasks/ExecuteBuildingBlockRainyDay.java
bpmn/MSOCommonBPMN/src/main/resources/subprocess/BuildingBlock/ManualHandling.bpmn
bpmn/MSOCommonBPMN/src/test/resources/application-test.yaml
bpmn/mso-infrastructure-bpmn/src/main/java/org/onap/so/bpmn/core/plugins/WorkflowExceptionPlugin.java
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/ExecuteBuildingBlock.bpmn
bpmn/so-bpmn-building-blocks/src/main/resources/subprocess/BuildingBlock/PauseForManualTaskRainyDay.bpmn [new file with mode: 0644]
bpmn/so-bpmn-building-blocks/src/test/java/org/onap/so/bpmn/infrastructure/bpmn/subprocess/PauseForManualTaskRainyDayTest.java [new file with mode: 0644]
bpmn/so-bpmn-infrastructure-flows/src/test/resources/__files/InfrastructureFlows/VnfInPlaceUpdate_VID_request.json
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/appc/tasks/AppcOrchestratorPreProcessor.java
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketCreation.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasks.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasks.java
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ExternalTicketTasksTest.java [new file with mode: 0644]
bpmn/so-bpmn-tasks/src/test/java/org/onap/so/bpmn/infrastructure/manualhandling/tasks/ManualHandlingTasksTest.java
common/src/main/java/org/onap/so/client/ruby/RubyClient.java [deleted file]
common/src/main/java/org/onap/so/client/ruby/beans/Event.java [deleted file]
common/src/main/java/org/onap/so/client/ruby/beans/MsoRequest.java [deleted file]
common/src/main/java/org/onap/so/client/ruby/beans/Ruby.java [deleted file]
common/src/main/java/org/onap/so/client/ruby/dmaap/RubyCreateTicketRequestPublisher.java [deleted file]
common/src/test/java/org/onap/so/BeansTest.java
common/src/test/java/org/onap/so/client/ruby/RubyCheckClientTest.java [deleted file]
common/src/test/java/org/onap/so/client/ruby/beans/RubyBeansTest.java [deleted file]
common/src/test/resources/org/onap/so/client/ruby/create-ticket/create-ticket-request.json [deleted file]
mso-api-handlers/mso-api-handler-infra/src/main/java/org/onap/so/apihandlerinfra/ManualTasks.java
mso-api-handlers/mso-api-handler-infra/src/test/java/org/onap/so/apihandlerinfra/ManualTasksTest.java
mso-api-handlers/mso-api-handler-infra/src/test/resources/MsoRequestTest/CloudConfiguration/InPlaceSoftwareUpdateTenantId.json

index f5c7cd6..ede499f 100644 (file)
@@ -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','*', '*');
index 181d114..db70a6b 100644 (file)
@@ -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());
         }
     }
 
index ef4291d..615964b 100644 (file)
@@ -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 ")
-       }
-
-
-
 }
index ae7addc..99767b0 100644 (file)
@@ -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;
                     }
index cec3e24..0115c07 100644 (file)
@@ -43,11 +43,11 @@ def mh = new ManualHandling()
 mh.setTaskVariables(task)]]></camunda:script>
         </camunda:taskListener>
       </bpmn2:extensionElements>
-      <bpmn2:incoming>SequenceFlow_0igra4l</bpmn2:incoming>
+      <bpmn2:incoming>SequenceFlow_0b84ki5</bpmn2:incoming>
       <bpmn2:outgoing>SequenceFlow_192yimz</bpmn2:outgoing>
     </bpmn2:userTask>
     <bpmn2:sequenceFlow id="SequenceFlow_0mbjrvr" sourceRef="Task_137bzdi" targetRef="Task_1kuxfdu" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0b84ki5" sourceRef="Task_1kuxfdu" targetRef="CreateAOTSRubyTicket" />
+    <bpmn2:sequenceFlow id="SequenceFlow_0b84ki5" sourceRef="Task_1kuxfdu" targetRef="ManualHandlingUserTask" />
     <bpmn2:sequenceFlow id="SequenceFlow_0zer29a" sourceRef="Task_0r60vxk" targetRef="Task_02xybqx" />
     <bpmn2:sequenceFlow id="SequenceFlow_14cyk9v" sourceRef="Task_02xybqx" targetRef="EndEvent_3" />
     <bpmn2:serviceTask id="Task_1kuxfdu" name="Update Infra DB Status to PENDING_MANUAL_TASK">
@@ -116,14 +116,6 @@ def mh = new ManualHandling()
 mh.preProcessRequest(execution)]]></bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:sequenceFlow id="SequenceFlow_0zgg47r" sourceRef="Task_1qrt7xw" targetRef="Task_137bzdi" />
-    <bpmn2:sequenceFlow id="SequenceFlow_0igra4l" sourceRef="CreateAOTSRubyTicket" targetRef="ManualHandlingUserTask" />
-    <bpmn2:scriptTask id="CreateAOTSRubyTicket" name="Create AOTS Ruby Ticket" scriptFormat="groovy">
-      <bpmn2:incoming>SequenceFlow_0b84ki5</bpmn2:incoming>
-      <bpmn2:outgoing>SequenceFlow_0igra4l</bpmn2:outgoing>
-      <bpmn2:script><![CDATA[import org.onap.so.bpmn.common.scripts.*
-def mh = new ManualHandling()
-mh.createAOTSTicket(execution)]]></bpmn2:script>
-    </bpmn2:scriptTask>
   </bpmn2:process>
   <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
@@ -136,9 +128,9 @@ mh.createAOTSTicket(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="_BPMNShape_EndEvent_177" bpmnElement="EndEvent_3">
-        <dc:Bounds x="1286" y="79" width="36" height="36" />
+        <dc:Bounds x="1173" y="79" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1304" y="120" width="0" height="0" />
+          <dc:Bounds x="1191" y="120" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="SubProcess_06d8lk8_di" bpmnElement="SubProcess_06d8lk8" isExpanded="true">
@@ -181,14 +173,14 @@ mh.createAOTSTicket(execution)]]></bpmn2:script>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_192yimz_di" bpmnElement="SequenceFlow_192yimz">
-        <di:waypoint xsi:type="dc:Point" x="944" y="97" />
-        <di:waypoint xsi:type="dc:Point" x="982" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="778" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="839" y="97" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="963" y="82" width="0" height="0" />
+          <dc:Bounds x="809" y="82" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="UserTask_1krqrz1_di" bpmnElement="ManualHandlingUserTask">
-        <dc:Bounds x="844" y="57" width="100" height="80" />
+        <dc:Bounds x="678" y="57" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0mbjrvr_di" bpmnElement="SequenceFlow_0mbjrvr">
         <di:waypoint xsi:type="dc:Point" x="483" y="97" />
@@ -199,23 +191,25 @@ mh.createAOTSTicket(execution)]]></bpmn2:script>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0b84ki5_di" bpmnElement="SequenceFlow_0b84ki5">
         <di:waypoint xsi:type="dc:Point" x="627" y="97" />
-        <di:waypoint xsi:type="dc:Point" x="689" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="656" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="656" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="678" y="97" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="658" y="82" width="0" height="0" />
+          <dc:Bounds x="671" y="97" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0zer29a_di" bpmnElement="SequenceFlow_0zer29a">
-        <di:waypoint xsi:type="dc:Point" x="1082" y="97" />
-        <di:waypoint xsi:type="dc:Point" x="1128" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="939" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="995" y="97" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1105" y="82" width="0" height="0" />
+          <dc:Bounds x="967" y="82" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_14cyk9v_di" bpmnElement="SequenceFlow_14cyk9v">
-        <di:waypoint xsi:type="dc:Point" x="1228" y="97" />
-        <di:waypoint xsi:type="dc:Point" x="1286" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="1095" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="1173" y="97" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1257" y="82" width="0" height="0" />
+          <dc:Bounds x="1134" y="82" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0c0yopb_di" bpmnElement="Task_1kuxfdu">
@@ -225,10 +219,10 @@ mh.createAOTSTicket(execution)]]></bpmn2:script>
         <dc:Bounds x="383" y="57" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_1mjq23a_di" bpmnElement="Task_0r60vxk">
-        <dc:Bounds x="982" y="57" width="100" height="80" />
+        <dc:Bounds x="839" y="57" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1hc2ewj_di" bpmnElement="Task_02xybqx">
-        <dc:Bounds x="1128" y="57" width="100" height="80" />
+        <dc:Bounds x="995" y="57" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ScriptTask_055s81f_di" bpmnElement="Task_1qrt7xw">
         <dc:Bounds x="238" y="57" width="100" height="80" />
@@ -240,16 +234,6 @@ mh.createAOTSTicket(execution)]]></bpmn2:script>
           <dc:Bounds x="361" y="82" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_0igra4l_di" bpmnElement="SequenceFlow_0igra4l">
-        <di:waypoint xsi:type="dc:Point" x="789" y="97" />
-        <di:waypoint xsi:type="dc:Point" x="844" y="97" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="817" y="82" width="0" height="0" />
-        </bpmndi:BPMNLabel>
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNShape id="ScriptTask_0yhlgfw_di" bpmnElement="CreateAOTSRubyTicket">
-        <dc:Bounds x="689" y="57" width="100" height="80" />
-      </bpmndi:BPMNShape>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn2:definitions>
index afdb800..ba2d19b 100644 (file)
@@ -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
index 42c6ef0..869c917 100644 (file)
@@ -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.
 
index e64c44e..443a571 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.10.0">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="1.4.0">
   <bpmn:process id="ExecuteBuildingBlock" name="ExecuteBuildingBlock" isExecutable="true">
     <bpmn:startEvent id="Start_ExecuteBuildingBlock" name="start">
       <bpmn:outgoing>SequenceFlow_0rq4c5r</bpmn:outgoing>
       </bpmn:serviceTask>
       <bpmn:exclusiveGateway id="ExclusiveGateway_1aonzik" name="Check HandlingCode" default="SequenceFlow_0h8v45y">
         <bpmn:incoming>SequenceFlow_0a62t4c</bpmn:incoming>
+        <bpmn:incoming>SequenceFlow_05le7o3</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_0fwsjva</bpmn:outgoing>
         <bpmn:outgoing>SequenceFlow_0h8v45y</bpmn:outgoing>
+        <bpmn:outgoing>SequenceFlow_1xh5ngw</bpmn:outgoing>
+        <bpmn:outgoing>SequenceFlow_0xyd2zl</bpmn:outgoing>
+        <bpmn:outgoing>SequenceFlow_1g7oq3t</bpmn:outgoing>
       </bpmn:exclusiveGateway>
       <bpmn:intermediateCatchEvent id="IntermediateCatchEvent_RetryTimer" name="RetryTimer">
         <bpmn:incoming>SequenceFlow_0ndt8ft</bpmn:incoming>
@@ -87,6 +91,7 @@
       </bpmn:endEvent>
       <bpmn:serviceTask id="Task_QuerySecondaryPolicy" name="Query Secondary Policy" camunda:expression="${ExecuteBuildingBlockRainyDay.queryRainyDayTable(execution,false)}">
         <bpmn:incoming>SequenceFlow_0541bid</bpmn:incoming>
+        <bpmn:incoming>SequenceFlow_1g7oq3t</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_12ps9at</bpmn:outgoing>
       </bpmn:serviceTask>
       <bpmn:sequenceFlow id="SequenceFlow_0vdeqxv" sourceRef="Task_UpdateExtErrorSource" targetRef="Task_QueryRainyDayTable" />
         <bpmn:incoming>SequenceFlow_09synl9</bpmn:incoming>
         <bpmn:outgoing>SequenceFlow_0vdeqxv</bpmn:outgoing>
       </bpmn:serviceTask>
+      <bpmn:sequenceFlow id="SequenceFlow_05le7o3" sourceRef="PauseForManualTaskRainyDay" targetRef="ExclusiveGateway_1aonzik" />
+      <bpmn:sequenceFlow id="SequenceFlow_1xh5ngw" name="Manual" sourceRef="ExclusiveGateway_1aonzik" targetRef="PauseForManualTaskRainyDay">
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("handlingCode")=="Manual"}]]></bpmn:conditionExpression>
+      </bpmn:sequenceFlow>
+      <bpmn:sequenceFlow id="SequenceFlow_0xyd2zl" name="Skip" sourceRef="ExclusiveGateway_1aonzik" targetRef="Task_setHandlingCodeSuccessOnSkip">
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("handlingCode")=="Skip"}]]></bpmn:conditionExpression>
+      </bpmn:sequenceFlow>
+      <bpmn:serviceTask id="Task_setHandlingCodeSuccessOnSkip" name="Set Handling Code to Success" camunda:expression="${ExecuteBuildingBlockRainyDay.setHandlingStatusSuccess(execution)}">
+        <bpmn:incoming>SequenceFlow_0xyd2zl</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1ynai9j</bpmn:outgoing>
+      </bpmn:serviceTask>
+      <bpmn:callActivity id="PauseForManualTaskRainyDay" name="Pause for Manual Task Rainy Day" calledElement="PauseForManualTaskRainyDay">
+        <bpmn:extensionElements>
+          <camunda:out source="responseValueTask" target="handlingCode" />
+          <camunda:in source="gBuildingBlockExecution" target="gBuildingBlockExecution" />
+          <camunda:in source="rainyDayServiceType" target="rainyDayServiceType" />
+          <camunda:in source="rainyDayVnfType" target="rainyDayVnfType" />
+          <camunda:in source="WorkflowException" target="WorkflowException" />
+          <camunda:in source="rainyDayVnfName" target="rainyDayVnfName" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_1xh5ngw</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_05le7o3</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:endEvent id="EndEvent_1py1er4" name="end">
+        <bpmn:incoming>SequenceFlow_1ynai9j</bpmn:incoming>
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_1ynai9j" sourceRef="Task_setHandlingCodeSuccessOnSkip" targetRef="EndEvent_1py1er4" />
+      <bpmn:sequenceFlow id="SequenceFlow_1g7oq3t" name="Timeout" sourceRef="ExclusiveGateway_1aonzik" targetRef="Task_QuerySecondaryPolicy">
+        <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${execution.getVariable("handlingCode")=="Timeout"}]]></bpmn:conditionExpression>
+      </bpmn:sequenceFlow>
     </bpmn:subProcess>
     <bpmn:sequenceFlow id="SequenceFlow_16lmcxp" sourceRef="Task_setHandlingCodeSuccess" targetRef="End_ExecuteBuildingBlock" />
     <bpmn:sequenceFlow id="SequenceFlow_1j0vskt" name="Silent Success" sourceRef="CheckOrchestrationStatusValidationResults" targetRef="Task_setHandlingCodeSuccess">
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_0ey4zpt_di" bpmnElement="ExclusiveGateway_0ey4zpt" isMarkerVisible="true">
-        <dc:Bounds x="692" y="389" width="50" height="50" />
+        <dc:Bounds x="695" y="478" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="686" y="364" width="65" height="12" />
+          <dc:Bounds x="691" y="453" width="62" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="IntermediateCatchEvent_0qjyidb_di" bpmnElement="IntermediateCatchEvent_RetryTimer">
-        <dc:Bounds x="936" y="396" width="36" height="36" />
+        <dc:Bounds x="939" y="485" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="927" y="371" width="56" height="12" />
+          <dc:Bounds x="930" y="460" width="55" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_1aonzik_di" bpmnElement="ExclusiveGateway_1aonzik" isMarkerVisible="true">
-        <dc:Bounds x="539" y="389" width="50" height="50" />
+        <dc:Bounds x="542" y="478" width="50" height="50" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="528" y="351" width="72" height="24" />
+          <dc:Bounds x="533" y="440" width="68" height="24" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1wbevp0_di" bpmnElement="SequenceFlow_1wbevp0">
-        <di:waypoint xsi:type="dc:Point" x="742" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="807" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="745" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="810" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="759" y="389" width="19" height="12" />
+          <dc:Bounds x="763" y="478" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0fwsjva_di" bpmnElement="SequenceFlow_0fwsjva">
-        <di:waypoint xsi:type="dc:Point" x="589" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="692" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="592" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="695" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="627" y="422" width="28" height="12" />
+          <dc:Bounds x="630" y="511" width="27" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0h8v45y_di" bpmnElement="SequenceFlow_0h8v45y">
-        <di:waypoint xsi:type="dc:Point" x="564" y="439" />
-        <di:waypoint xsi:type="dc:Point" x="564" y="495" />
+        <di:waypoint xsi:type="dc:Point" x="567" y="528" />
+        <di:waypoint xsi:type="dc:Point" x="567" y="584" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="570" y="460" width="88" height="12" />
+          <dc:Bounds x="575" y="549" width="84" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1tifgqh_di" bpmnElement="Task_QueryRainyDayTable">
-        <dc:Bounds x="396" y="374" width="100" height="80" />
+        <dc:Bounds x="399" y="463" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0ndt8ft_di" bpmnElement="SequenceFlow_0ndt8ft">
-        <di:waypoint xsi:type="dc:Point" x="907" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="936" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="910" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="939" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="877" y="393" width="90" height="12" />
+          <dc:Bounds x="925" y="482" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_07a1ytc_di" bpmnElement="SequenceFlow_07a1ytc">
-        <di:waypoint xsi:type="dc:Point" x="972" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="1010" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="975" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="1013" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="946" y="393" width="90" height="12" />
+          <dc:Bounds x="994" y="482" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1obvxht_di" bpmnElement="Task_SetRetryTimer">
-        <dc:Bounds x="807" y="374" width="100" height="80" />
+        <dc:Bounds x="810" y="463" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0kdjsnx_di" bpmnElement="Continue">
         <di:waypoint xsi:type="dc:Point" x="508" y="180" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0a62t4c_di" bpmnElement="SequenceFlow_0a62t4c">
-        <di:waypoint xsi:type="dc:Point" x="496" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="539" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="499" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="542" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="473" y="393" width="90" height="13" />
+          <dc:Bounds x="521" y="482" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="SubProcess_0tv8zda_di" bpmnElement="SubProcess_0tv8zda" isExpanded="true">
-        <dc:Bounds x="171" y="298" width="922" height="295" />
+        <dc:Bounds x="171" y="299" width="1020" height="432" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0mvmk3i_di" bpmnElement="EndEvent_0mvmk3i">
-        <dc:Bounds x="546" y="495" width="36" height="36" />
+        <dc:Bounds x="549" y="584" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="519" y="535" width="90" height="12" />
+          <dc:Bounds x="567" y="624" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1aww7yx_di" bpmnElement="EndEvent_1sez2lh">
-        <dc:Bounds x="1010" y="396" width="36" height="36" />
+        <dc:Bounds x="1013" y="485" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1020" y="436" width="20" height="12" />
+          <dc:Bounds x="1024" y="525" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_16lmcxp_di" bpmnElement="SequenceFlow_16lmcxp">
         <dc:Bounds x="906" y="140" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0541bid_di" bpmnElement="SequenceFlow_0541bid">
-        <di:waypoint xsi:type="dc:Point" x="717" y="439" />
-        <di:waypoint xsi:type="dc:Point" x="717" y="463" />
+        <di:waypoint xsi:type="dc:Point" x="720" y="528" />
+        <di:waypoint xsi:type="dc:Point" x="720" y="552" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="728" y="440" width="13" height="12" />
+          <dc:Bounds x="732" y="529" width="12" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_12ps9at_di" bpmnElement="SequenceFlow_12ps9at">
-        <di:waypoint xsi:type="dc:Point" x="767" y="503" />
-        <di:waypoint xsi:type="dc:Point" x="839" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="770" y="592" />
+        <di:waypoint xsi:type="dc:Point" x="842" y="592" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="758" y="482" width="90" height="12" />
+          <dc:Bounds x="806" y="571" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_05vw85n_di" bpmnElement="EndEvent_0ex9298">
-        <dc:Bounds x="839" y="485" width="36" height="36" />
+        <dc:Bounds x="842" y="574" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="848" y="525" width="20" height="12" />
+          <dc:Bounds x="852" y="614" width="18" height="12" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_11f2c91_di" bpmnElement="Task_QuerySecondaryPolicy">
-        <dc:Bounds x="667" y="463" width="100" height="80" />
+        <dc:Bounds x="670" y="552" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0vdeqxv_di" bpmnElement="SequenceFlow_0vdeqxv">
-        <di:waypoint xsi:type="dc:Point" x="361" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="396" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="364" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="399" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="378.5" y="393" width="0" height="12" />
+          <dc:Bounds x="382" y="482" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="StartEvent_0tmcs9g_di" bpmnElement="StartEvent_0tmcs9g">
-        <dc:Bounds x="196" y="396" width="36" height="36" />
+        <dc:Bounds x="199" y="485" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="79" y="432" width="90" height="12" />
+          <dc:Bounds x="127" y="521" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_09synl9_di" bpmnElement="SequenceFlow_09synl9">
-        <di:waypoint xsi:type="dc:Point" x="232" y="414" />
-        <di:waypoint xsi:type="dc:Point" x="261" y="414" />
+        <di:waypoint xsi:type="dc:Point" x="235" y="503" />
+        <di:waypoint xsi:type="dc:Point" x="264" y="503" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="201.5" y="393" width="90" height="12" />
+          <dc:Bounds x="250" y="482" width="0" height="0" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_10v49qn_di" bpmnElement="Task_UpdateExtErrorSource">
-        <dc:Bounds x="261" y="374" width="100" height="80" />
+        <dc:Bounds x="264" y="463" width="100" height="80" />
       </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_05le7o3_di" bpmnElement="SequenceFlow_05le7o3">
+        <di:waypoint xsi:type="dc:Point" x="617" y="377" />
+        <di:waypoint xsi:type="dc:Point" x="659" y="377" />
+        <di:waypoint xsi:type="dc:Point" x="659" y="421" />
+        <di:waypoint xsi:type="dc:Point" x="580" y="491" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="674" y="399" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1xh5ngw_di" bpmnElement="SequenceFlow_1xh5ngw">
+        <di:waypoint xsi:type="dc:Point" x="553" y="492" />
+        <di:waypoint xsi:type="dc:Point" x="462" y="423" />
+        <di:waypoint xsi:type="dc:Point" x="462" y="377" />
+        <di:waypoint xsi:type="dc:Point" x="517" y="377" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="468" y="400" width="35" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0xyd2zl_di" bpmnElement="SequenceFlow_0xyd2zl">
+        <di:waypoint xsi:type="dc:Point" x="553" y="514" />
+        <di:waypoint xsi:type="dc:Point" x="449" y="589" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="506" y="549.4997153461163" width="21" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0ohzi8e_di" bpmnElement="Task_setHandlingCodeSuccessOnSkip">
+        <dc:Bounds x="399" y="589" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0szwp51_di" bpmnElement="PauseForManualTaskRainyDay">
+        <dc:Bounds x="517" y="337" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1py1er4_di" bpmnElement="EndEvent_1py1er4">
+        <dc:Bounds x="304" y="611" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="313" y="647" width="18" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ynai9j_di" bpmnElement="SequenceFlow_1ynai9j">
+        <di:waypoint xsi:type="dc:Point" x="399" y="629" />
+        <di:waypoint xsi:type="dc:Point" x="340" y="629" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="370" y="604" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1g7oq3t_di" bpmnElement="SequenceFlow_1g7oq3t">
+        <di:waypoint xsi:type="dc:Point" x="583" y="512" />
+        <di:waypoint xsi:type="dc:Point" x="670" y="562" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="649" y="533" width="39" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
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 (file)
index 0000000..29657e1
--- /dev/null
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="_MagIIMOUEeW8asg-vCEgWQ" targetNamespace="http://camunda.org/schema/1.0/bpmn" exporter="Camunda Modeler" exporterVersion="1.4.0" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd">
+  <bpmn2:process id="PauseForManualTaskRainyDay" name="PauseForManualTaskRainyDay" isExecutable="true">
+    <bpmn2:startEvent id="PauseForManualTaskRainyDay_Start">
+      <bpmn2:outgoing>SequenceFlow_0jav6cu</bpmn2:outgoing>
+    </bpmn2:startEvent>
+    <bpmn2:endEvent id="PauseForManualTaskRainyDay_End">
+      <bpmn2:incoming>SequenceFlow_14cyk9v</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="SequenceFlow_0jav6cu" sourceRef="PauseForManualTaskRainyDay_Start" targetRef="InitRainyDayManualHandling" />
+    <bpmn2:sequenceFlow id="SequenceFlow_192yimz" sourceRef="ManualUserTask" targetRef="UpdateDbStatusToInProgress" />
+    <bpmn2:userTask id="ManualUserTask" name="Manual User Task">
+      <bpmn2:extensionElements>
+        <camunda:taskListener expression="${ManualHandlingTasks.completeTask(task)}" event="complete" />
+        <camunda:properties>
+          <camunda:property />
+        </camunda:properties>
+        <camunda:taskListener expression="${ManualHandlingTasks.setFalloutTaskVariables(task)}" event="create" />
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>SequenceFlow_0igra4l</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_192yimz</bpmn2:outgoing>
+    </bpmn2:userTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_0b84ki5" sourceRef="UpdateDbStatusToPendingManualTask" targetRef="CreateExternalTicket" />
+    <bpmn2:sequenceFlow id="SequenceFlow_14cyk9v" sourceRef="UpdateDbStatusToInProgress" targetRef="PauseForManualTaskRainyDay_End" />
+    <bpmn2:serviceTask id="UpdateDbStatusToPendingManualTask" name="Update Infra DB Status to PENDING_MANUAL_TASK" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)),&#34;PENDING_MANUAL_TASK&#34;)}">
+      <bpmn2:incoming>SequenceFlow_1idwudp</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0b84ki5</bpmn2:outgoing>
+    </bpmn2:serviceTask>
+    <bpmn2:serviceTask id="UpdateDbStatusToInProgress" name="Update Infra DB Status to IN_PROGRESS" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), &#34;IN_PROGRESS&#34;)}">
+      <bpmn2:incoming>SequenceFlow_192yimz</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_14cyk9v</bpmn2:outgoing>
+    </bpmn2:serviceTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_0igra4l" sourceRef="CreateExternalTicket" targetRef="ManualUserTask" />
+    <bpmn2:boundaryEvent id="ManualTaskTimer" name="Timer" attachedToRef="ManualUserTask">
+      <bpmn2:outgoing>SequenceFlow_01k6zgt</bpmn2:outgoing>
+      <bpmn2:timerEventDefinition>
+        <bpmn2:timeDuration xsi:type="bpmn2:tFormalExpression"><![CDATA[${execution.getVariable("taskTimeout")}]]></bpmn2:timeDuration>
+      </bpmn2:timerEventDefinition>
+    </bpmn2:boundaryEvent>
+    <bpmn2:serviceTask id="CreateExternalTicket" name="Create ExternalTicket" camunda:expression="${ManualHandlingTasks.createExternalTicket(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn2:incoming>SequenceFlow_0b84ki5</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_0igra4l</bpmn2:outgoing>
+    </bpmn2:serviceTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_01k6zgt" sourceRef="ManualTaskTimer" targetRef="UpdateDBStatusToTimeout" />
+    <bpmn2:serviceTask id="UpdateDBStatusToTimeout" name="Update Infra DB Status To TIMEOUT" camunda:expression="${ManualHandlingTasks.updateRequestDbStatus(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)), &#34;TIMEOUT&#34;)}">
+      <bpmn2:incoming>SequenceFlow_01k6zgt</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_16bjdgj</bpmn2:outgoing>
+    </bpmn2:serviceTask>
+    <bpmn2:sequenceFlow id="SequenceFlow_16bjdgj" sourceRef="UpdateDBStatusToTimeout" targetRef="PauseForManualTaskRainyDay_Timeout" />
+    <bpmn2:endEvent id="PauseForManualTaskRainyDay_Timeout">
+      <bpmn2:incoming>SequenceFlow_16bjdgj</bpmn2:incoming>
+    </bpmn2:endEvent>
+    <bpmn2:sequenceFlow id="SequenceFlow_1idwudp" sourceRef="InitRainyDayManualHandling" targetRef="UpdateDbStatusToPendingManualTask" />
+    <bpmn2:serviceTask id="InitRainyDayManualHandling" name="Init Rainy Day Manual Handling" camunda:expression="${ManualHandlingTasks.initRainyDayManualHandling(InjectExecution.execute(execution, execution.getVariable(&#34;gBuildingBlockExecution&#34;)))}">
+      <bpmn2:incoming>SequenceFlow_0jav6cu</bpmn2:incoming>
+      <bpmn2:outgoing>SequenceFlow_1idwudp</bpmn2:outgoing>
+    </bpmn2:serviceTask>
+  </bpmn2:process>
+  <bpmn2:error id="Error_2" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
+  <bpmn2:error id="Error_1" name="java.lang.Exception" errorCode="java.lang.Exception" />
+  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="PauseForManualTaskRainyDay">
+      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_47" bpmnElement="PauseForManualTaskRainyDay_Start">
+        <dc:Bounds x="46" y="79" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="65" y="120" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="_BPMNShape_EndEvent_177" bpmnElement="PauseForManualTaskRainyDay_End">
+        <dc:Bounds x="919" y="79" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="937" y="120" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0jav6cu_di" bpmnElement="SequenceFlow_0jav6cu">
+        <di:waypoint xsi:type="dc:Point" x="82" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="129" y="97" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="106" y="82" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_192yimz_di" bpmnElement="SequenceFlow_192yimz">
+        <di:waypoint xsi:type="dc:Point" x="688" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="740" y="98" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="714" y="82.5" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="UserTask_1krqrz1_di" bpmnElement="ManualUserTask">
+        <dc:Bounds x="588" y="57" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0b84ki5_di" bpmnElement="SequenceFlow_0b84ki5">
+        <di:waypoint xsi:type="dc:Point" x="370" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="432" y="97" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="401" y="82" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_14cyk9v_di" bpmnElement="SequenceFlow_14cyk9v">
+        <di:waypoint xsi:type="dc:Point" x="840" y="98" />
+        <di:waypoint xsi:type="dc:Point" x="919" y="97" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="880" y="82.5" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_0c0yopb_di" bpmnElement="UpdateDbStatusToPendingManualTask">
+        <dc:Bounds x="270" y="57" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_1hc2ewj_di" bpmnElement="UpdateDbStatusToInProgress">
+        <dc:Bounds x="740" y="58" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0igra4l_di" bpmnElement="SequenceFlow_0igra4l">
+        <di:waypoint xsi:type="dc:Point" x="532" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="588" y="97" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="560" y="82" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="BoundaryEvent_1g8ju6a_di" bpmnElement="ManualTaskTimer">
+        <dc:Bounds x="652" y="119" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="692" y="144" width="28" height="12" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ServiceTask_04rimht_di" bpmnElement="CreateExternalTicket">
+        <dc:Bounds x="432" y="57" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_01k6zgt_di" bpmnElement="SequenceFlow_01k6zgt">
+        <di:waypoint xsi:type="dc:Point" x="670" y="137" />
+        <di:waypoint xsi:type="dc:Point" x="670" y="265" />
+        <di:waypoint xsi:type="dc:Point" x="744" y="265" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="685" y="201" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_18sdiiw_di" bpmnElement="UpdateDBStatusToTimeout">
+        <dc:Bounds x="744" y="225" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_16bjdgj_di" bpmnElement="SequenceFlow_16bjdgj">
+        <di:waypoint xsi:type="dc:Point" x="844" y="265" />
+        <di:waypoint xsi:type="dc:Point" x="919" y="265" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="882" y="250" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="EndEvent_172wy7j_di" bpmnElement="PauseForManualTaskRainyDay_Timeout">
+        <dc:Bounds x="919" y="247" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="937" y="283" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1idwudp_di" bpmnElement="SequenceFlow_1idwudp">
+        <di:waypoint xsi:type="dc:Point" x="229" y="97" />
+        <di:waypoint xsi:type="dc:Point" x="270" y="97" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="250" y="82" width="0" height="0" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ServiceTask_06ztv9g_di" bpmnElement="InitRainyDayManualHandling">
+        <dc:Bounds x="129" y="57" width="100" height="80" />
+      </bpmndi:BPMNShape>
+    </bpmndi:BPMNPlane>
+  </bpmndi:BPMNDiagram>
+</bpmn2:definitions>
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 (file)
index 0000000..576f9c4
--- /dev/null
@@ -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");
+    }
+
+}
index eb2d9fa..0a211e6 100644 (file)
@@ -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
index 4b967c7..9697246 100644 (file)
@@ -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 (file)
index 0000000..70d56db
--- /dev/null
@@ -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 (file)
index 0000000..6bfe618
--- /dev/null
@@ -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();
+    }
+
+
+}
index 7e45c3b..d9f5e65 100644 (file)
 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<String, String> 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<String, String> 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<String, Object> 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 (file)
index 0000000..f8ecf01
--- /dev/null
@@ -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();
+    }
+}
index b40195c..b6dcd96 100644 (file)
@@ -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 (file)
index 6c8f488..0000000
+++ /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 (file)
index 2737342..0000000
+++ /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 (file)
index 15cfc92..0000000
+++ /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 (file)
index 708b916..0000000
+++ /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 (file)
index 10402d9..0000000
+++ /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<String> getHost() {
-        return Optional.ofNullable(msoProperties.get("ruby.create-ticket-request.publisher.host"));
-    }
-
-}
-
-
index 9e8a018..01bdc4d 100644 (file)
@@ -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 (file)
index 1ca8942..0000000
+++ /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 (file)
index ca80930..0000000
+++ /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 (file)
index e388d3e..0000000
+++ /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"
-       }
-}
-}
-
index 7e4452a..34eca2f 100644 (file)
@@ -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);
index b8d1e56..fcf25b2 100644 (file)
@@ -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 {
index 686faf1..ef7acdc 100644 (file)
@@ -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