@@ -40,7 +40,7 @@ import { EventEmitter, once } from "events";
4040import { ServerResponse } from "http" ;
4141import { DuplexStream , getRouter } from "@scramjet/api-server" ;
4242
43- import { getInstanceAdapter } from "@scramjet/adapters" ;
43+ import { getInstanceAdapter , KubernetesInstanceAdapter } from "@scramjet/adapters" ;
4444import { cancellableDefer , CancellablePromise , defer , promiseTimeout , TypedEmitter } from "@scramjet/utility" ;
4545import { ObjLogger } from "@scramjet/obj-logger" ;
4646import { ReasonPhrases } from "http-status-codes" ;
@@ -330,71 +330,90 @@ export class CSIController extends TypedEmitter<Events> {
330330 } ) ;
331331 }
332332
333- private mapRunnerExitCode ( exitcode : number ) : Promise <
333+ async handlePodsLimitError ( ) : Promise < never > {
334+ let msg = "Instance limit reached" ;
335+
336+ if ( this . instanceAdapter instanceof KubernetesInstanceAdapter ) {
337+ const limit = await this . instanceAdapter . getPodsLimit ( ) ;
338+
339+ msg += limit ? ` (${ limit . used } /${ limit . hard } )` : "" ;
340+
341+ return Promise . reject ( {
342+ message : msg ,
343+ exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
344+ status : InstanceStatus . ERRORED
345+ } ) ;
346+ }
347+
348+ this . logger . warn ( "Incorrect Adapter exitcode" ) ;
349+
350+ return Promise . reject ( {
351+ message : msg ,
352+ exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
353+ status : InstanceStatus . ERRORED
354+ } ) ;
355+ }
356+
357+ // eslint-disable-next-line complexity
358+ private async mapRunnerExitCode ( exitcode : number ) : Promise <
334359 { message : string , exitcode : number , reason : TerminateReason }
335360 > {
336- // eslint-disable-next-line default-case
337361 switch ( exitcode ) {
338- case RunnerExitCode . INVALID_ENV_VARS : {
362+ case RunnerExitCode . SUCCESS :
363+ return Promise . resolve ( { message : "Instance completed" , exitcode, reason : TerminateReason . COMPLETED , status : InstanceStatus . COMPLETED } ) ;
364+
365+ case RunnerExitCode . INVALID_ENV_VARS :
339366 return Promise . reject ( {
340367 message : "Runner was started with invalid configuration. This is probably a bug in STH." ,
341368 exitcode : RunnerExitCode . INVALID_ENV_VARS ,
342369 status : InstanceStatus . ERRORED
343370 } ) ;
344- }
345- case RunnerExitCode . PODS_LIMIT_REACHED : {
346- return Promise . reject ( {
347- message : "Instance limit reached" ,
348- exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
349- status : InstanceStatus . ERRORED
350- } ) ;
351- }
352- case RunnerExitCode . INVALID_SEQUENCE_PATH : {
371+
372+ case RunnerExitCode . PODS_LIMIT_REACHED :
373+ return this . handlePodsLimitError ( ) ;
374+
375+ case RunnerExitCode . INVALID_SEQUENCE_PATH :
353376 return Promise . reject ( {
354377 message : `Sequence entrypoint path ${ this . sequence . config . entrypointPath } is invalid. ` +
355378 "Check `main` field in Sequence package.json" ,
356379 exitcode : RunnerExitCode . INVALID_SEQUENCE_PATH ,
357380 status : InstanceStatus . ERRORED
358381 } ) ;
359- }
360- case RunnerExitCode . SEQUENCE_FAILED_ON_START : {
382+
383+ case RunnerExitCode . SEQUENCE_FAILED_ON_START :
361384 return Promise . reject ( {
362385 message : "Sequence failed on start" ,
363386 exitcode : RunnerExitCode . SEQUENCE_FAILED_ON_START ,
364387 status : InstanceStatus . ERRORED
365388 } ) ;
366- }
367- case RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION : {
389+
390+ case RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION :
368391 return Promise . reject ( {
369392 message : "Sequence failed during execution" ,
370393 exitcode : RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION ,
371394 status : InstanceStatus . ERRORED
372395 } ) ;
373- }
374- case RunnerExitCode . SEQUENCE_UNPACK_FAILED : {
396+
397+ case RunnerExitCode . SEQUENCE_UNPACK_FAILED :
375398 return Promise . reject ( {
376399 message : "Sequence unpack failed" ,
377400 exitcode : RunnerExitCode . SEQUENCE_UNPACK_FAILED ,
378401 status : InstanceStatus . ERRORED
379402 } ) ;
380- }
381- case RunnerExitCode . KILLED : {
403+
404+ case RunnerExitCode . KILLED :
382405 return Promise . resolve ( {
383406 message : "Instance killed" , exitcode : RunnerExitCode . KILLED , reason : TerminateReason . KILLED , status : InstanceStatus . COMPLETED
384407 } ) ;
385- }
386- case RunnerExitCode . STOPPED : {
408+
409+ case RunnerExitCode . STOPPED :
387410 return Promise . resolve ( {
388411 message : "Instance stopped" , exitcode : RunnerExitCode . STOPPED , reason : TerminateReason . STOPPED , status : InstanceStatus . COMPLETED
389412 } ) ;
390- }
391- }
392413
393- if ( exitcode > 0 ) {
394- return Promise . reject ( { message : "Runner failed" , exitcode, reason : TerminateReason . ERRORED , status : InstanceStatus . ERRORED } ) ;
414+ default :
415+ return Promise . reject ( { message : "Runner failed" , exitcode, reason : TerminateReason . ERRORED , status : InstanceStatus . ERRORED } ) ;
395416 }
396-
397- return Promise . resolve ( { message : "Instance completed" , exitcode, reason : TerminateReason . COMPLETED , status : InstanceStatus . COMPLETED } ) ;
398417 }
399418
400419 async cleanup ( ) {
0 commit comments