From 6e3c5d16ad795995988f5d991a98047349510aa1 Mon Sep 17 00:00:00 2001 From: hveldstra Date: Mon, 19 Aug 2024 15:21:10 +0100 Subject: [PATCH 1/2] fix: bundle dotenv files on Azure Remove explicit check for AWS Lambda from BOM so that dotenv files get bundled by default on all platforms other than AWS ECS. --- packages/artillery/lib/cmds/run.js | 2 +- packages/artillery/lib/platform/aws-ecs/legacy/bom.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/artillery/lib/cmds/run.js b/packages/artillery/lib/cmds/run.js index e29e67591b..33f3a9bcde 100644 --- a/packages/artillery/lib/cmds/run.js +++ b/packages/artillery/lib/cmds/run.js @@ -44,7 +44,7 @@ class RunCommand extends Command { async run() { const { flags, argv, args } = await this.parse(RunCommand); - if (flags.platform === 'aws:fargate') { + if (flags.platform === 'aws:ecs') { // Delegate to existing implementation const RunFargateCommand = require('./run-fargate'); return await RunFargateCommand.run(argv); diff --git a/packages/artillery/lib/platform/aws-ecs/legacy/bom.js b/packages/artillery/lib/platform/aws-ecs/legacy/bom.js index 1d34b3ebef..c6e3928b88 100644 --- a/packages/artillery/lib/platform/aws-ecs/legacy/bom.js +++ b/packages/artillery/lib/platform/aws-ecs/legacy/bom.js @@ -379,8 +379,7 @@ function getExtraFiles(context, next) { function getDotEnv(context, next) { const flags = context.opts.flags; - //TODO: For now only enabled on Lambda. Enable this for Fargate after refactoring to allow for it - if (!flags.dotenv || flags.platform !== 'aws:lambda') { + if (!flags.dotenv || flags.platform === 'aws:ecs') { return next(null, context); } From b7e40b62a673dcbe7552d9464194c83e7939311d Mon Sep 17 00:00:00 2001 From: hveldstra Date: Mon, 19 Aug 2024 15:22:45 +0100 Subject: [PATCH 2/2] feat: improve error handling for provisioning errors on Azure - Introduce a 5 minute timeout to wait for Azure to provision instances - Add a more specific error message --- packages/artillery/lib/platform/az/aci.js | 46 +++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/artillery/lib/platform/az/aci.js b/packages/artillery/lib/platform/az/aci.js index 4292a8b0d0..37a9b4efe4 100644 --- a/packages/artillery/lib/platform/az/aci.js +++ b/packages/artillery/lib/platform/az/aci.js @@ -19,6 +19,7 @@ const debug = require('debug')('platform:azure-aci'); const { IMAGE_VERSION } = require('../aws-ecs/legacy/constants'); const { regionNames } = require('./regions'); const path = require('path'); +const { Timeout, sleep } = require('../aws-ecs/legacy/time'); class PlatformAzureACI { constructor(script, variablePayload, opts, platformOpts) { @@ -323,22 +324,28 @@ class PlatformAzureACI { let instancesCreated = false; console.log('Waiting for Azure ACI to create container instances...'); - this.workerStatusInterval = setInterval(async () => { - const containerInstanceClient = new ContainerInstanceManagementClient( - new DefaultAzureCredential(), - this.azureSubscriptionId - ); + + const containerInstanceClient = new ContainerInstanceManagementClient( + new DefaultAzureCredential(), + this.azureSubscriptionId + ); + + const provisioningWaitTimeout = new Timeout(5 * 60 * 1000).start(); + + let containerGroupsInTestRun = []; + while (true) { const containerGroupListResult = containerInstanceClient.containerGroups.listByResourceGroup( this.resourceGroupName ); - const containerGroupsInTestRun = []; + containerGroupsInTestRun = []; for await (const containerGroup of containerGroupListResult) { if (containerGroup.name.indexOf(this.testRunId) > 0) { containerGroupsInTestRun.push(containerGroup); } } + const byStatus = containerGroupsInTestRun.reduce((acc, cg) => { if (!acc[cg.provisioningState]) { acc[cg.provisioningState] = 0; @@ -351,14 +358,29 @@ class PlatformAzureACI { (byStatus['Succeeded'] || 0) + (byStatus['Running'] || 0) === this.count ) { - if (!instancesCreated) - console.log( - 'Container instances created. Waiting for workers to start...' - ); instancesCreated = true; - clearInterval(this.workerStatusInterval); + break; } - }, 10 * 1000).unref(); + + if (provisioningWaitTimeout.timedout()) { + break; + } + + await sleep(10000); + } + + if (instancesCreated) { + console.log( + 'Container instances have been created. Waiting for workers to start...' + ); + } else { + console.log('Some containers instances failed to provision'); + console.log('Please see the Azure console for details'); + console.log( + 'https://portal.azure.com/#view/HubsExtension/BrowseResource/resourceType/Microsoft.ContainerInstance%2FcontainerGroups' + ); + await global.artillery.shutdown(); + } } async shutdown() {