serverless-prune-versions
Version:
Serverless plugin to delete old versions of deployed functions from AWS
119 lines • 11.4 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PrunePlugin = void 0;
const assert_1 = require("assert");
const commands_1 = require("./commands");
const function_1 = require("./function");
const layer_1 = require("./layer");
const log_1 = require("./log");
const settings_1 = require("./settings");
class PrunePlugin {
constructor(serverless, rawOptions) {
var _a, _b;
this.serverless = serverless;
this.hooks = {
'prune:prune': this.standalonePrune.bind(this),
'after:deploy:deploy': this.postDeployPrune.bind(this)
};
this.commands = commands_1.commands;
this.settings = new settings_1.Settings((_b = (_a = serverless.service) === null || _a === void 0 ? void 0 : _a.custom) === null || _b === void 0 ? void 0 : _b.prune, rawOptions);
this.validateServerlessYml();
}
postDeployPrune() {
return this.shouldPostDeployPrune() && this.prune();
}
standalonePrune() {
return this.prune();
}
prune() {
if (this.settings.includeLayers) {
this.log('Pruning Lambda function versions and layers...');
return Promise.all([this.pruneVersions(), this.pruneLayers()]);
}
else {
this.log('Pruning Lambda function versions...');
return this.pruneVersions();
}
}
validateServerlessYml() {
var _a, _b, _c, _d, _e, _f;
assert_1.ok(this.serverless, `Invalid serverless.yml file`);
assert_1.ok((_a = this.serverless) === null || _a === void 0 ? void 0 : _a.service, `Missing required service section in serverless.yml`);
assert_1.ok((_c = (_b = this.serverless) === null || _b === void 0 ? void 0 : _b.service) === null || _c === void 0 ? void 0 : _c.provider, `Missing required provider section in serverless.yml`);
const providerName = (_f = (_e = (_d = this.serverless) === null || _d === void 0 ? void 0 : _d.service) === null || _e === void 0 ? void 0 : _e.provider) === null || _f === void 0 ? void 0 : _f.name;
assert_1.ok(providerName, `Missing required name property of provider section in serverless.yml`);
assert_1.deepStrictEqual(providerName, 'aws', `This plugin only supports AWS as a provider`);
}
shouldPostDeployPrune() {
const noDeploy = this.settings.noDeploy === true;
if (noDeploy) {
this.log("Skipping pruning because 'noDeploy' was set to true");
}
const automaticPruning = this.settings.automatic === true;
if (!automaticPruning) {
this.log("Skipping pruning because 'automatic' wasn't set to true");
}
return !noDeploy && automaticPruning;
}
pruneVersions() {
return __awaiter(this, void 0, void 0, function* () {
const functions = this.settings.function ? [this.settings.function] : this.serverless.service.getAllFunctions();
const functionsToPrune = functions.map(f => {
const name = this.serverless.service.getFunction(f).name;
return new function_1.LambdaFunction(name, this.settings, this.serverless);
});
const prunedVersions = yield Promise.all(functionsToPrune.map(f => f.deleteVersions()));
const didPrune = prunedVersions.filter(pruned => pruned);
if (this.settings.dryRun) {
this.log('Dry run complete, no function versions have been removed');
}
else if (didPrune.length > 0) {
this.log(`Function version pruning complete, pruned versions from ${didPrune.length} of ${functionsToPrune.length} functions`);
}
else if (didPrune.length === 0) {
this.log(`Function version pruning complete, no versions to prune in ${functionsToPrune.length} functions`);
}
return;
});
}
pruneLayers() {
return __awaiter(this, void 0, void 0, function* () {
const layers = this.settings.layer ? [this.settings.layer] : this.serverless.service.getAllLayers();
const layersToPrune = layers.map(l => {
const name = this.serverless.service.getLayer(l).name;
return new layer_1.LambdaLayer(name, this.settings, this.serverless);
});
const prunedLayers = yield Promise.all(layersToPrune.map(l => l.deleteVersions()));
const didPrune = prunedLayers.filter(pruned => pruned);
if (this.settings.dryRun) {
this.log('Dry run complete, no layer versions have been removed');
}
else if (didPrune.length > 0) {
this.log(`Layer version pruning complete, pruned versions from ${didPrune.length} of ${layersToPrune.length} layers`);
}
else if (didPrune.length === 0) {
this.log(`Layer version pruning complete, no versions to prune in ${layersToPrune.length} layers`);
}
return;
});
}
log(message) {
this.serverless.cli.log(`${log_1.LOG_PREFIX} ${message}`);
}
debug(message) {
if (process.env.SLS_DEBUG) {
this.serverless.cli.log(`${log_1.LOG_PREFIX} ${message}`);
}
}
}
exports.PrunePlugin = PrunePlugin;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBNkM7QUFDN0MseUNBQXNDO0FBQ3RDLHlDQUE0QztBQUM1QyxtQ0FBc0M7QUFDdEMsK0JBQW1DO0FBQ25DLHlDQUFzQztBQUV0QyxNQUFhLFdBQVc7SUFRdEIsWUFBb0IsVUFBc0IsRUFBRSxVQUErQjs7UUFBdkQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQU5sQyxVQUFLLEdBQUc7WUFDZCxhQUFhLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN2RCxDQUFDO1FBQ00sYUFBUSxHQUFHLG1CQUFRLENBQUM7UUFHMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLG1CQUFRLENBQUMsTUFBQSxNQUFBLFVBQVUsQ0FBQyxPQUFPLDBDQUFFLE1BQU0sMENBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMscUJBQXFCLEVBQUUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVELGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRU8sS0FBSztRQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7WUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQzNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMs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