UNPKG

@salto-io/da-playa

Version:

Deploy locks management (CLI and Slackbot)

118 lines 4.36 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RunningJobs = exports.RunningJobsModelDetails = void 0; const dynamodb_1 = __importDefault(require("dynamodb")); const joi_1 = __importDefault(require("joi")); const data_1 = require("../data"); const RELEVANT_JOBS_TIMESPAN = 50 * 60 * 1000; const ModelName = 'RunningJobs'; const runningJobsDynamoDbModel = { hashKey: 'id', rangeKey: 'jobname', timestamps: false, schema: { user: joi_1.default.string().required(), id: dynamodb_1.default.types.uuid(), version: joi_1.default.string().required(), started: joi_1.default.number().required(), skipped: joi_1.default.boolean().required(), ended: joi_1.default.number(), jobname: joi_1.default.string().required(), }, tableName: 'DaPlayaRunningJobs', }; exports.RunningJobsModelDetails = { Model: runningJobsDynamoDbModel, ModelName, }; const RunningJobs = async ({ dynamoDBRegion, dynamoDbUri, }) => { const RunningJobsDb = (0, data_1.Data)({ model: runningJobsDynamoDbModel, modelName: ModelName, dynamoDBRegion, dynamoDbUri, }); const getJobs = (jobname, ttl = RELEVANT_JOBS_TIMESPAN, skipped = false) => { const timeframe = new Date().getTime() - ttl; const filterJobNameExpression = '#jobname = :jobname'; const filterActive = '#started > :ttl'; const filterAdditional = skipped ? '#skipped = :skipped' : 'attribute_not_exists(ended)'; const filterExpression = `(${filterJobNameExpression}) AND (${filterActive} AND ${filterAdditional})`; const filterAttributeValues = { ':jobname': jobname, ':ttl': timeframe, ...(skipped ? { ':skipped': true, } : {}), }; const filterAttributeNames = { '#started': 'started', '#jobname': 'jobname', ...(skipped ? { '#skipped': 'skipped', } : {}), }; return RunningJobsDb.get({ filterExpression, filterAttributeValues, filterAttributeNames, }); }; const getJob = async ({ jobname, version, }) => { const filterExpression = '#jobname = :jobname AND #version = :version'; const filterAttributeValues = { ':jobname': jobname, ':version': version, }; const filterAttributeNames = { '#jobname': 'jobname', '#version': 'version', }; const result = await RunningJobsDb.get({ filterExpression, filterAttributeValues, filterAttributeNames, }); return result === null || result === void 0 ? void 0 : result[0]; }; return { getJob, startJob: async ({ user, version, jobname }) => RunningJobsDb.create({ user: user.toLowerCase(), started: new Date().getTime(), version, jobname, skipped: false, }), getRunningJobs: ({ ttl, jobname }) => getJobs(jobname, ttl), getSkippedJobs: ({ ttl, jobname }) => getJobs(jobname, ttl, true), endJob: async ({ jobname, version, user, skipped = false }) => { const relevantRunningJobs = await RunningJobsDb.get({ filterExpression: '(#jobname = :jobname) AND (#version = :version) AND (#user = :user)', filterAttributeValues: { ':jobname': jobname, ':version': version, ':user': user, }, filterAttributeNames: { '#jobname': 'jobname', '#version': 'version', '#user': 'user', }, }); if (!relevantRunningJobs || !relevantRunningJobs.length) { return null; } return RunningJobsDb.set({ ...relevantRunningJobs[0], skipped, ended: new Date().getTime(), }); }, }; }; exports.RunningJobs = RunningJobs; //# sourceMappingURL=index.js.map