@salto-io/da-playa
Version:
Deploy locks management (CLI and Slackbot)
118 lines • 4.36 kB
JavaScript
;
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