1
0
Fork 0
mirror of synced 2024-06-27 02:31:04 +12:00

Change exitCode to statusCode and move build to tag create

Change exitCode to statusCode and move build to tag create instead of tag deploy
This commit is contained in:
Bradley Schofield 2021-12-10 10:43:56 +00:00
parent 37da3c5651
commit 3c26a08202
7 changed files with 59 additions and 42 deletions

View file

@ -2255,7 +2255,7 @@ $collections = [
'filters' => [],
],
[
'$id' => 'exitCode',
'$id' => 'statusCode',
'type' => Database::VAR_INTEGER,
'format' => '',
'size' => 0,

View file

@ -858,7 +858,7 @@ App::post('/v1/functions/:functionId/executions')
'tagId' => $tag->getId(),
'trigger' => 'http', // http / schedule / event
'status' => 'waiting', // waiting / processing / completed / failed
'exitCode' => 0,
'statusCode' => 0,
'stdout' => '',
'stderr' => '',
'time' => 0.0,

View file

@ -665,6 +665,10 @@ function createRuntimeServer(string $functionId, string $projectId, string $tagI
return $database->getDocument('tags', $tagId);
});
if ($tag->getAttribute('buildId') === null) {
throw new Exception('Tag has no buildId');
}
// Grab Build Document
$build = Authorization::skip(function () use ($database, $tag) {
return $database->getDocument('builds', $tag->getAttribute('buildId'));
@ -856,7 +860,7 @@ function execute(string $trigger, string $projectId, string $executionId, string
'tagId' => $tag->getId(),
'trigger' => $trigger, // http / schedule / event
'status' => 'processing', // waiting / processing / completed / failed
'exitCode' => 0,
'statusCode' => 0,
'stdout' => '',
'stderr' => '',
'time' => 0.0,
@ -873,7 +877,7 @@ function execute(string $trigger, string $projectId, string $executionId, string
Console::error('Execution Failed. Reason: Code was still being built.');
$execution->setAttribute('status', 'failed')
->setAttribute('exitCode', 1)
->setAttribute('statusCode', 500)
->setAttribute('stderr', 'Tag is still being built.')
->setAttribute('time', 0);
@ -951,7 +955,7 @@ function execute(string $trigger, string $projectId, string $executionId, string
} catch (Exception $e) {
Console::error('Something went wrong building the code. ' . $e->getMessage());
$execution->setAttribute('status', 'failed')
->setAttribute('exitCode', 1)
->setAttribute('statusCode', 500)
->setAttribute('stderr', \utf8_encode(\mb_substr($e->getMessage(), -4000))) // log last 4000 chars output
->setAttribute('time', 0);
@ -972,7 +976,7 @@ function execute(string $trigger, string $projectId, string $executionId, string
Console::error('Something went wrong building the runtime server. ' . $e->getMessage());
$execution->setAttribute('status', 'failed')
->setAttribute('exitCode', 1)
->setAttribute('statusCode', 500)
->setAttribute('stderr', \utf8_encode(\mb_substr($e->getMessage(), -4000))) // log last 4000 chars output
->setAttribute('time', 0);
@ -1012,8 +1016,7 @@ function execute(string $trigger, string $projectId, string $executionId, string
$executionStart = \microtime(true);
$exitCode = 0;
$statusCode = 200;
$statusCode = 0;
$errNo = -1;
$attempts = 0;
@ -1067,12 +1070,12 @@ function execute(string $trigger, string $projectId, string $executionId, string
if ($attempts >= 5) {
$stderr = 'Failed to connect to executor runtime after 5 attempts.';
$exitCode = 124;
$statusCode = 124;
}
// If timeout error
if ($errNo == CURLE_OPERATION_TIMEDOUT || $errNo == 110) {
$exitCode = 124;
$statusCode = 124;
}
// 110 is the Swoole error code for timeout, see: https://www.swoole.co.uk/docs/swoole-error-code
@ -1081,29 +1084,43 @@ function execute(string $trigger, string $projectId, string $executionId, string
throw new Exception('Curl error: ' . $error, 500);
}
$executionData = [];
if (!empty($executorResponse)) {
$executionData = json_decode($executorResponse, true);
}
if (isset($executionData['code'])) {
$exitCode = $executionData['code'];
$statusCode = $executionData['code'];
}
if ($exitCode === 500) {
$stderr = $executionData['message'];
} else if ($exitCode === 0) {
if ($statusCode === 500) {
if (isset($executionData['message'])) {
$stderr = $executionData['message'];
} else {
$stderr = 'Internal Runtime error';
}
} else if ($statusCode === 124) {
$stderr = 'Execution timed out.';
} else if ($statusCode === 0) {
$stderr = 'Execution failed.';
} else if ($statusCode >= 200 && $statusCode < 300) {
$stdout = $executorResponse;
} else {
$stderr = 'Execution failed.';
}
$executionEnd = \microtime(true);
$executionTime = ($executionEnd - $executionStart);
$functionStatus = ($exitCode === 0) ? 'completed' : 'failed';
$functionStatus = ($statusCode >= 200 && $statusCode < 300) ? 'completed' : 'failed';
var_dump($statusCode);
Console::info('Function executed in ' . ($executionEnd - $executionStart) . ' seconds, status: ' . $functionStatus);
$execution->setAttribute('tagId', $tag->getId())
->setAttribute('status', $functionStatus)
->setAttribute('exitCode', $exitCode)
->setAttribute('statusCode', $statusCode)
->setAttribute('stdout', \utf8_encode(\mb_substr($stdout, -8000)))
->setAttribute('stderr', \utf8_encode(\mb_substr($stderr, -8000)))
->setAttribute('time', $executionTime);
@ -1341,7 +1358,7 @@ function handleShutdown()
// Mark all processing executions as failed
foreach ($executions as $execution) {
$execution->setAttribute('status', 'failed')
->setAttribute('exitCode', 1)
->setAttribute('statusCode', 1)
->setAttribute('stderr', 'Appwrite was shutdown during execution');
Authorization::skip(function () use ($database, $execution) {

View file

@ -371,7 +371,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled', true);
</td>
<td data-title="Status: ">
<span data-ls-bind="{{execution.status}}"></span>
<span class="text-fade text-size-small" data-ls-if="{{execution.exitCode}} !== 0" data-ls-bind=" exit code: {{execution.exitCode}}"></span>
<span class="text-fade text-size-small" data-ls-if="{{execution.statusCode}} < 200 && {{execution.statusCode}} >= 300" data-ls-bind=" exit code: {{execution.statusCode}}"></span>
</td>
<td data-title="Trigger: ">
<span data-ls-bind="{{execution.trigger}}"></span>

View file

@ -47,9 +47,9 @@ class Execution extends Model
'default' => '',
'example' => 'processing',
])
->addRule('exitCode', [
->addRule('statusCode', [
'type' => self::TYPE_INTEGER,
'description' => 'The script exit code.',
'description' => 'The script status code.',
'default' => 0,
'example' => 0,
])

View file

@ -86,6 +86,9 @@ class FunctionsCustomClientTest extends Scope
$this->assertEquals(201, $tag['headers']['status-code']);
// Wait for tag to be built.
sleep(5);
$function = $this->client->call(Client::METHOD_PATCH, '/functions/'.$function['body']['$id'].'/tag', [
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
@ -96,9 +99,6 @@ class FunctionsCustomClientTest extends Scope
$this->assertEquals(200, $function['headers']['status-code']);
// Wait for tag to be built.
sleep(5);
$execution = $this->client->call(Client::METHOD_POST, '/functions/'.$function['body']['$id'].'/executions', [
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
@ -169,6 +169,9 @@ class FunctionsCustomClientTest extends Scope
$tagId = $tag['body']['$id'] ?? '';
// Wait for tag to be built.
sleep(5);
$this->assertEquals(201, $tag['headers']['status-code']);
$function = $this->client->call(Client::METHOD_PATCH, '/functions/'.$functionId.'/tag', [
@ -181,9 +184,6 @@ class FunctionsCustomClientTest extends Scope
$this->assertEquals(200, $function['headers']['status-code']);
// Wait for tag to be built.
sleep(5);
$execution = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/executions', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $projectId,
@ -319,6 +319,9 @@ class FunctionsCustomClientTest extends Scope
$this->assertEquals(201, $tag['headers']['status-code']);
// Wait for tag to be built.
sleep(5);
$function = $this->client->call(Client::METHOD_PATCH, '/functions/'.$functionId.'/tag', [
'content-type' => 'application/json',
'x-appwrite-project' => $projectId,
@ -329,9 +332,6 @@ class FunctionsCustomClientTest extends Scope
$this->assertEquals(200, $function['headers']['status-code']);
// Wait for tag to be built.
sleep(5);
$execution = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/executions', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $projectId,

View file

@ -292,6 +292,9 @@ class FunctionsCustomServerTest extends Scope
$this->assertIsInt($tag['body']['dateCreated']);
$this->assertEquals('index.php', $tag['body']['entrypoint']);
// $this->assertGreaterThan(10000, $tag['body']['size']);
// Wait for tag to build.
sleep(5);
/**
* Test for FAILURE
@ -320,9 +323,6 @@ class FunctionsCustomServerTest extends Scope
$this->assertIsInt($response['body']['dateCreated']);
$this->assertIsInt($response['body']['dateUpdated']);
$this->assertEquals($data['tagId'], $response['body']['tag']);
// Wait for tag to be built.
sleep(5);
/**
* Test for FAILURE
@ -445,7 +445,7 @@ class FunctionsCustomServerTest extends Scope
$this->assertIsInt($execution['body']['dateCreated']);
$this->assertEquals($data['functionId'], $execution['body']['functionId']);
$this->assertEquals('waiting', $execution['body']['status']);
$this->assertEquals(0, $execution['body']['exitCode']);
$this->assertEquals(0, $execution['body']['statusCode']);
$this->assertEquals('', $execution['body']['stdout']);
$this->assertEquals('', $execution['body']['stderr']);
$this->assertEquals(0, $execution['body']['time']);
@ -462,7 +462,7 @@ class FunctionsCustomServerTest extends Scope
$this->assertIsInt($execution['body']['dateCreated']);
$this->assertEquals($data['functionId'], $execution['body']['functionId']);
$this->assertEquals('completed', $execution['body']['status']);
$this->assertEquals(0, $execution['body']['exitCode']);
$this->assertEquals(200, $execution['body']['statusCode']);
$this->assertStringContainsString($execution['body']['functionId'], $execution['body']['stdout']);
$this->assertStringContainsString($data['tagId'], $execution['body']['stdout']);
$this->assertStringContainsString('Test1', $execution['body']['stdout']);
@ -685,6 +685,9 @@ class FunctionsCustomServerTest extends Scope
$tagId = $tag['body']['$id'] ?? '';
$this->assertEquals(201, $tag['headers']['status-code']);
// Allow build step to run
sleep(5);
$tag = $this->client->call(Client::METHOD_PATCH, '/functions/'.$functionId.'/tag', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
@ -694,9 +697,6 @@ class FunctionsCustomServerTest extends Scope
]);
$this->assertEquals(200, $tag['headers']['status-code']);
// Allow build step to run
sleep(5);
$execution = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/executions', array_merge([
'content-type' => 'application/json',
@ -723,11 +723,11 @@ class FunctionsCustomServerTest extends Scope
$this->assertEquals($executions['body']['executions'][0]['$id'], $executionId);
$this->assertEquals($executions['body']['executions'][0]['trigger'], 'http');
$this->assertEquals($executions['body']['executions'][0]['status'], 'failed');
$this->assertEquals($executions['body']['executions'][0]['exitCode'], 124);
$this->assertEquals($executions['body']['executions'][0]['statusCode'], 124);
$this->assertGreaterThan(2, $executions['body']['executions'][0]['time']);
$this->assertLessThan(3, $executions['body']['executions'][0]['time']);
$this->assertEquals($executions['body']['executions'][0]['stdout'], '');
$this->assertEquals($executions['body']['executions'][0]['stderr'], '');
$this->assertEquals($executions['body']['executions'][0]['stderr'], 'Execution timed out.');
}
/**
@ -768,6 +768,9 @@ class FunctionsCustomServerTest extends Scope
$tagId = $tag['body']['$id'] ?? '';
$this->assertEquals(201, $tag['headers']['status-code']);
// Allow build step to run
sleep(5);
$tag = $this->client->call(Client::METHOD_PATCH, '/functions/'.$functionId.'/tag', array_merge([
'content-type' => 'application/json',
'x-appwrite-project' => $this->getProject()['$id'],
@ -776,9 +779,6 @@ class FunctionsCustomServerTest extends Scope
]);
$this->assertEquals(200, $tag['headers']['status-code']);
// Allow build step to run
sleep(5);
$execution = $this->client->call(Client::METHOD_POST, '/functions/'.$functionId.'/executions', array_merge([
'content-type' => 'application/json',