Skip to content

Commit 80819b1

Browse files
DawidDawid
authored andcommitted
fix(download-logs): retry download logs fixes #711
1 parent 9d18316 commit 80819b1

File tree

3 files changed

+46
-30
lines changed

3 files changed

+46
-30
lines changed

src/cloudmanager-helpers.js

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const Config = require('@adobe/aio-lib-core-config')
1414
const { init } = require('@adobe/aio-lib-cloudmanager')
1515
const { cli } = require('cli-ux')
1616
const { context, getToken, Ims } = require('@adobe/aio-lib-ims')
17-
const logger = require('@adobe/aio-lib-core-logging')('@adobe/aio-lib-cloudmanager', { provider: 'debug' })
17+
const logger = require('@adobe/aio-lib-core-logging')('@adobe/aio-lib-cloudmanager', { level: process.env.LOG_LEVEL })
1818
const moment = require('moment')
1919
const _ = require('lodash')
2020
const { CLI } = require('@adobe/aio-lib-ims/src/context')
@@ -307,35 +307,16 @@ function handleError (_error, errorFn) {
307307
})
308308
}
309309

310-
async function executeWithRetries (fn, maxRetries = 5) {
311-
let retries = 0
312-
let startTime = Date.now()
313-
while (retries < maxRetries) {
310+
async function executeWithRetry (fn, retries = 3, delay = 1000) {
311+
for (let i = 0; i < retries; i++) {
314312
try {
315313
return await fn()
316314
} catch (error) {
317-
if (error.sdkDetails && error.sdkDetails.response && (error.sdkDetails.response.status === 401 || error.sdkDetails.response.status === 403)) {
318-
logger.debug('Received 401, 403 error, retrying.')
319-
} else {
320-
throw error
321-
}
322-
if (shouldResetRetires(startTime)) {
323-
retries = 0
324-
startTime = Date.now()
325-
}
326-
retries++
315+
logger.debug(`Retrying due to error: ${error.message || 'Unknown error'} (attempt ${i + 1}/${retries})`)
316+
if (i === retries - 1) throw error
317+
await new Promise(resolve => setTimeout(resolve, delay))
327318
}
328319
}
329-
throw new validationCodes.MAX_RETRY_REACHED()
330-
}
331-
332-
function shouldResetRetires (startTime, resetInterval = 3600000) {
333-
const elapsedTime = Date.now() - startTime
334-
if (elapsedTime >= resetInterval) {
335-
logger.debug(`Resetting retries after ${resetInterval / 1000} seconds.`)
336-
return true
337-
}
338-
return false
339320
}
340321

341322
module.exports = {
@@ -360,5 +341,5 @@ module.exports = {
360341
getActiveOrganizationId,
361342
getFullOrgIdentity,
362343
handleError,
363-
executeWithRetries,
344+
executeWithRetry,
364345
}

src/commands/cloudmanager/environment/download-logs.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ governing permissions and limitations under the License.
1111
*/
1212

1313
const { flags } = require('@oclif/command')
14-
const { initSdk, getProgramId, sanitizeEnvironmentId } = require('../../../cloudmanager-helpers')
14+
const { initSdk, getProgramId, sanitizeEnvironmentId, executeWithRetry } = require('../../../cloudmanager-helpers')
1515
const { cli } = require('cli-ux')
1616
const path = require('path')
1717
const commonFlags = require('../../../common-flags')
@@ -50,8 +50,10 @@ class DownloadLogs extends BaseCommand {
5050
}
5151

5252
async downloadLogs (programId, environmentId, service, logName, days, outputDirectory, imsContextName = null) {
53-
const sdk = await initSdk(imsContextName)
54-
return sdk.downloadLogs(programId, environmentId, service, logName, days, outputDirectory)
53+
return executeWithRetry(async () => {
54+
const sdk = await initSdk(imsContextName)
55+
return sdk.downloadLogs(programId, environmentId, service, logName, days, outputDirectory)
56+
})
5557
}
5658
}
5759

src/commands/cloudmanager/environment/tail-log.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ governing permissions and limitations under the License.
1111
*/
1212

1313
const BaseCommand = require('../../../base-command')
14-
const { initSdk, getProgramId, sanitizeEnvironmentId, executeWithRetries } = require('../../../cloudmanager-helpers')
14+
const { initSdk, getProgramId, sanitizeEnvironmentId } = require('../../../cloudmanager-helpers')
15+
const logger = require('@adobe/aio-lib-core-logging')('@adobe/aio-lib-cloudmanager', { level: process.env.LOG_LEVEL })
16+
const { codes: validationCodes } = require('../../../ValidationErrors')
1517
const commonFlags = require('../../../common-flags')
1618
const commonArgs = require('../../../common-args')
1719

@@ -38,6 +40,37 @@ class TailLog extends BaseCommand {
3840
}
3941
}
4042

43+
async function executeWithRetries (fn, maxRetries = 5) {
44+
let retries = 0
45+
let startTime = Date.now()
46+
while (retries < maxRetries) {
47+
try {
48+
return await fn()
49+
} catch (error) {
50+
if (error.sdkDetails && error.sdkDetails.response && (error.sdkDetails.response.status === 401 || error.sdkDetails.response.status === 403)) {
51+
logger.debug('Received 401, 403 error, retrying.')
52+
} else {
53+
throw error
54+
}
55+
if (shouldResetRetires(startTime)) {
56+
retries = 0
57+
startTime = Date.now()
58+
}
59+
retries++
60+
}
61+
}
62+
throw new validationCodes.MAX_RETRY_REACHED()
63+
}
64+
65+
function shouldResetRetires (startTime, resetInterval = 3600000) {
66+
const elapsedTime = Date.now() - startTime
67+
if (elapsedTime >= resetInterval) {
68+
logger.debug(`Resetting retries after ${resetInterval / 1000} seconds.`)
69+
return true
70+
}
71+
return false
72+
}
73+
4174
TailLog.description = 'outputs a stream of log data for the specified environment, service and log name'
4275

4376
TailLog.args = [

0 commit comments

Comments
 (0)