From 88160bae1d4129f865f80f3bc2b2c35b3e08f4cd Mon Sep 17 00:00:00 2001 From: badrAZ Date: Thu, 11 Apr 2019 11:00:04 +0200 Subject: [PATCH] fix(xo-server,xo-web/metadata-backups): handle null retentions (#4133) Introduced by fea5117ed83b58d3a57715b32d63d46e3004a094 --- .../src/xo-mixins/metadata-backups.js | 14 ++++++++++++- .../xo-app/backup-ng/new/_schedules/new.js | 7 +++---- .../xo-app/backup-ng/new/metadata/index.js | 20 +++++++++++++++---- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/xo-server/src/xo-mixins/metadata-backups.js b/packages/xo-server/src/xo-mixins/metadata-backups.js index a54dc9901..e58ff9c65 100644 --- a/packages/xo-server/src/xo-mixins/metadata-backups.js +++ b/packages/xo-server/src/xo-mixins/metadata-backups.js @@ -24,6 +24,8 @@ const METADATA_BACKUP_JOB_TYPE = 'metadataBackup' const compareTimestamp = (a, b) => a.timestamp - b.timestamp +const DEFAULT_RETENTION = 0 + type Settings = {| retentionXoMetadata?: number, retentionPoolMetadata?: number, @@ -454,8 +456,18 @@ export default class metadataBackup { throw new Error('no metadata mode found') } - const { retentionXoMetadata = 0, retentionPoolMetadata = 0 } = + let { retentionXoMetadata, retentionPoolMetadata } = job.settings[schedule.id] || {} + + // it also replaces null retentions introduced by the commit + // https://github.com/vatesfr/xen-orchestra/commit/fea5117ed83b58d3a57715b32d63d46e3004a094#diff-c02703199db2a4c217943cf8e02b91deR40 + if (retentionXoMetadata == null) { + retentionXoMetadata = DEFAULT_RETENTION + } + if (retentionPoolMetadata == null) { + retentionPoolMetadata = DEFAULT_RETENTION + } + if ( (retentionPoolMetadata === 0 && retentionXoMetadata === 0) || (!job.xoMetadata && retentionPoolMetadata === 0) || diff --git a/packages/xo-web/src/xo-app/backup-ng/new/_schedules/new.js b/packages/xo-web/src/xo-app/backup-ng/new/_schedules/new.js index 6a1fcecf9..cf98f9c95 100644 --- a/packages/xo-web/src/xo-app/backup-ng/new/_schedules/new.js +++ b/packages/xo-web/src/xo-app/backup-ng/new/_schedules/new.js @@ -1,6 +1,5 @@ import _ from 'intl' import decorate from 'apply-decorators' -import defined from '@xen-orchestra/defined' import Icon from 'icon' import React from 'react' import Scheduler, { SchedulePreview } from 'scheduling' @@ -35,9 +34,9 @@ export default decorate([ name: value.trim() === '' ? null : value, }) }, - setRetention: ({ setSchedule }, value, { name }) => () => { + setRetention({ setSchedule }, value, { name }) { setSchedule({ - [name]: defined(value, null), + [name]: value, }) }, }, @@ -66,7 +65,6 @@ export default decorate([ value={schedule.name} /> - {/* retentions effects are defined on initialize() */} {retentions.map(({ name, valuePath }) => ( diff --git a/packages/xo-web/src/xo-app/backup-ng/new/metadata/index.js b/packages/xo-web/src/xo-app/backup-ng/new/metadata/index.js index 72d163d83..2e4bd5674 100644 --- a/packages/xo-web/src/xo-app/backup-ng/new/metadata/index.js +++ b/packages/xo-web/src/xo-app/backup-ng/new/metadata/index.js @@ -38,7 +38,6 @@ import Schedules from '../_schedules' // A retention can be: // - number: set by user // - undefined: will be replaced by the default value in the display(table + modal) and on submitting the form -// - null: when a user voluntarily deletes its value. const DEFAULT_RETENTION = 1 const RETENTION_POOL_METADATA = { @@ -207,7 +206,20 @@ export default decorate([ schedules: ({ _schedules }, { schedules }) => defined(_schedules, schedules), settings: ({ _settings }, { job }) => - defined(_settings, () => job.settings), + // it replaces null retentions introduced by the commit + // https://github.com/vatesfr/xen-orchestra/commit/fea5117ed83b58d3a57715b32d63d46e3004a094#diff-c02703199db2a4c217943cf8e02b91deR40 + defined(_settings, () => + mapValues(job.settings, setting => { + const newSetting = { ...setting } + if (newSetting.retentionPoolMetadata === null) { + newSetting.retentionPoolMetadata = 0 + } + if (newSetting.retentionXoMetadata === null) { + newSetting.retentionXoMetadata = 0 + } + return newSetting + }) + ), remotes: ({ _remotes }, { job }) => defined(_remotes, () => destructPattern(job.remotes), []), remotesPredicate: ({ remotes }) => ({ id }) => !remotes.includes(id), @@ -227,13 +239,13 @@ export default decorate([ state.modePoolMetadata && every( state.settings, - ({ retentionPoolMetadata }) => retentionPoolMetadata === null + ({ retentionPoolMetadata }) => retentionPoolMetadata === 0 ), missingRetentionXoMetadata: state => state.modeXoMetadata && every( state.settings, - ({ retentionXoMetadata }) => retentionXoMetadata === null + ({ retentionXoMetadata }) => retentionXoMetadata === 0 ), missingSchedules: state => isEmpty(state.schedules), },