@@ -417,6 +417,177 @@ describe('scaleUp', () => {
417417 expect ( mockedCreateRegistrationTokenForRepo ) . toBeCalledWith ( repo , metrics , 2 ) ;
418418 } ) ;
419419
420+ it ( 'don`t have sufficient runners, max_available is negative' , async ( ) : Promise < void > => {
421+ const config = {
422+ ...baseCfg ,
423+ environment : 'config.environ' ,
424+ ghesUrlHost : 'https://github.com' ,
425+ minAvailableRunners : 10 ,
426+ runnersExtraLabels : 'extra-label' ,
427+ } ;
428+ jest . spyOn ( Config , 'Instance' , 'get' ) . mockImplementation ( ( ) => config as unknown as Config ) ;
429+ const repo = { repo : 'repo' , owner : 'owner' } ;
430+ const payload = {
431+ id : 10 ,
432+ eventType : 'event' ,
433+ repositoryName : 'repo' ,
434+ repositoryOwner : 'owner' ,
435+ installationId : 2 ,
436+ } ;
437+ const token = 'AGDGADUWG113' ;
438+ const runnerType1 = {
439+ instance_type : 'instance_type' ,
440+ os : 'os' ,
441+ max_available : - 1 ,
442+ disk_size : 113 ,
443+ runnerTypeName : 'linux.2xlarge' ,
444+ is_ephemeral : false ,
445+ } ;
446+
447+ mocked ( getRunnerTypes ) . mockResolvedValue ( new Map ( [ [ 'linux.2xlarge' , runnerType1 ] ] ) ) ;
448+ mocked ( listGithubRunnersRepo ) . mockResolvedValue ( [
449+ {
450+ id : 3 ,
451+ name : 'name-01' ,
452+ os : 'linux' ,
453+ status : 'live' ,
454+ busy : false ,
455+ labels : [
456+ {
457+ id : 113 ,
458+ name : 'linux.2xlarge' ,
459+ type : 'read-only' ,
460+ } ,
461+ ] ,
462+ } ,
463+ {
464+ id : 33 ,
465+ name : 'name-02' ,
466+ os : 'linux' ,
467+ status : 'live' ,
468+ busy : false ,
469+ labels : [
470+ {
471+ id : 113 ,
472+ name : 'linux.2xlarge' ,
473+ type : 'read-only' ,
474+ } ,
475+ ] ,
476+ } ,
477+ ] ) ;
478+ const mockedCreateRegistrationTokenForRepo = mocked ( createRegistrationTokenRepo ) . mockResolvedValue ( token ) ;
479+ const mockedCreateRunner = mocked ( createRunner ) ;
480+
481+ await scaleUp ( 'aws:sqs' , payload , metrics ) ;
482+
483+ expect ( mockedCreateRunner ) . toBeCalledTimes ( 1 ) ;
484+ expect ( mockedCreateRunner ) . toBeCalledWith (
485+ {
486+ environment : config . environment ,
487+ runnerConfig : expect . any ( Function ) ,
488+ repoName : 'owner/repo' ,
489+ runnerType : runnerType1 ,
490+ } ,
491+ metrics ,
492+ ) ;
493+
494+ expect ( await mockedCreateRunner . mock . calls [ 0 ] [ 0 ] . runnerConfig ( config . awsRegion , false ) ) . toEqual (
495+ `--url ${ config . ghesUrlHost } /owner/repo --token ${ token } --labels AWS:${ config . awsRegion } ,linux.2xlarge,` +
496+ `extra-label ` ,
497+ ) ;
498+ expect ( await mockedCreateRunner . mock . calls [ 0 ] [ 0 ] . runnerConfig ( config . awsRegion , true ) ) . toEqual (
499+ `--url ${ config . ghesUrlHost } /owner/repo --token ${ token } --labels AWS:${ config . awsRegion } ,linux.2xlarge,` +
500+ `experimental.ami,extra-label --ephemeral` ,
501+ ) ;
502+ expect ( mockedCreateRegistrationTokenForRepo ) . toBeCalledTimes ( 2 ) ;
503+ expect ( mockedCreateRegistrationTokenForRepo ) . toBeCalledWith ( repo , metrics , 2 ) ;
504+ } ) ;
505+
506+ it ( 'don`t have sufficient runners, max_available is undefined' , async ( ) : Promise < void > => {
507+ const config = {
508+ ...baseCfg ,
509+ environment : 'config.environ' ,
510+ ghesUrlHost : 'https://github.com' ,
511+ minAvailableRunners : 10 ,
512+ runnersExtraLabels : 'extra-label' ,
513+ } ;
514+ jest . spyOn ( Config , 'Instance' , 'get' ) . mockImplementation ( ( ) => config as unknown as Config ) ;
515+ const repo = { repo : 'repo' , owner : 'owner' } ;
516+ const payload = {
517+ id : 10 ,
518+ eventType : 'event' ,
519+ repositoryName : 'repo' ,
520+ repositoryOwner : 'owner' ,
521+ installationId : 2 ,
522+ } ;
523+ const token = 'AGDGADUWG113' ;
524+ const runnerType1 = {
525+ instance_type : 'instance_type' ,
526+ os : 'os' ,
527+ disk_size : 113 ,
528+ runnerTypeName : 'linux.2xlarge' ,
529+ is_ephemeral : false ,
530+ } ;
531+
532+ mocked ( getRunnerTypes ) . mockResolvedValue ( new Map ( [ [ 'linux.2xlarge' , runnerType1 ] ] ) ) ;
533+ mocked ( listGithubRunnersRepo ) . mockResolvedValue ( [
534+ {
535+ id : 3 ,
536+ name : 'name-01' ,
537+ os : 'linux' ,
538+ status : 'live' ,
539+ busy : false ,
540+ labels : [
541+ {
542+ id : 113 ,
543+ name : 'linux.2xlarge' ,
544+ type : 'read-only' ,
545+ } ,
546+ ] ,
547+ } ,
548+ {
549+ id : 33 ,
550+ name : 'name-02' ,
551+ os : 'linux' ,
552+ status : 'live' ,
553+ busy : false ,
554+ labels : [
555+ {
556+ id : 113 ,
557+ name : 'linux.2xlarge' ,
558+ type : 'read-only' ,
559+ } ,
560+ ] ,
561+ } ,
562+ ] ) ;
563+ const mockedCreateRegistrationTokenForRepo = mocked ( createRegistrationTokenRepo ) . mockResolvedValue ( token ) ;
564+ const mockedCreateRunner = mocked ( createRunner ) ;
565+
566+ await scaleUp ( 'aws:sqs' , payload , metrics ) ;
567+
568+ expect ( mockedCreateRunner ) . toBeCalledTimes ( 1 ) ;
569+ expect ( mockedCreateRunner ) . toBeCalledWith (
570+ {
571+ environment : config . environment ,
572+ runnerConfig : expect . any ( Function ) ,
573+ repoName : 'owner/repo' ,
574+ runnerType : runnerType1 ,
575+ } ,
576+ metrics ,
577+ ) ;
578+
579+ expect ( await mockedCreateRunner . mock . calls [ 0 ] [ 0 ] . runnerConfig ( config . awsRegion , false ) ) . toEqual (
580+ `--url ${ config . ghesUrlHost } /owner/repo --token ${ token } --labels AWS:${ config . awsRegion } ,linux.2xlarge,` +
581+ `extra-label ` ,
582+ ) ;
583+ expect ( await mockedCreateRunner . mock . calls [ 0 ] [ 0 ] . runnerConfig ( config . awsRegion , true ) ) . toEqual (
584+ `--url ${ config . ghesUrlHost } /owner/repo --token ${ token } --labels AWS:${ config . awsRegion } ,linux.2xlarge,` +
585+ `experimental.ami,extra-label --ephemeral` ,
586+ ) ;
587+ expect ( mockedCreateRegistrationTokenForRepo ) . toBeCalledTimes ( 2 ) ;
588+ expect ( mockedCreateRegistrationTokenForRepo ) . toBeCalledWith ( repo , metrics , 2 ) ;
589+ } ) ;
590+
420591 it ( 'runners are offline' , async ( ) => {
421592 const config = {
422593 ...baseCfg ,
0 commit comments