From b7d3762c06d35d7e8f45d4796c3f75574a9c0141 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 5 Mar 2018 17:22:40 +0100 Subject: [PATCH] chore(xo-server): delete unused schedules on clean --- packages/xo-server/src/api/job.js | 2 +- packages/xo-server/src/xo-mixins/jobs/index.js | 4 ++-- packages/xo-server/src/xo-mixins/scheduling.js | 15 ++++++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/xo-server/src/api/job.js b/packages/xo-server/src/api/job.js index e7a76d412..4c2726018 100644 --- a/packages/xo-server/src/api/job.js +++ b/packages/xo-server/src/api/job.js @@ -1,7 +1,7 @@ // FIXME so far, no acls for jobs export async function getAll () { - return /* await */ this.getAllJobs() + return /* await */ this.getAllJobs('call') } getAll.permission = 'admin' diff --git a/packages/xo-server/src/xo-mixins/jobs/index.js b/packages/xo-server/src/xo-mixins/jobs/index.js index deec92ae8..9272bb9bf 100644 --- a/packages/xo-server/src/xo-mixins/jobs/index.js +++ b/packages/xo-server/src/xo-mixins/jobs/index.js @@ -141,13 +141,13 @@ export default class Jobs { }) } - async getAllJobs (type: string = 'call'): Promise> { + async getAllJobs (type: ?string): Promise> { // $FlowFixMe don't know what is the problem (JFT) const jobs = await this._jobs.get() const runningJobs = this._runningJobs const result = [] jobs.forEach(job => { - if (job.type === type) { + if (type === undefined || job.type === type) { job.runId = runningJobs[job.id] result.push(job) } diff --git a/packages/xo-server/src/xo-mixins/scheduling.js b/packages/xo-server/src/xo-mixins/scheduling.js index 15ad89736..4609d48bd 100644 --- a/packages/xo-server/src/xo-mixins/scheduling.js +++ b/packages/xo-server/src/xo-mixins/scheduling.js @@ -1,6 +1,8 @@ // @flow import { createSchedule } from '@xen-orchestra/cron' +// $FlowFixMe +import { keyBy } from 'lodash' import { noSuchObject } from 'xo-common/api-errors' import Collection from '../collection/redis' @@ -58,7 +60,18 @@ export default class Scheduling { this._runs = { __proto__: null } - app.on('clean', () => db.rebuildIndexes()) + app.on('clean', async () => { + const [jobsById, schedules] = await Promise.all([ + app.getAllJobs().then(_ => keyBy(_, 'id')), + app.getAllSchedules(), + ]) + + await db.remove( + schedules.filter(_ => !(_.jobId in jobsById)).map(_ => _.id) + ) + + return db.rebuildIndexes() + }) app.on('start', async () => { app.addConfigManager( 'schedules',