faastjs
Version:
Serverless batch computing made simple.
139 lines • 18.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ava_1 = tslib_1.__importDefault(require("ava"));
const client_iam_1 = require("@aws-sdk/client-iam");
const uuid_1 = require("uuid");
const index_1 = require("../index");
const aws_faast_1 = require("../src/aws/aws-faast");
const funcs = tslib_1.__importStar(require("./fixtures/functions"));
const shared_1 = require("../src/shared");
const util_1 = require("./fixtures/util");
const error_1 = require("../src/error");
const throttle_1 = require("../src/throttle");
/**
* The policies tested here should match those in the documentation at
* {@link AwsOptions.RoleName}.
*/
ava_1.default.serial((0, util_1.title)("aws", "custom role"), async (t) => {
t.plan(1);
const iam = new client_iam_1.IAM({ region: "us-west-2" });
const uuid = (0, uuid_1.v4)();
const RoleName = `faast-test-custom-role-${uuid}`;
let faastModule;
let PolicyArn;
let state = "initial";
try {
const AssumeRolePolicyDocument = JSON.stringify({
Version: "2012-10-17",
Statement: [
{
Principal: { Service: "lambda.amazonaws.com" },
Action: "sts:AssumeRole",
Effect: "Allow"
}
]
});
state = `creating role ${RoleName}`;
await (0, throttle_1.retryOp)(6, () => iam.createRole({
AssumeRolePolicyDocument,
RoleName,
Description: "test custom role for lambda functions created by faast"
}));
const PolicyDocument = JSON.stringify({
Version: "2012-10-17",
Statement: [
{
Effect: "Allow",
Action: ["logs:*"],
Resource: "arn:aws:logs:*:*:log-group:faast-*"
},
{
Effect: "Allow",
Action: ["sqs:*"],
Resource: "arn:aws:sqs:*:*:faast-*"
}
]
});
state = "creating policy";
const executionPolicy = await (0, throttle_1.retryOp)(6, () => iam.createPolicy({
Description: "test faast custom role policy",
PolicyName: RoleName,
PolicyDocument
}));
state = "attaching role policy";
PolicyArn = executionPolicy.Policy.Arn;
await (0, throttle_1.retryOp)(6, () => iam.attachRolePolicy({ RoleName, PolicyArn: PolicyArn }));
await (0, shared_1.sleep)(30 * 1000);
state = "creating faastAws with custom role";
faastModule = await (0, index_1.faastAws)(funcs, {
RoleName,
gc: "off",
description: t.title
});
state = "testing invocation";
t.is(await faastModule.functions.identityString("hello"), "hello");
state = "cleanup";
}
catch (err) {
throw new error_1.FaastError(err, `Failed custom role test, last state: ${state}`);
}
finally {
try {
await faastModule?.cleanup();
await (0, throttle_1.retryOp)(3, () => (0, aws_faast_1.deleteRole)(RoleName, iam));
PolicyArn &&
(await (0, throttle_1.retryOp)(3, () => iam.deletePolicy({ PolicyArn: PolicyArn })));
}
catch (err) {
throw new error_1.FaastError(err, `Could not cleanup test role, last state: ${state}`);
}
}
});
ava_1.default.serial((0, util_1.title)("aws", "unit test ensureRole"), async (t) => {
let role;
t.plan(3);
const RoleName = `faast-test-ensureRole-1-${(0, uuid_1.v4)()}`;
try {
const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
role = await (0, aws_faast_1.ensureRole)(RoleName, services, true);
t.truthy(role.Arn);
const role2 = await (0, aws_faast_1.ensureRole)(RoleName, services, true);
t.is(role.Arn, role2.Arn);
}
finally {
const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
await (0, aws_faast_1.deleteResources)({ RoleName }, services, () => { });
const role3 = await services.iam.getRole({ RoleName }).catch(_ => { });
t.true(role3 === undefined);
}
});
ava_1.default.serial((0, util_1.title)("aws", "unit test missing role name"), async (t) => {
const RoleName = `faast-test-ensureRole-2-${(0, uuid_1.v4)()}`;
t.plan(1);
const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
try {
await (0, aws_faast_1.ensureRole)(RoleName, services, false);
}
catch (err) {
t.true(true);
}
});
ava_1.default.serial((0, util_1.title)("aws", "race condition in role creation"), async (t) => {
const RoleName = `faast-test-ensureRole-3-${(0, uuid_1.v4)()}`;
t.plan(3);
const services = await (0, aws_faast_1.createAwsApis)("us-west-2");
const promises = [];
try {
for (let i = 0; i < 3; i++) {
promises.push((0, aws_faast_1.ensureRoleRaw)(RoleName, services, true));
}
const results = await Promise.all(promises);
const Arn = results[0].Arn;
results.forEach(role => t.is(role.Arn, Arn));
}
finally {
await (0, aws_faast_1.deleteResources)({ RoleName }, services, () => { });
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLXJvbGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvYXdzLXJvbGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBdUI7QUFDdkIsb0RBQWdEO0FBQ2hELCtCQUFvQztBQUNwQyxvQ0FBaUQ7QUFDakQsb0RBTThCO0FBQzlCLG9FQUE4QztBQUM5QywwQ0FBc0M7QUFDdEMsMENBQXdDO0FBQ3hDLHdDQUEwQztBQUMxQyw4Q0FBMEM7QUFFMUM7OztHQUdHO0FBQ0gsYUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFBLFlBQUssRUFBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFDLENBQUMsRUFBQyxFQUFFO0lBQy9DLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVixNQUFNLEdBQUcsR0FBRyxJQUFJLGdCQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3QyxNQUFNLElBQUksR0FBRyxJQUFBLFNBQU0sR0FBRSxDQUFDO0lBQ3RCLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixJQUFJLEVBQUUsQ0FBQztJQUNsRCxJQUFJLFdBQWtELENBQUM7SUFDdkQsSUFBSSxTQUE2QixDQUFDO0lBQ2xDLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztJQUN0QixJQUFJLENBQUM7UUFDRCxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUMsT0FBTyxFQUFFLFlBQVk7WUFDckIsU0FBUyxFQUFFO2dCQUNQO29CQUNJLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRTtvQkFDOUMsTUFBTSxFQUFFLGdCQUFnQjtvQkFDeEIsTUFBTSxFQUFFLE9BQU87aUJBQ2xCO2FBQ0o7U0FDSixDQUFDLENBQUM7UUFDSCxLQUFLLEdBQUcsaUJBQWlCLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sSUFBQSxrQkFB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LE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO1lBQVMsQ0FBQztRQUNQLE1BQU0sSUFBQSwyQkFBZSxFQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0ZXN0IGZyb20gXCJhdmFcIjtcbmltcG9ydCB7IElBTSwgUm9sZSB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtaWFtXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgZmFhc3RBd3MsIEZhYXN0TW9kdWxlIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQge1xuICAgIGRlbGV0ZVJvbGUsXG4gICAgZW5zdXJlUm9sZSxcbiAgICBjcmVhdGVBd3NBcGlzLFxuICAgIGRlbGV0ZVJlc291cmNlcyxcbiAgICBlbnN1cmVSb2xlUmF3XG59IGZyb20gXCIuLi9zcmMvYXdzL2F3cy1mYWFzdFwiO1xuaW1wb3J0ICogYXMgZnVuY3MgZnJvbSBcIi4vZml4dHVyZXMvZnVuY3Rpb25zXCI7XG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gXCIuLi9zcmMvc2hhcmVkXCI7XG5pbXBvcnQgeyB0aXRsZSB9IGZyb20gXCIuL2ZpeHR1cmVzL3V0aWxcIjtcbmltcG9ydCB7IEZhYXN0RXJyb3IgfSBmcm9tIFwiLi4vc3JjL2Vycm9yXCI7XG5pbXBvcnQgeyByZXRyeU9wIH0gZnJvbSBcIi4uL3NyYy90aHJvdHRsZVwiO1xuXG4vKipcbiAqIFRoZSBwb2xpY2llcyB0ZXN0ZWQgaGVyZSBzaG91bGQgbWF0Y2ggdGhvc2UgaW4gdGhlIGRvY3VtZW50YXRpb24gYXRcbiAqIHtAbGluayBBd3NPcHRpb25zLlJvbGVOYW1lfS5cbiAqL1xudGVzdC5zZXJpYWwodGl0bGUoXCJhd3NcIiwgXCJjdXN0b20gcm9sZVwiKSwgYXN5bmMgdCA9PiB7XG4gICAgdC5wbGFuKDEpO1xuICAgIGNvbnN0IGlhbSA9IG5ldyBJQU0oeyByZWdpb246IFwidXMtd2VzdC0yXCIgfSk7XG4gICAgY29uc3QgdXVpZCA9IHV1aWR2NCgpO1xuICAgIGNvbnN0IFJvbGVOYW1lID0gYGZhYXN0LXRlc3QtY3VzdG9tLXJvbGUtJHt1dWlkfWA7XG4gICAgbGV0IGZhYXN0TW9kdWxlOiBGYWFzdE1vZHVsZTx0eXBlb2YgZnVuY3M+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBQb2xpY3lBcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RhdGUgPSBcImluaXRpYWxcIjtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBWZXJzaW9uOiBcIjIwMTItMTAtMTdcIixcbiAgICAgICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6IFwibGFtYmRhLmFtYXpvbmF3cy5jb21cIiB9LFxuICAgICAgICAgICAgICAgICAgICBBY3Rpb246IFwic3RzOkFzc3VtZVJvbGVcIixcbiAgICAgICAgICAgICAgICAgICAgRWZmZWN0OiBcIkFsbG93XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICBzdGF0ZSA9IGBjcmVhdGluZyByb2xlICR7Um9sZU5hbWV9YDtcbiAgICAgICAgYXdhaXQgcmV0cnlPcCg2LCAoKSA9PlxuICAgICAgICAgICAgaWFtLmNyZWF0ZVJvbGUoe1xuICAgICAgICAgICAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudCxcbiAgICAgICAgICAgICAgICBSb2xlTmFtZSxcbiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogXCJ0ZXN0IGN1c3RvbSByb2xlIGZvciBsYW1iZGEgZnVuY3Rpb25zIGNyZWF0ZWQgYnkgZmFhc3RcIlxuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBQb2xpY3lEb2N1bWVudCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIFZlcnNpb246IFwiMjAxMi0xMC0xN1wiLFxuICAgICAgICAgICAgU3RhdGVtZW50OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBFZmZlY3Q6IFwiQWxsb3dcIixcbiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBbXCJsb2dzOipcIl0sXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlOiBcImFybjphd3M6bG9nczoqOio6bG9nLWdyb3VwOmZhYXN0LSpcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBFZmZlY3Q6IFwiQWxsb3dcIixcbiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiBbXCJzcXM6KlwiXSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFwiYXJuOmF3czpzcXM6KjoqOmZhYXN0LSpcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3RhdGUgPSBcImNyZWF0aW5nIHBvbGljeVwiO1xuICAgICAgICBjb25zdCBleGVjdXRpb25Qb2xpY3kgPSBhd2FpdCByZXRyeU9wKDYsICgpID0+XG4gICAgICAgICAgICBpYW0uY3JlYXRlUG9saWN5KHtcbiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogXCJ0ZXN0IGZhYXN0IGN1c3RvbSByb2xlIHBvbGljeVwiLFxuICAgICAgICAgICAgICAgIFBvbGljeU5hbWU6IFJvbGVOYW1lLFxuICAgICAgICAgICAgICAgIFBvbGljeURvY3VtZW50XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHN0YXRlID0gXCJhdHRhY2hpbmcgcm9sZSBwb2xpY3lcIjtcbiAgICAgICAgUG9saWN5QXJuID0gZXhlY3V0aW9uUG9saWN5LlBvbGljeSEuQXJuITtcbiAgICAgICAgYXdhaXQgcmV0cnlPcCg2LCAoKSA9PiBpYW0uYXR0YWNoUm9sZVBvbGljeSh7IFJvbGVOYW1lLCBQb2xpY3lBcm46IFBvbGljeUFybiEgfSkpO1xuXG4gICAgICAgIGF3YWl0IHNsZWVwKDMwICogMTAwMCk7XG5cbiAgICAgICAgc3RhdGUgPSBcImNyZWF0aW5nIGZhYXN0QXdzIHdpdGggY3VzdG9tIHJvbGVcIjtcbiAgICAgICAgZmFhc3RNb2R1bGUgPSBhd2FpdCBmYWFzdEF3cyhmdW5jcywge1xuICAgICAgICAgICAgUm9sZU5hbWUsXG4gICAgICAgICAgICBnYzogXCJvZmZcIixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LnRpdGxlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YXRlID0gXCJ0ZXN0aW5nIGludm9jYXRpb25cIjtcbiAgICAgICAgdC5pcyhhd2FpdCBmYWFzdE1vZHVsZS5mdW5jdGlvbnMuaWRlbnRpdHlTdHJpbmcoXCJoZWxsb1wiKSwgXCJoZWxsb1wiKTtcbiAgICAgICAgc3RhdGUgPSBcImNsZWFudXBcIjtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRmFhc3RFcnJvcihlcnIsIGBGYWlsZWQgY3VzdG9tIHJvbGUgdGVzdCwgbGFzdCBzdGF0ZTogJHtzdGF0ZX1gKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZmFhc3RNb2R1bGU/LmNsZWFudXAoKTtcbiAgICAgICAgICAgIGF3YWl0IHJldHJ5T3AoMywgKCkgPT4gZGVsZXRlUm9sZShSb2xlTmFtZSwgaWFtKSk7XG4gICAgICAgICAgICBQb2xpY3lBcm4gJiZcbiAgICAgICAgICAgICAgICAoYXdhaXQgcmV0cnlPcCgzLCAoKSA9PiBpYW0uZGVsZXRlUG9saWN5KHsgUG9saWN5QXJuOiBQb2xpY3lBcm4hIH0pKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRmFhc3RFcnJvcihcbiAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgYENvdWxkIG5vdCBjbGVhbnVwIHRlc3Qgcm9sZSwgbGFzdCBzdGF0ZTogJHtzdGF0ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbnRlc3Quc2VyaWFsKHRpdGxlKFwiYXdzXCIsIFwidW5pdCB0ZXN0IGVuc3VyZVJvbGVcIiksIGFzeW5jIHQgPT4ge1xuICAgIGxldCByb2xlOiBSb2xlIHwgdW5kZWZpbmVkO1xuICAgIHQucGxhbigzKTtcbiAgICBjb25zdCBSb2xlTmFtZSA9IGBmYWFzdC10ZXN0LWVuc3VyZVJvbGUtMS0ke3V1aWR2NCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCBjcmVhdGVBd3NBcGlzKFwidXMtd2VzdC0yXCIpO1xuICAgICAgICByb2xlID0gYXdhaXQgZW5zdXJlUm9sZShSb2xlTmFtZSwgc2VydmljZXMsIHRydWUpO1xuICAgICAgICB0LnRydXRoeShyb2xlLkFybik7XG4gICAgICAgIGNvbnN0IHJvbGUyID0gYXdhaXQgZW5zdXJlUm9sZShSb2xlTmFtZSwgc2VydmljZXMsIHRydWUpO1xuICAgICAgICB0LmlzKHJvbGUuQXJuLCByb2xlMi5Bcm4pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgY3JlYXRlQXdzQXBpcyhcInVzLXdlc3QtMlwiKTtcbiAgICAgICAgYXdhaXQgZGVsZXRlUmVzb3VyY2VzKHsgUm9sZU5hbWUgfSwgc2VydmljZXMsICgpID0+IHt9KTtcbiAgICAgICAgY29uc3Qgcm9sZTMgPSBhd2FpdCBzZXJ2aWNlcy5pYW0uZ2V0Um9sZSh7IFJvbGVOYW1lIH0pLmNhdGNoKF8gPT4ge30pO1xuICAgICAgICB0LnRydWUocm9sZTMgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxufSk7XG5cbnRlc3Quc2VyaWFsKHRpdGxlKFwiYXdzXCIsIFwidW5pdCB0ZXN0IG1pc3Npbmcgcm9sZSBuYW1lXCIpLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBSb2xlTmFtZSA9IGBmYWFzdC10ZXN0LWVuc3VyZVJvbGUtMi0ke3V1aWR2NCgpfWA7XG4gICAgdC5wbGFuKDEpO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgY3JlYXRlQXdzQXBpcyhcInVzLXdlc3QtMlwiKTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVSb2xlKFJvbGVOYW1lLCBzZXJ2aWNlcywgZmFsc2UpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIHQudHJ1ZSh0cnVlKTtcbiAgICB9XG59KTtcblxudGVzdC5zZXJpYWwodGl0bGUoXCJhd3NcIiwgXCJyYWNlIGNvbmRpdGlvbiBpbiByb2xlIGNyZWF0aW9uXCIpLCBhc3luYyB0ID0+IHtcbiAgICBjb25zdCBSb2xlTmFtZSA9IGBmYWFzdC10ZXN0LWVuc3VyZVJvbGUtMy0ke3V1aWR2NCgpfWA7XG4gICAgdC5wbGFuKDMpO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgY3JlYXRlQXdzQXBpcyhcInVzLXdlc3QtMlwiKTtcbiAgICBjb25zdCBwcm9taXNlczogUHJvbWlzZTxSb2xlPltdID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goZW5zdXJlUm9sZVJhdyhSb2xlTmFtZSwgc2VydmljZXMsIHRydWUpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBBcm4gPSByZXN1bHRzWzBdLkFybjtcbiAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJvbGUgPT4gdC5pcyhyb2xlLkFybiwgQXJuKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgYXdhaXQgZGVsZXRlUmVzb3VyY2VzKHsgUm9sZU5hbWUgfSwgc2VydmljZXMsICgpID0+IHt9KTtcbiAgICB9XG59KTtcbiJdfQ==