fix(xo-server,xo-web/metadata-backups): handle null retentions (#4133)
Introduced by fea5117ed8
This commit is contained in:
parent
f581e93b88
commit
88160bae1d
@ -24,6 +24,8 @@ const METADATA_BACKUP_JOB_TYPE = 'metadataBackup'
|
|||||||
|
|
||||||
const compareTimestamp = (a, b) => a.timestamp - b.timestamp
|
const compareTimestamp = (a, b) => a.timestamp - b.timestamp
|
||||||
|
|
||||||
|
const DEFAULT_RETENTION = 0
|
||||||
|
|
||||||
type Settings = {|
|
type Settings = {|
|
||||||
retentionXoMetadata?: number,
|
retentionXoMetadata?: number,
|
||||||
retentionPoolMetadata?: number,
|
retentionPoolMetadata?: number,
|
||||||
@ -454,8 +456,18 @@ export default class metadataBackup {
|
|||||||
throw new Error('no metadata mode found')
|
throw new Error('no metadata mode found')
|
||||||
}
|
}
|
||||||
|
|
||||||
const { retentionXoMetadata = 0, retentionPoolMetadata = 0 } =
|
let { retentionXoMetadata, retentionPoolMetadata } =
|
||||||
job.settings[schedule.id] || {}
|
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 (
|
if (
|
||||||
(retentionPoolMetadata === 0 && retentionXoMetadata === 0) ||
|
(retentionPoolMetadata === 0 && retentionXoMetadata === 0) ||
|
||||||
(!job.xoMetadata && retentionPoolMetadata === 0) ||
|
(!job.xoMetadata && retentionPoolMetadata === 0) ||
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import _ from 'intl'
|
import _ from 'intl'
|
||||||
import decorate from 'apply-decorators'
|
import decorate from 'apply-decorators'
|
||||||
import defined from '@xen-orchestra/defined'
|
|
||||||
import Icon from 'icon'
|
import Icon from 'icon'
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
import Scheduler, { SchedulePreview } from 'scheduling'
|
import Scheduler, { SchedulePreview } from 'scheduling'
|
||||||
@ -35,9 +34,9 @@ export default decorate([
|
|||||||
name: value.trim() === '' ? null : value,
|
name: value.trim() === '' ? null : value,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
setRetention: ({ setSchedule }, value, { name }) => () => {
|
setRetention({ setSchedule }, value, { name }) {
|
||||||
setSchedule({
|
setSchedule({
|
||||||
[name]: defined(value, null),
|
[name]: value,
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -66,7 +65,6 @@ export default decorate([
|
|||||||
value={schedule.name}
|
value={schedule.name}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
{/* retentions effects are defined on initialize() */}
|
|
||||||
{retentions.map(({ name, valuePath }) => (
|
{retentions.map(({ name, valuePath }) => (
|
||||||
<FormGroup key={valuePath}>
|
<FormGroup key={valuePath}>
|
||||||
<label>
|
<label>
|
||||||
@ -76,6 +74,7 @@ export default decorate([
|
|||||||
data-name={valuePath}
|
data-name={valuePath}
|
||||||
min='0'
|
min='0'
|
||||||
onChange={effects.setRetention}
|
onChange={effects.setRetention}
|
||||||
|
required
|
||||||
value={schedule[valuePath]}
|
value={schedule[valuePath]}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
@ -38,7 +38,6 @@ import Schedules from '../_schedules'
|
|||||||
// A retention can be:
|
// A retention can be:
|
||||||
// - number: set by user
|
// - number: set by user
|
||||||
// - undefined: will be replaced by the default value in the display(table + modal) and on submitting the form
|
// - 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 DEFAULT_RETENTION = 1
|
||||||
|
|
||||||
const RETENTION_POOL_METADATA = {
|
const RETENTION_POOL_METADATA = {
|
||||||
@ -207,7 +206,20 @@ export default decorate([
|
|||||||
schedules: ({ _schedules }, { schedules }) =>
|
schedules: ({ _schedules }, { schedules }) =>
|
||||||
defined(_schedules, schedules),
|
defined(_schedules, schedules),
|
||||||
settings: ({ _settings }, { job }) =>
|
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 }) =>
|
remotes: ({ _remotes }, { job }) =>
|
||||||
defined(_remotes, () => destructPattern(job.remotes), []),
|
defined(_remotes, () => destructPattern(job.remotes), []),
|
||||||
remotesPredicate: ({ remotes }) => ({ id }) => !remotes.includes(id),
|
remotesPredicate: ({ remotes }) => ({ id }) => !remotes.includes(id),
|
||||||
@ -227,13 +239,13 @@ export default decorate([
|
|||||||
state.modePoolMetadata &&
|
state.modePoolMetadata &&
|
||||||
every(
|
every(
|
||||||
state.settings,
|
state.settings,
|
||||||
({ retentionPoolMetadata }) => retentionPoolMetadata === null
|
({ retentionPoolMetadata }) => retentionPoolMetadata === 0
|
||||||
),
|
),
|
||||||
missingRetentionXoMetadata: state =>
|
missingRetentionXoMetadata: state =>
|
||||||
state.modeXoMetadata &&
|
state.modeXoMetadata &&
|
||||||
every(
|
every(
|
||||||
state.settings,
|
state.settings,
|
||||||
({ retentionXoMetadata }) => retentionXoMetadata === null
|
({ retentionXoMetadata }) => retentionXoMetadata === 0
|
||||||
),
|
),
|
||||||
missingSchedules: state => isEmpty(state.schedules),
|
missingSchedules: state => isEmpty(state.schedules),
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user