/** * Setup executor properties and validate job * * @param SyrupJob $job */ public final function build(SyrupJob $job) { $this->validateJob($job); $this->job = new Job(); $this->job->build($job); $this->jobResult = new JobResult($this->job); $this->stopwatch->start(self::STOPWATCH_ORCHESTRATION_EVENT); //@TODO new feature - better handling with sapi errors - send errorNotification try { $this->token = new StorageApi\Token($this->storageApi); } catch (StorageApiException $e) { throw new UserException(sprintf("Invalid token for job %d", $this->job->getId()), $e); } $this->jobEsManager = $this->jobManagerFactory->createJobManager($this->token); $this->componentsList = new KbcComponentsList($this->storageApi); $orchestration = $this->orchestrationManager->findOrchestrationById($this->job->getOrchestrationId(), $this->token); if (!$orchestration) { throw new UserException(sprintf("Orchestration %s not found", $this->job->getOrchestrationId())); } else { $this->orchestration = $orchestration; } $this->orchestrationManager->updateLastExecutedJob($this->orchestration, $this->job); // validation for empty orchestrations $hasActiveTasks = false; if ($this->job->getTasks()) { foreach ($this->job->getTasks() as $task) { if (!empty($task->active)) { $hasActiveTasks = true; } } } if ($hasActiveTasks === false) { throw new UserException(self::ERROR_NO_TASK); } }
/** * Check if job is using task phases * * @param Job $job * @return bool */ private function usePhases(Job $job) { $usePhases = false; if (is_array($job->getTasks())) { foreach ($job->getTasks() as $task) { if (!empty($task->phase)) { $usePhases = true; } } } return $usePhases; }
/** * @param Job $job * @param StorageApi\UniqueManager $uniqueGenerator * @return Elasticsearch\Job */ private function buildEsJob(Job $job, StorageApi\UniqueManager $uniqueGenerator) { //@FIXME replace with jobfactory https://github.com/keboola/syrup/wiki/Upgrade $jobId = $uniqueGenerator->generateId(); $runId = $uniqueGenerator->generateRunId($uniqueGenerator->getRunId()); $job->setId($jobId); $job->setRunId($runId); return new Elasticsearch\Job($this->objectEncryptor, ['id' => $jobId, 'lockName' => KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME . '-' . $job->getProjectId() . '-' . $job->getOrchestrationId(), 'runId' => $runId, 'nestingLevel' => 0, 'project' => ['id' => $job->getProjectId(), 'name' => $job->getTokenOwnerName()], 'token' => ['id' => $job->getTokenId(), 'description' => $job->getTokenDesc(), 'token' => $this->encryptToken($job->getToken())], 'component' => KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, 'command' => 'run', 'params' => array('config' => $job->getConfig(), 'orchestration' => array('id' => $job->getOrchestrationId(), 'name' => $job->getOrchestrationName()), 'initializedBy' => $job->getInitializedBy(), 'initiator' => array('id' => $job->getInitiatorTokenId(), 'description' => $job->getInitiatorTokenDesc(), 'userAgent' => $job->getInitiatorUserAgent()), 'notificationsEmails' => $job->getNotificationsEmails(), 'tasks' => $job->getTasks()), 'process' => ['host' => gethostname(), 'pid' => posix_getpid()], 'createdTime' => $job->getCreatedTime()->format('c')]); }
/** * @param Job $job * @return Phase[] */ private function createPhases(Job $job) { /** @var StorageApi\OrchestrationTask[] $orchestrationTasks */ $orchestrationTasks = array(); if ($job->getTasks()) { $orchestrationTasks = array_map(function ($line) { $task = new StorageApi\OrchestrationTask(); $task->fromArray(json_decode(json_encode($line), true)); return $task; }, $job->getTasks()); } /** * @var Phase[] $phases */ $phases = array(); $prevPhase = false; foreach ($orchestrationTasks as $orchestrationTask) { if ($orchestrationTask->getPhase() !== $prevPhase || $orchestrationTask->getPhase() == null) { $phase = new Phase($job); $phases[count($phases)] = $phase; $this->jobResult->addPhase($phase); } $taskResult = new TaskResult($orchestrationTask); $this->jobResult->addTaskResult($taskResult); $phases[count($phases) - 1]->addTaskResult($taskResult); $prevPhase = $orchestrationTask->getPhase(); } return $phases; }