diff --git a/app/config/providers.php b/app/config/providers.php index c4f4f90fa7..83ad923a2a 100644 --- a/app/config/providers.php +++ b/app/config/providers.php @@ -273,7 +273,7 @@ return [ // Ordered by ABC. ], 'yammer' => [ 'name' => 'Yammer', - 'developers' => 'https://developer.yammer.com/docs/oauth-2', + 'developers' => 'https://docs.microsoft.com/en-us/rest/api/yammer/oauth-2/', 'icon' => 'icon-yammer', 'enabled' => true, 'sandbox' => false, diff --git a/app/executor.php b/app/executor.php index 73fddc9680..7bf42c98db 100644 --- a/app/executor.php +++ b/app/executor.php @@ -177,6 +177,10 @@ App::post('/v1/runtimes') ->inject('response') ->action(function (string $runtimeId, string $source, string $destination, array $vars, array $commands, string $runtime, string $baseImage, string $entrypoint, bool $remove, string $workdir, $orchestrationPool, $activeRuntimes, Response $response) { if ($activeRuntimes->exists($runtimeId)) { + if ($activeRuntimes->get($runtimeId)['status'] == 'pending') { + throw new \Exception('A runtime with the same ID is already being created. Attempt a execution soon.', 500); + } + throw new Exception('Runtime already exists.', 409); } @@ -188,6 +192,19 @@ App::post('/v1/runtimes') $endTime = 0; $orchestration = $orchestrationPool->get(); + $secret = \bin2hex(\random_bytes(16)); + + if (!$remove) { + $activeRuntimes->set($runtimeId, [ + 'id' => $containerId, + 'name' => $runtimeId, + 'created' => $startTime, + 'updated' => $endTime, + 'status' => 'pending', + 'key' => $secret, + ]); + } + try { Console::info('Building container : ' . $runtimeId); @@ -219,7 +236,6 @@ App::post('/v1/runtimes') /** * Create container */ - $secret = \bin2hex(\random_bytes(16)); $vars = \array_merge($vars, [ 'INTERNAL_RUNTIME_KEY' => $secret, 'INTERNAL_RUNTIME_ENTRYPOINT' => $entrypoint, @@ -327,6 +343,7 @@ App::post('/v1/runtimes') Console::success('Build Stage completed in ' . ($endTime - $startTime) . ' seconds'); } catch (Throwable $th) { Console::error('Build failed: ' . $th->getMessage() . $stdout); + throw new Exception($th->getMessage() . $stdout, 500); } finally { // Container cleanup @@ -334,11 +351,13 @@ App::post('/v1/runtimes') if (!empty($containerId)) { // If container properly created $orchestration->remove($containerId, true); + $activeRuntimes->del($runtimeId); } else { // If whole creation failed, but container might have been initialized try { // Try to remove with contaier name instead of ID $orchestration->remove($runtimeId, true); + $activeRuntimes->del($runtimeId); } catch (Throwable $th) { // If fails, means initialization also failed. // Contianer is not there, no need to remove @@ -440,11 +459,23 @@ App::post('/v1/execution') ->inject('response') ->action( function (string $runtimeId, array $vars, string $data, $timeout, $activeRuntimes, Response $response) { - if (!$activeRuntimes->exists($runtimeId)) { throw new Exception('Runtime not found. Please create the runtime.', 404); } + for ($i = 0; $i < 5; $i++) { + if ($activeRuntimes->get($runtimeId)['status'] === 'pending') { + Console::info('Waiting for runtime to be ready...'); + sleep(1); + } else { + break; + } + + if ($i === 4) { + throw new Exception('Runtime failed to launch in allocated time.', 500); + } + } + $runtime = $activeRuntimes->get($runtimeId); $secret = $runtime['key']; if (empty($secret)) {