@@ -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" ;
@@ -324,71 +324,90 @@ export class CSIController extends TypedEmitter<Events> {
324324 } ) ;
325325 }
326326
327- private mapRunnerExitCode ( exitcode : number ) : Promise <
327+ async handlePodsLimitError ( ) : Promise < never > {
328+ let msg = "Instances limit reached" ;
329+
330+ if ( this . instanceAdapter instanceof KubernetesInstanceAdapter ) {
331+ const limit = await this . instanceAdapter . getPodsLimit ( ) ;
332+
333+ msg = limit ? `Instances limit reached ${ limit . used } /${ limit . hard } ` : msg ;
334+
335+ return Promise . reject ( {
336+ message : msg ,
337+ exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
338+ status : InstanceStatus . ERRORED
339+ } ) ;
340+ }
341+
342+ this . logger . warn ( "Incorrect Adapter exitcode" ) ;
343+
344+ return Promise . reject ( {
345+ message : msg ,
346+ exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
347+ status : InstanceStatus . ERRORED
348+ } ) ;
349+ }
350+
351+ // eslint-disable-next-line complexity
352+ private async mapRunnerExitCode ( exitcode : number ) : Promise <
328353 { message : string , exitcode : number , reason : TerminateReason }
329354 > {
330- // eslint-disable-next-line default-case
331355 switch ( exitcode ) {
332- case RunnerExitCode . INVALID_ENV_VARS : {
356+ case RunnerExitCode . SUCCESS :
357+ return Promise . resolve ( { message : "Instance completed" , exitcode, reason : TerminateReason . COMPLETED , status : InstanceStatus . COMPLETED } ) ;
358+
359+ case RunnerExitCode . INVALID_ENV_VARS :
333360 return Promise . reject ( {
334361 message : "Runner was started with invalid configuration. This is probably a bug in STH." ,
335362 exitcode : RunnerExitCode . INVALID_ENV_VARS ,
336363 status : InstanceStatus . ERRORED
337364 } ) ;
338- }
339- case RunnerExitCode . PODS_LIMIT_REACHED : {
340- return Promise . reject ( {
341- message : "Pods limit reached" ,
342- exitcode : RunnerExitCode . PODS_LIMIT_REACHED ,
343- status : InstanceStatus . ERRORED
344- } ) ;
345- }
346- case RunnerExitCode . INVALID_SEQUENCE_PATH : {
365+
366+ case RunnerExitCode . PODS_LIMIT_REACHED :
367+ return this . handlePodsLimitError ( ) ;
368+
369+ case RunnerExitCode . INVALID_SEQUENCE_PATH :
347370 return Promise . reject ( {
348371 message : `Sequence entrypoint path ${ this . sequence . config . entrypointPath } is invalid. ` +
349372 "Check `main` field in Sequence package.json" ,
350373 exitcode : RunnerExitCode . INVALID_SEQUENCE_PATH ,
351374 status : InstanceStatus . ERRORED
352375 } ) ;
353- }
354- case RunnerExitCode . SEQUENCE_FAILED_ON_START : {
376+
377+ case RunnerExitCode . SEQUENCE_FAILED_ON_START :
355378 return Promise . reject ( {
356379 message : "Sequence failed on start" ,
357380 exitcode : RunnerExitCode . SEQUENCE_FAILED_ON_START ,
358381 status : InstanceStatus . ERRORED
359382 } ) ;
360- }
361- case RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION : {
383+
384+ case RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION :
362385 return Promise . reject ( {
363386 message : "Sequence failed during execution" ,
364387 exitcode : RunnerExitCode . SEQUENCE_FAILED_DURING_EXECUTION ,
365388 status : InstanceStatus . ERRORED
366389 } ) ;
367- }
368- case RunnerExitCode . SEQUENCE_UNPACK_FAILED : {
390+
391+ case RunnerExitCode . SEQUENCE_UNPACK_FAILED :
369392 return Promise . reject ( {
370393 message : "Sequence unpack failed" ,
371394 exitcode : RunnerExitCode . SEQUENCE_UNPACK_FAILED ,
372395 status : InstanceStatus . ERRORED
373396 } ) ;
374- }
375- case RunnerExitCode . KILLED : {
397+
398+ case RunnerExitCode . KILLED :
376399 return Promise . resolve ( {
377400 message : "Instance killed" , exitcode : RunnerExitCode . KILLED , reason : TerminateReason . KILLED , status : InstanceStatus . COMPLETED
378401 } ) ;
379- }
380- case RunnerExitCode . STOPPED : {
402+
403+ case RunnerExitCode . STOPPED :
381404 return Promise . resolve ( {
382405 message : "Instance stopped" , exitcode : RunnerExitCode . STOPPED , reason : TerminateReason . STOPPED , status : InstanceStatus . COMPLETED
383406 } ) ;
384- }
385- }
386407
387- if ( exitcode > 0 ) {
388- return Promise . reject ( { message : "Runner failed" , exitcode, reason : TerminateReason . ERRORED , status : InstanceStatus . ERRORED } ) ;
408+ default :
409+ return Promise . reject ( { message : "Runner failed" , exitcode, reason : TerminateReason . ERRORED , status : InstanceStatus . ERRORED } ) ;
389410 }
390-
391- return Promise . resolve ( { message : "Instance completed" , exitcode, reason : TerminateReason . COMPLETED , status : InstanceStatus . COMPLETED } ) ;
392411 }
393412
394413 async cleanup ( ) {
0 commit comments