@@ -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