/** * @param Entity\Orchestration $orchestration * @return null|array * @throws ClientException * @throws \Exception */ private function findConfiguration(Entity\Orchestration $orchestration) { // new ID format try { $configuration = $this->components->getConfiguration(KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, $orchestration->getId()); return $configuration['configuration']; } catch (ClientException $e) { if ($e->getCode() !== 404) { throw $e; } } return null; }
public function testConfigId() { $token1 = $this->createNewToken($this->storageApi, 'manage'); $orchestrationId = $this->createOrchestrationTest($token1); $jobId = $this->runOrchestrationTest($orchestrationId); $job = $this->syrupJobMapper->get($jobId); $params = $job->getRawParams(); $this->assertArrayHasKey('config', $params); $this->assertEquals($orchestrationId, $params['config']); $components = new Components($this->storageApi); $configuration = $components->getConfiguration(KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, $orchestrationId); $this->assertArrayHasKey('name', $configuration); $this->assertArrayHasKey('id', $configuration); }
/** * Save tasks to configuration * * @param $id orchestration ID */ private function putOrchestrationTaskTest($id) { $url = '/orchestrator/orchestrations/' . $id . '/tasks'; $errorMessage = sprintf("Response for call '%s %s' should return two created tasks.", 'PUT', $url); $actionParams = array('fake' => 1); $data = array(array("some-extra-field" => "dummy value", "component" => "ex-google-drive", "action" => "run", "active" => true), array("some-extra-field" => "dummy value", "componentUrl" => "https://syrup.keboola.com/ex-google-drive/run", "actionParameters" => $actionParams, "active" => false)); $response = $this->callApiPut($url, $data); $this->assertCount(2, $response, $errorMessage); $this->assertArrayNotHasKey('some-extra-field', $response[0], $errorMessage); $this->assertArrayHasKey('actionParameters', $response[0], $errorMessage); $this->assertArrayHasKey('action', $response[0], $errorMessage); $this->assertArrayHasKey('component', $response[0], $errorMessage); $this->assertArrayNotHasKey('componentUrl', $response[0], $errorMessage); $this->assertEquals($data[0]['component'], $response[0]['component'], $errorMessage); $this->assertEquals($data[0]['action'], $response[0]['action'], $errorMessage); $this->assertArrayHasKey('actionParameters', $response[1], $errorMessage); $this->assertArrayNotHasKey('action', $response[1], $errorMessage); $this->assertArrayHasKey('componentUrl', $response[1], $errorMessage); $this->assertArrayNotHasKey('component', $response[1], $errorMessage); $this->assertEquals($actionParams, $response[1]['actionParameters'], $errorMessage); $this->assertEquals($data[1]['componentUrl'], $response[1]['componentUrl'], $errorMessage); $this->assertEquals($data[1]['active'], $response[1]['active'], $errorMessage); // Validation of tasks copy in sapi configuration $orchestration = new Orchestration(); $orchestration->fromArray(array('id' => $id)); $components = new Components($this->storageApi); $configuration = $components->getConfiguration(KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, $orchestration->getId()); $this->assertArrayHasKey('configuration', $configuration); $this->assertArrayHasKey('tasks', $configuration['configuration']); $configurationTasks = $configuration['configuration']['tasks']; $this->assertCount(2, $configurationTasks); $this->assertArrayHasKey('actionParameters', $configurationTasks[0]); $this->assertArrayHasKey('action', $configurationTasks[0]); $this->assertArrayHasKey('componentUrl', $configurationTasks[0]); $this->assertArrayHasKey('component', $configurationTasks[0]); $this->assertEmpty($configurationTasks[0]['actionParameters']); $this->assertEquals($data[0]['action'], $configurationTasks[0]['action']); $this->assertEquals($data[0]['component'], $configurationTasks[0]['component']); $this->assertEquals($data[0]['active'], $configurationTasks[0]['active']); $this->assertEmpty($configurationTasks[0]['componentUrl']); $this->assertArrayHasKey('actionParameters', $configurationTasks[1]); $this->assertArrayHasKey('action', $configurationTasks[1]); $this->assertArrayHasKey('componentUrl', $configurationTasks[1]); $this->assertArrayHasKey('component', $configurationTasks[1]); $this->assertEquals($actionParams, $configurationTasks[1]['actionParameters']); $this->assertEquals($data[1]['componentUrl'], $configurationTasks[1]['componentUrl']); $this->assertEquals($data[1]['active'], $configurationTasks[1]['active']); $this->assertEmpty($configurationTasks[1]['action']); $this->assertEmpty($configurationTasks[1]['component']); }
protected function execute(InputInterface $input, OutputInterface $output) { parent::execute($input, $output); $this->dbOrchestrationManager = $this->getContainer()->get('orchestrator.doctrine.orchestration_manager'); $skippedCount = 0; $successCount = 0; $errorCount = 0; $force = $input->getOption('force'); $projectId = $input->getArgument('projectId'); $this->logger->info('configuration-migration.start ' . $projectId, array('test' => $force ? true : false)); foreach ($this->loadProjectOrchestrations($projectId) as $orchestration) { try { $jobClient = $this->createProjectSapi($orchestration); $token = new StorageApi\Token($jobClient); if ($token->hasEnabledFeature(StorageApi\Token::ORCHESTRATOR_NEW_CONFIGURATION)) { throw new DisabledException('Migration skipped: new configuration already enabled'); } } catch (DisabledException $e) { $message = $e->getMessage(); if ($e->getPrevious()) { $message = sprintf('%s: %s', $message, $e->getMessage()); } $output->writeln(sprintf('<error>' . $message . '</error>')); $this->logger->info('configuration-migration.failed ' . $projectId, array('test' => $force ? true : false, 'reason' => $message)); $output->writeln(sprintf('<error>Finished with errors</error>')); return JobCommand::STATUS_ERROR; } $orchestration = $this->dbOrchestrationManager->findOrchestrationById($orchestration->getId(), $token, true); $components = new Components($jobClient); // remove old configuration $oldConfiguration = null; try { $oldConfiguration = $components->getConfiguration(KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, sprintf("%s-%s", KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, $orchestration->getId())); } catch (ClientException $e) { if ($e->getCode() !== 404) { throw $e; } } if ($force) { // create or update configuration $orchestrationTaskManager = new StorageApi\OrchestrationTaskManager($jobClient); $orchestrationTaskManager->updateTasks($orchestration); // validate configuration try { $this->validateConfiguration($orchestration, $jobClient); $output->writeln(sprintf('<info>(%s) %s - Migrated</info>', $orchestration->getId(), $orchestration->getName())); if ($oldConfiguration) { $components->deleteConfiguration(KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME, $oldConfiguration['id']); $output->writeln(sprintf('<comment>(%s) - Old configuration deleted</comment>', $oldConfiguration['id'])); } $successCount++; } catch (StorageApi\InvalidStateException $e) { $output->writeln(sprintf('<error>' . $e->getMessage() . '</error>')); $errorCount++; } } else { $output->writeln(sprintf('<comment>(%s) %s - Will be migrated</comment>', $orchestration->getId(), $orchestration->getName())); if ($oldConfiguration) { $output->writeln(sprintf('<comment>(%s) - Old configuration will be deleted</comment>', $oldConfiguration['id'])); } $skippedCount++; } } if ($errorCount) { $output->writeln(sprintf('<error>Finished with errors</error>')); } else { $output->writeln(sprintf('<info>Finished</info>')); } $this->logger->info('configuration-migration.migrated ' . $projectId, array('test' => $force ? true : false, 'successCount' => $successCount, 'errorCount' => $errorCount, 'skippedCount' => $skippedCount)); if ($errorCount) { return JobCommand::STATUS_ERROR; } }