@@ -630,9 +630,10 @@ class CodeCatalystClientInternal {
630
630
return shortname
631
631
}
632
632
633
- function failedStartMsg ( ) {
633
+ function failedStartMsg ( serviceMsg ?: string ) {
634
634
const lastStatus = statuses [ statuses . length - 1 ] ?. status
635
- return `Dev Environment failed to start (${ lastStatus } ): ${ getName ( ) } `
635
+ const serviceMsg_ = serviceMsg ? `${ serviceMsg } : ` : ''
636
+ return `Dev Environment failed to start (${ lastStatus } ): ${ serviceMsg_ } ${ getName ( ) } `
636
637
}
637
638
638
639
const doLog = ( kind : 'debug' | 'error' | 'info' , msg : string ) => {
@@ -680,17 +681,25 @@ class CodeCatalystClientInternal {
680
681
const lastStatus = statuses [ statuses . length - 1 ]
681
682
const elapsed = Date . now ( ) - lastStatus . start
682
683
const resp = await this . getDevEnvironment ( args )
684
+ const serviceReason = ( resp . statusReason ?? '' ) . trim ( )
683
685
alias = resp . alias
684
686
685
687
if (
686
- lastStatus &&
688
+ startAttempts > 2 &&
689
+ elapsed > 10000 &&
687
690
[ 'STOPPED' , 'FAILED' ] . includes ( lastStatus . status ) &&
688
- [ 'STOPPED' , 'FAILED' ] . includes ( resp . status ) &&
689
- elapsed > 60000 &&
690
- startAttempts > 2
691
+ [ 'STOPPED' , 'FAILED' ] . includes ( resp . status )
691
692
) {
692
- // If still STOPPED/FAILED after 60+ seconds, don't keep retrying for 1 hour...
693
- throw new ToolkitError ( failedStartMsg ( ) , { code : 'FailedDevEnv' } )
693
+ const fails = statuses . filter ( o => o . status === 'FAILED' ) . length
694
+ const code = fails === 0 ? 'BadDevEnvState' : 'FailedDevEnv'
695
+
696
+ if ( serviceReason !== '' ) {
697
+ // Service gave a status reason like "Compute limit exceeded", show it to the user.
698
+ throw new ToolkitError ( failedStartMsg ( resp . statusReason ) , { code : code } )
699
+ }
700
+
701
+ // If still STOPPED/FAILED after 10+ seconds, don't keep retrying for 1 hour...
702
+ throw new ToolkitError ( failedStartMsg ( ) , { code : code } )
694
703
} else if ( [ 'STOPPED' , 'FAILED' ] . includes ( resp . status ) ) {
695
704
progress . report ( {
696
705
message : localize ( 'AWS.CodeCatalyst.devenv.resuming' , 'Resuming Dev Environment...' ) ,
@@ -700,9 +709,16 @@ class CodeCatalystClientInternal {
700
709
await this . startDevEnvironment ( args )
701
710
} catch ( e ) {
702
711
const err = e as AWS . AWSError
712
+ // - ServiceQuotaExceededException: account billing limit reached
703
713
// - ValidationException: "… creation has failed, cannot start"
704
714
// - ConflictException: "Cannot start … because update process is still going on"
705
715
// (can happen after "Update Dev Environment")
716
+ if ( err . code === 'ServiceQuotaExceededException' ) {
717
+ throw new ToolkitError ( 'Dev Environment failed: quota exceeded' , {
718
+ code : 'ServiceQuotaExceeded' ,
719
+ cause : err ,
720
+ } )
721
+ }
706
722
doLog ( 'info' , `devenv not started (${ err . code } ), waiting` )
707
723
// Continue retrying...
708
724
}
@@ -729,23 +745,17 @@ class CodeCatalystClientInternal {
729
745
)
730
746
731
747
const devenv = await waitTimeout ( pollDevEnv , timeout ) . catch ( e => {
732
- const err = e as Error
733
- const starts = statuses . filter ( o => o . status === 'STARTING' ) . length
734
- const fails = statuses . filter ( o => o . status === 'FAILED' ) . length
735
-
736
- if ( ! isUserCancelledError ( e ) ) {
737
- doLog ( 'error' , 'devenv failed to start' )
738
- } else {
748
+ if ( isUserCancelledError ( e ) ) {
739
749
doLog ( 'info' , 'devenv failed to start (user cancelled)' )
740
- err . message = failedStartMsg ( )
741
- throw err
750
+ e . message = failedStartMsg ( )
751
+ throw e
752
+ } else if ( e instanceof ToolkitError ) {
753
+ doLog ( 'error' , 'devenv failed to start' )
754
+ throw e
742
755
}
743
756
744
- if ( starts > 1 && fails === 0 ) {
745
- throw new ToolkitError ( failedStartMsg ( ) , { code : 'BadDevEnvState' , cause : err } )
746
- } else if ( fails > 0 ) {
747
- throw new ToolkitError ( failedStartMsg ( ) , { code : 'FailedDevEnv' , cause : err } )
748
- }
757
+ doLog ( 'error' , 'devenv failed to start' )
758
+ throw new ToolkitError ( failedStartMsg ( ) , { code : 'Unknown' , cause : e } )
749
759
} )
750
760
751
761
if ( ! devenv ) {
0 commit comments