artillery
Version:
Cloud-scale load testing. https://www.artillery.io
116 lines (97 loc) • 3.3 kB
text/typescript
import { Args, Command, Flags } from '@oclif/core';
import { CommonRunFlags } from '../cli/common-flags.ts';
import { parseResourceTags } from '../platform/aws/resource-tags.ts';
import RunCommand from './run.ts';
class RunLambdaCommand extends Command {
// Untyped JS class - properties assigned dynamically
[key: string]: any;
static aliases = ['run:lambda'];
static strict = false;
async run() {
const { flags, argv, args } = await this.parse(RunLambdaCommand);
flags['platform-opt'] = [
`region=${flags.region}`,
`memory-size=${flags['memory-size']}`,
`architecture=${flags.architecture}`
];
delete flags.region;
delete flags['memory-size'];
delete flags.architecture;
if (flags['lambda-role-arn']) {
flags['platform-opt'].push(`lambda-role-arn=${flags['lambda-role-arn']}`);
}
if (flags['security-group-ids']) {
flags['platform-opt'].push(
`security-group-ids=${flags['security-group-ids']}`
);
}
if (flags['subnet-ids']) {
flags['platform-opt'].push(`subnet-ids=${flags['subnet-ids']}`);
}
flags.platform = 'aws:lambda';
// NOTE: --aws-tags is passed through as-is via flags (cliArgs),
// not via platform-opt. platform-opt values are split on "=" which
// would truncate tag values containing "=".
// Validate early, before any AWS resources are touched:
try {
parseResourceTags(flags['aws-tags']);
} catch (err) {
console.error((err as Error).message);
process.exit(1);
}
RunCommand.runCommandImplementation(flags, argv, args);
}
}
RunLambdaCommand.description = `launch a test using AWS Lambda
Launch a test on AWS Lambda
Examples:
To run a test script in my-test.yml on AWS Lambda in us-east-1 region
distributed across 10 Lambda functions:
$ artillery run:lambda --region us-east-1 --count 10 my-test.yml
`;
RunLambdaCommand.flags = {
...CommonRunFlags,
payload: Flags.string({
char: 'p',
description: 'Specify a CSV file for dynamic data'
}),
count: Flags.string({
// locally defaults to number of CPUs with mode = distribute
default: '1'
}),
architecture: Flags.string({
description: 'Architecture of the Lambda function',
default: 'arm64',
options: ['arm64', 'x86_64']
}),
'memory-size': Flags.string({
description: 'Memory size of the Lambda function',
default: '4096'
}),
region: Flags.string({
description: 'AWS region to run the test in',
default: 'us-east-1'
}),
'lambda-role-arn': Flags.string({
description: 'ARN of the IAM role to use for the Lambda function'
}),
'security-group-ids': Flags.string({
description:
'Comma-separated list of security group IDs to use for the Lambda function'
}),
'subnet-ids': Flags.string({
description:
'Comma-separated list of subnet IDs to use for the Lambda function'
}),
'aws-tags': Flags.string({
description:
'Comma-separated list of tags in key:value format to apply to AWS resources created for the test run (Lambda function and SQS queue), for example: --aws-tags "team:perf,cost-center:1234"'
})
};
RunLambdaCommand.args = {
script: Args.string({
name: 'script',
required: true
})
};
export default RunLambdaCommand;