/** * @covers \Keboola\Syrup\Job\Metadata\JobFactory::create * @covers \Keboola\Syrup\Job\Metadata\JobFactory::setStorageApiClient */ public function testJobFactory() { $storageApiClient = new Client(['token' => SYRUP_SAPI_TEST_TOKEN, 'userAgent' => SYRUP_APP_NAME]); $key = md5(uniqid()); $encryptor = new Encryptor($key); /** @var ObjectEncryptor $configEncryptor */ $configEncryptor = self::$kernel->getContainer()->get('syrup.object_encryptor'); $jobFactory = new JobFactory(SYRUP_APP_NAME, $encryptor, $configEncryptor); $jobFactory->setStorageApiClient($storageApiClient); $command = uniqid(); $param = uniqid(); $lock = uniqid(); $tokenData = $storageApiClient->verifyToken(); $job = $jobFactory->create($command, ['param' => $param], $lock); $this->assertEquals($command, $job->getCommand()); $this->assertEquals($lock, $job->getLockName()); $this->assertEquals(['param' => $param], $job->getParams()); $this->assertArrayHasKey('id', $job->getProject()); $this->assertEquals($tokenData['owner']['id'], $job->getProject()['id']); $this->assertArrayHasKey('name', $job->getProject()); $this->assertEquals($tokenData['owner']['name'], $job->getProject()['name']); $this->assertArrayHasKey('id', $job->getToken()); $this->assertEquals($tokenData['id'], $job->getToken()['id']); $this->assertArrayHasKey('description', $job->getToken()); $this->assertEquals($tokenData['description'], $job->getToken()['description']); $this->assertArrayHasKey('token', $job->getToken()); $this->assertEquals($tokenData['token'], $encryptor->decrypt($job->getToken()['token'])); }
/** * @param $value * @return string * @throws \InvalidCiphertextException */ protected function decryptValue($value) { $wrapper = $this->findWrapper($value); if (!$wrapper) { if ($this->legacyEncryptor) { /* @ is intentional to suppress warnings from invalid cipher texts which are handled by checking return === false */ $ret = @$this->legacyEncryptor->decrypt($value); if ($ret === false) { throw new \InvalidCiphertextException("Value is not an encrypted value."); } else { return $ret; } } else { throw new \InvalidCiphertextException("Value is not an encrypted value."); } } try { return $wrapper->decrypt(substr($value, mb_strlen($wrapper->getPrefix()))); } catch (\InvalidCiphertextException $e) { throw new \InvalidCiphertextException("Value {$value} is not an encrypted value."); } catch (\Exception $e) { // decryption failed for more serious reasons throw new ApplicationException("Decryption failed: " . $e->getMessage(), $e, ["value" => $value]); } }
public function create($command, array $params = [], $lockName = null) { if (!$this->storageApiClient) { throw new \Exception('Storage API client must be set'); } $tokenData = $this->storageApiClient->verifyToken(); $job = new Job($this->configEncryptor, ['id' => $this->storageApiClient->generateId(), 'runId' => $this->storageApiClient->generateRunId($this->storageApiClient->getRunId()), 'project' => ['id' => $tokenData['owner']['id'], 'name' => $tokenData['owner']['name']], 'token' => ['id' => $tokenData['id'], 'description' => $tokenData['description'], 'token' => $this->encryptor->encrypt($this->storageApiClient->getTokenString())], 'component' => $this->componentName, 'command' => $command, 'params' => $params, 'process' => ['host' => gethostname(), 'pid' => getmypid()], 'nestingLevel' => 0, 'createdTime' => date('c')], null, null, null); if ($lockName) { $job->setLockName($lockName); } $componentConfiguration = $this->getComponentConfiguration(); if (isset($componentConfiguration['flags']) && in_array('encrypt', $componentConfiguration['flags'])) { $job->setEncrypted(true); } return $job; }
/** * @param $token * @return string */ private function encryptToken($token) { if (empty($token)) { return $token; } if (preg_match(Token::TOKEN_REGEXP, $token)) { return $this->encryptor->encrypt($token); } else { return $token; } }
public function testRunExternal() { $processedFiles = $this->storageApiClient->listFiles((new ListFilesOptions())->setTags(['wr-google-drive-processed'])); foreach ($processedFiles as $f) { $this->storageApiClient->deleteFileTag($f['id'], 'wr-google-drive-processed'); } $job = $this->processJob($this->componentName . '/run', ['external' => ['account' => ['email' => $this->email, 'accessToken' => $this->encryptor->encrypt($this->accessToken), 'refreshToken' => $this->encryptor->encrypt($this->refreshToken)], 'query' => '+tags:tde', 'targetFolder' => '0B8ceg4OWLR3ld0czTWxfd3RmQnc']]); $this->assertEquals('success', $job->getStatus()); // test if external account was deleted $accounts = $this->configuration->getAccounts(); /** @var Account $account */ foreach ($accounts as $account) { $this->assertNotContains('external', $account->getAccountId()); } }
/** * @param Metadata\Job $job * @return Client */ private function createJobSapiClient(Metadata\Job $job) { return new Client(array('token' => $this->encryptor->decrypt($job->getToken()['token']), 'url' => $this->getConfiguration()->getStorageApiUrl())); }
public function getJobStatus($url, Elasticsearch\Job $job, Encryptor $encryptor) { $timeout = 2; return $this->get($url, array('config' => array('curl' => array(CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0)), 'headers' => array('X-StorageApi-Token' => $encryptor->decrypt($job->getToken()), 'X-KBC-RunId' => $job->getRunId(), 'X-User-Agent', KeboolaOrchestratorBundle::SYRUP_COMPONENT_NAME . " - JobExecutor"), 'timeout' => 60 * $timeout)); // handling curl errors // $request->getEmitter()->on('error', function (ErrorEvent $e) use ($timeout) { // $curlError = $e->getTransferInfo('curl_result'); // if ($curlError == 28) { // throw new Exception\JobRuntimeException(sprintf('Task polling timeout after %d minutes', $timeout)); // } // }); }