public function apply(WorkflowHistory $history)
 {
     $item = $this->getHistoryItem($history, $this->getAttribute('scheduledEventId'));
     $item->setTimeEnded($this->timestamp);
     $item->setResult($this->getAttribute('result'));
     $item->setState(HistoryItemState::COMPLETED());
     $history->add($item);
 }
Esempio n. 2
0
 public function testCounts()
 {
     $history = new WorkflowHistory();
     $history->add($this->createHistoryItem('test-activity', '1', HistoryItemState::COMPLETED(), 'alpha'));
     $history->add($this->createHistoryItem('test-activity', '1', HistoryItemState::COMPLETED(), 'bravo'));
     $history->add($this->createHistoryItem('test-activity', '2', HistoryItemState::COMPLETED(), 'charlie'));
     $history->add($this->createHistoryItem('test-activity', '1', HistoryItemState::SCHEDULED(), 'delta'));
     $history->add($this->createHistoryItem('other-activity', '1', HistoryItemState::COMPLETED(), 'echo'));
     $history->add($this->createHistoryItem('other-activity', '1', HistoryItemState::RUNNING(), 'foxtrot'));
     $inspector = new HistoryInspector($history);
     $schema_test = TaskSchema::fromKey('test-activity/1');
     $schema_other = TaskSchema::fromKey('other-activity/1');
     $this->assertEquals(0, $inspector->countTask($schema_test, HistoryItemState::RUNNING()));
     $this->assertEquals(0, $inspector->countTask($schema_test, HistoryItemState::FAILED()));
     $this->assertEquals(2, $inspector->countTask($schema_test, HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countTask($schema_test, HistoryItemState::SCHEDULED()));
     $this->assertEquals(1, $inspector->countTask($schema_other, HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countTask($schema_other, HistoryItemState::RUNNING()));
     $this->assertEquals(0, $inspector->countTask($schema_other, HistoryItemState::SCHEDULED()));
     $this->assertEquals(0, $inspector->countTask($schema_other, HistoryItemState::FAILED()));
     $this->assertEquals(1, $inspector->countControl('alpha', HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countControl('bravo', HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countControl('charlie', HistoryItemState::COMPLETED()));
     $this->assertEquals(0, $inspector->countControl('delta', HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countControl('echo', HistoryItemState::COMPLETED()));
     $this->assertEquals(0, $inspector->countControl('foxtrot', HistoryItemState::COMPLETED()));
     $this->assertTrue($inspector->haveOpenActivities());
     $alpha = new TaskSchema();
     $alpha->setActivityName('test-activity')->setActivityVersion('1')->setControl('alpha');
     $this->assertEquals(2, $inspector->countTask($alpha, HistoryItemState::COMPLETED()));
     $this->assertEquals(1, $inspector->countTask($alpha, HistoryItemState::SCHEDULED()));
     $omega = new TaskSchema();
     $omega->setActivityName('test-activity')->setActivityVersion('10');
     $this->assertEquals(0, $inspector->countTask($omega, HistoryItemState::COMPLETED()));
     $this->assertTrue($inspector->hasTaskBeenScheduled($alpha));
     $this->assertFalse($inspector->hasTaskBeenScheduled($omega));
 }
Esempio n. 3
0
 /**
  * Process the decision event, generating a decision response (included in the DecisionEvent)
  *
  * @param DecisionEvent $event
  */
 public function processDecisionEvent(DecisionEvent $event)
 {
     $history = $event->getHistory();
     $decision = $event->getDecision();
     $tasks = $this->getWorkflow()->getTasks();
     // Create a memory pool jailed to this execution
     $memory_pool = $this->getWorkflow()->getJailMemoryPool() ? JailedMemoryPool::jail($this->getMemoryPool(), ':' . $event->getExecutionId()) : $this->getMemoryPool();
     // Check if we need to execute any task events
     /** @var WorkflowHistoryItem $history_item */
     foreach ($history as $history_item) {
         $id = $history_item->getEventId();
         if ($history_item->getState() == HistoryItemState::COMPLETED()) {
             if ($memory_pool->get('history:' . $id . ':completed') === null) {
                 $this->runTaskDecider($history_item, $decision, $memory_pool);
                 $memory_pool->set('history:' . $id . ':completed', 1);
             }
         }
     }
     // Check if we need to fail
     if ($this->getFailOnActivityFailure() && $history->hasActivityFailure() || $history->hasWorkflowFailed()) {
         $decision->setWorkflowResult(WorkflowResult::FAIL());
         $decision->setReason(implode(", ", $history->getErrorMessages()));
         return;
     }
     // Check if we need to schedule
     $parser = new InputParser($history, $memory_pool);
     $scheduler = new Scheduler($history, $memory_pool);
     foreach ($tasks as $task) {
         if ($scheduler->canScheduleTask($task)) {
             $decision->scheduledTask($parser->compileTaskInput($task));
         }
     }
     // Check if we need to complete
     if (count($decision->getScheduledTasks()) == 0 && !$scheduler->haveOpenActivities()) {
         $decision->setWorkflowResult(WorkflowResult::COMPLETE());
     }
 }
Esempio n. 4
0
 /**
  * Check if this history item completed successfully
  *
  * @return bool
  */
 public function isSuccess()
 {
     return $this->state == HistoryItemState::COMPLETED();
 }
Esempio n. 5
0
 public function testSampleWorkflow()
 {
     Conf::init(__DIR__ . '/../../../../config/');
     $memory_pool = new RedisMemoryPool('decider-tests-' . time(), 60, Conf::get('redis'));
     $decider = new Decider();
     $decider->setWorkflow(new YamlWorkflow(__DIR__ . '/../Resources/TestSchema.yml'));
     $decider->setMemoryPool($memory_pool)->setAuxPayload('payload');
     $this->assertTrue($decider->getWorkflow()->getJailMemoryPool());
     $execution_id = 'test-execution';
     // Workflow started -
     $event1 = new DecisionEvent();
     $event1->setExecutionId($execution_id);
     $decider->processDecisionEvent($event1);
     $this->assertCount(1, $event1->getDecision()->getScheduledTasks());
     $this->assertEquals(WorkflowResult::COMMAND(), $event1->getDecision()->getWorkflowResult());
     $task = $event1->getDecision()->getScheduledTasks()[0];
     $this->assertEquals('alpha', $task->getControl());
     $this->assertEquals('alpha', $task->getActivityName());
     $this->assertEquals('1', $task->getActivityVersion());
     // Task 1 complete -
     $alpha = new WorkflowHistoryItem('1');
     $alpha->setActivityName('alpha')->setActivityVersion('1');
     $alpha->setTimeScheduled(new \DateTime('2014-10-10 10:01:00'));
     $alpha->setTimeStarted(new \DateTime('2014-10-10 10:00:00'));
     $alpha->setTimeEnded(new \DateTime('2014-10-10 10:04:00'));
     $alpha->setState(HistoryItemState::COMPLETED());
     $alpha->setControl('alpha')->setInput('alpha')->setResult("Hello World");
     $event2 = new DecisionEvent();
     $event2->setExecutionId($execution_id);
     $event2->getHistory()->add($alpha);
     $decider->processDecisionEvent($event2);
     $this->assertCount(2, $event2->getDecision()->getScheduledTasks());
     $this->assertEquals(WorkflowResult::COMMAND(), $event2->getDecision()->getWorkflowResult());
     $task = $event2->getDecision()->getScheduledTasks()[0];
     $this->assertEquals('bravo', $task->getControl());
     // Task 2 complete -
     $bravo = new WorkflowHistoryItem('2');
     $bravo->setActivityName('bravo')->setActivityVersion('1');
     $bravo->setTimeScheduled(new \DateTime('2014-11-10 10:01:00'));
     $bravo->setTimeStarted(new \DateTime('2014-11-10 10:00:00'));
     $bravo->setTimeEnded(new \DateTime('2014-11-10 10:04:00'));
     $bravo->setState(HistoryItemState::COMPLETED());
     $bravo->setControl('bravo')->setInput('bravo')->setResult("Hello World");
     $memory_pool->set(":test-execution:alpha", 1);
     $memory_pool->set(":test-execution:bravo", 2);
     $event3 = new DecisionEvent();
     $event3->setExecutionId($execution_id);
     $event3->getHistory()->add($alpha);
     $event3->getHistory()->add($bravo);
     $decider->processDecisionEvent($event3);
     $this->assertCount(1, $event3->getDecision()->getScheduledTasks());
     $this->assertEquals(WorkflowResult::COMMAND(), $event3->getDecision()->getWorkflowResult());
     $task = $event3->getDecision()->getScheduledTasks()[0];
     $this->assertEquals('charlie', $task->getControl());
     // Task 3 complete -
     $charlie = new WorkflowHistoryItem('3');
     $charlie->setActivityName('charlie')->setActivityVersion('1');
     $charlie->setTimeScheduled(new \DateTime('2014-11-10 10:01:00'));
     $charlie->setTimeStarted(new \DateTime('2014-11-10 10:00:00'));
     $charlie->setTimeEnded(new \DateTime('2014-11-10 10:04:00'));
     $charlie->setState(HistoryItemState::COMPLETED());
     $charlie->setControl('charlie')->setInput('charlie')->setResult("Hello World");
     $event4 = new DecisionEvent();
     $event4->setExecutionId($execution_id);
     $event4->getHistory()->add($alpha);
     $event4->getHistory()->add($bravo);
     $event4->getHistory()->add($charlie);
     $decider->processDecisionEvent($event4);
     $this->assertCount(0, $event4->getDecision()->getScheduledTasks());
     $this->assertEquals(WorkflowResult::COMPLETE(), $event4->getDecision()->getWorkflowResult());
 }
Esempio n. 6
0
 /**
  * Check if we meet all reason requirements
  *
  * @param array $requirements
  * @return bool
  */
 protected function meetsControlRequirements(array $requirements)
 {
     foreach ($requirements as $control => $count) {
         if ($this->history_inspector->countControl($control, HistoryItemState::COMPLETED()) != $count) {
             return false;
         }
     }
     return true;
 }