@@ -46,6 +46,84 @@ tap.test('calculateSleepSeconds', async (t) => {
4646 ) ;
4747} ) ;
4848
49+ tap . test ( 'retryKubernetesApiRequest for ECONNREFUSED error' , async ( t ) => {
50+ const retryableErrorResponse = { code : 'ECONNREFUSED' } ;
51+
52+ await t . rejects (
53+ ( ) => kubernetesApiWrappers . retryKubernetesApiRequest ( ( ) => Promise . reject ( retryableErrorResponse ) ) ,
54+ 'eventually throws on repeated retryable error responses' ,
55+ ) ;
56+
57+ let failures = 0 ;
58+ const functionThatFailsJustEnoughTimes = ( ) => {
59+ if ( failures < kubernetesApiWrappers . ATTEMPTS_MAX - 1 ) {
60+ failures += 1 ;
61+ return Promise . reject ( retryableErrorResponse ) ;
62+ }
63+ return Promise . resolve ( 'egg' ) ;
64+ } ;
65+
66+ const successfulResponse = await kubernetesApiWrappers . retryKubernetesApiRequest ( functionThatFailsJustEnoughTimes ) ;
67+ t . equals (
68+ successfulResponse ,
69+ 'egg' ,
70+ 'keeps retrying on ECONNREFUSED as long as we don\'t cross max attempts' ,
71+ ) ;
72+
73+ failures = 0 ;
74+ const functionThatFailsOneTooManyTimes = ( ) => {
75+ if ( failures < kubernetesApiWrappers . ATTEMPTS_MAX ) {
76+ failures += 1 ;
77+ return Promise . reject ( retryableErrorResponse ) ;
78+ }
79+ return Promise . resolve ( 'egg' ) ;
80+ } ;
81+
82+ await t . rejects (
83+ ( ) => kubernetesApiWrappers . retryKubernetesApiRequest ( functionThatFailsOneTooManyTimes ) ,
84+ 'failure more than the maximum, rejects, even for a retryable error response' ,
85+ ) ;
86+ } ) ;
87+
88+ tap . test ( 'retryKubernetesApiRequest for ETIMEDOUT error' , async ( t ) => {
89+ const retryableErrorResponse = { code : 'ETIMEDOUT' } ;
90+
91+ await t . rejects (
92+ ( ) => kubernetesApiWrappers . retryKubernetesApiRequest ( ( ) => Promise . reject ( retryableErrorResponse ) ) ,
93+ 'eventually throws on repeated retryable error responses' ,
94+ ) ;
95+
96+ let failures = 0 ;
97+ const functionThatFailsJustEnoughTimes = ( ) => {
98+ if ( failures < kubernetesApiWrappers . ATTEMPTS_MAX - 1 ) {
99+ failures += 1 ;
100+ return Promise . reject ( retryableErrorResponse ) ;
101+ }
102+ return Promise . resolve ( 'egg' ) ;
103+ } ;
104+
105+ const successfulResponse = await kubernetesApiWrappers . retryKubernetesApiRequest ( functionThatFailsJustEnoughTimes ) ;
106+ t . equals (
107+ successfulResponse ,
108+ 'egg' ,
109+ 'keeps retrying on ETIMEDOUT as long as we don\'t cross max attempts' ,
110+ ) ;
111+
112+ failures = 0 ;
113+ const functionThatFailsOneTooManyTimes = ( ) => {
114+ if ( failures < kubernetesApiWrappers . ATTEMPTS_MAX ) {
115+ failures += 1 ;
116+ return Promise . reject ( retryableErrorResponse ) ;
117+ }
118+ return Promise . resolve ( 'egg' ) ;
119+ } ;
120+
121+ await t . rejects (
122+ ( ) => kubernetesApiWrappers . retryKubernetesApiRequest ( functionThatFailsOneTooManyTimes ) ,
123+ 'failure more than the maximum, rejects, even for a retryable error response' ,
124+ ) ;
125+ } ) ;
126+
49127tap . test ( 'retryKubernetesApiRequest for retryable errors' , async ( t ) => {
50128 const retryableErrorResponse = { response : { statusCode : 429 } } ;
51129
0 commit comments