feat(xo-web/backup-ng/new): set default retention to 1 (#3290)
Fixes #3134
This commit is contained in:
parent
def9f947b7
commit
138aed8ae1
@ -15,6 +15,7 @@
|
||||
- [Backup NG smart mode] Exclude replicated VMs [#2338](https://github.com/vatesfr/xen-orchestra/issues/2338) (PR [#3312](https://github.com/vatesfr/xen-orchestra/pull/3312))
|
||||
- [Backup NG form] Show the compression checkbox when the full mode is active [#3236](https://github.com/vatesfr/xen-orchestra/issues/3236) (PR [#3345](https://github.com/vatesfr/xen-orchestra/pull/3345))
|
||||
- [New VM] Display an error when the getting of the coreOS default template fails [#3227](https://github.com/vatesfr/xen-orchestra/issues/3227) (PR [#3343](https://github.com/vatesfr/xen-orchestra/pull/3343))
|
||||
- [Backup NG form] Set default retention to 1 [#3134](https://github.com/vatesfr/xen-orchestra/issues/3134) (PR [#3290](https://github.com/vatesfr/xen-orchestra/pull/3290))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
|
@ -37,6 +37,7 @@ import {
|
||||
import Schedules from './schedules'
|
||||
import SmartBackup from './smart-backup'
|
||||
import {
|
||||
DEFAULT_RETENTION,
|
||||
destructPattern,
|
||||
FormFeedback,
|
||||
FormGroup,
|
||||
@ -560,7 +561,22 @@ export default [
|
||||
}),
|
||||
srPredicate: ({ srs }) => sr => isSrWritable(sr) && !includes(srs, sr.id),
|
||||
remotePredicate: ({ remotes }) => ({ id }) => !includes(remotes, id),
|
||||
propSettings: (_, { job }) => Map(get(() => job.settings)),
|
||||
propSettings: (_, { job }) =>
|
||||
Map(get(() => job.settings)).map(
|
||||
setting =>
|
||||
defined(
|
||||
setting.copyRetention,
|
||||
setting.exportRetention,
|
||||
setting.snapshotRetention
|
||||
)
|
||||
? {
|
||||
copyRetention: setting.copyRetention || DEFAULT_RETENTION,
|
||||
exportRetention: setting.exportRetention || DEFAULT_RETENTION,
|
||||
snapshotRetention:
|
||||
setting.snapshotRetention || DEFAULT_RETENTION,
|
||||
}
|
||||
: setting
|
||||
),
|
||||
},
|
||||
}),
|
||||
injectState,
|
||||
|
@ -9,35 +9,29 @@ import { injectState, provideState } from '@julien-f/freactal'
|
||||
import { isEqual } from 'lodash'
|
||||
import { Number } from 'form'
|
||||
|
||||
import { FormFeedback, FormGroup, Input } from './../utils'
|
||||
import { DEFAULT_RETENTION, FormFeedback, FormGroup, Input } from './../utils'
|
||||
|
||||
const DEFAULT_SCHEDULE = {
|
||||
copyRetention: DEFAULT_RETENTION,
|
||||
exportRetention: DEFAULT_RETENTION,
|
||||
snapshotRetention: DEFAULT_RETENTION,
|
||||
}
|
||||
|
||||
export default [
|
||||
injectState,
|
||||
provideState({
|
||||
initialState: ({
|
||||
copyMode,
|
||||
exportMode,
|
||||
snapshotMode,
|
||||
schedule: {
|
||||
cron = '0 0 * * *',
|
||||
exportRetention = exportMode ? 1 : undefined,
|
||||
copyRetention = copyMode ? 1 : undefined,
|
||||
snapshotRetention = snapshotMode ? 1 : undefined,
|
||||
timezone = moment.tz.guess(),
|
||||
},
|
||||
schedule: { cron = '0 0 * * *', timezone = moment.tz.guess() },
|
||||
}) => ({
|
||||
copyRetention,
|
||||
cron,
|
||||
exportRetention,
|
||||
formId: generateRandomId(),
|
||||
idInputName: generateRandomId(),
|
||||
schedule: undefined,
|
||||
snapshotRetention,
|
||||
timezone,
|
||||
}),
|
||||
effects: {
|
||||
setSchedule: (_, { name, value }) => ({
|
||||
tmpSchedule,
|
||||
tmpSchedule = DEFAULT_SCHEDULE,
|
||||
schedule = tmpSchedule,
|
||||
}) => ({
|
||||
schedule: {
|
||||
@ -45,18 +39,24 @@ export default [
|
||||
[name]: value,
|
||||
},
|
||||
}),
|
||||
setExportRetention: (_, value) => state => ({
|
||||
...state,
|
||||
exportRetention: value,
|
||||
}),
|
||||
setCopyRetention: (_, value) => state => ({
|
||||
...state,
|
||||
copyRetention: value,
|
||||
}),
|
||||
setSnapshotRetention: (_, value) => state => ({
|
||||
...state,
|
||||
snapshotRetention: value,
|
||||
}),
|
||||
setExportRetention: ({ setSchedule }, value) => () => {
|
||||
setSchedule({
|
||||
name: 'exportRetention',
|
||||
value,
|
||||
})
|
||||
},
|
||||
setCopyRetention: ({ setSchedule }, value) => () => {
|
||||
setSchedule({
|
||||
name: 'copyRetention',
|
||||
value,
|
||||
})
|
||||
},
|
||||
setSnapshotRetention: ({ setSchedule }, value) => () => {
|
||||
setSchedule({
|
||||
name: 'snapshotRetention',
|
||||
value,
|
||||
})
|
||||
},
|
||||
setCronTimezone: (_, { cronPattern, timezone }) => state => ({
|
||||
...state,
|
||||
cron: cronPattern,
|
||||
@ -72,46 +72,26 @@ export default [
|
||||
computed: {
|
||||
isScheduleInvalid: ({ retentionNeeded, scheduleNotEdited }) =>
|
||||
retentionNeeded || scheduleNotEdited,
|
||||
retentionNeeded: ({
|
||||
exportMode,
|
||||
exportRetention,
|
||||
copyMode,
|
||||
copyRetention,
|
||||
snapshotMode,
|
||||
snapshotRetention,
|
||||
}) =>
|
||||
retentionNeeded: ({ copyMode, exportMode, schedule, snapshotMode }) =>
|
||||
schedule !== undefined &&
|
||||
!(
|
||||
(exportMode && exportRetention > 0) ||
|
||||
(copyMode && copyRetention > 0) ||
|
||||
(snapshotMode && snapshotRetention > 0)
|
||||
(exportMode && schedule.exportRetention > 0) ||
|
||||
(copyMode && schedule.copyRetention > 0) ||
|
||||
(snapshotMode && schedule.snapshotRetention > 0)
|
||||
),
|
||||
scheduleNotEdited: (
|
||||
{
|
||||
copyRetention,
|
||||
cron,
|
||||
editionMode,
|
||||
exportRetention,
|
||||
schedule,
|
||||
snapshotRetention,
|
||||
timezone,
|
||||
},
|
||||
{ cron, editionMode, schedule, timezone },
|
||||
{ schedule: propSchedule }
|
||||
) =>
|
||||
editionMode !== 'creation' &&
|
||||
schedule === undefined &&
|
||||
isEqual(
|
||||
{
|
||||
copyRetention: propSchedule.copyRetention,
|
||||
cron: propSchedule.cron,
|
||||
exportRetention: propSchedule.exportRetention,
|
||||
snapshotRetention: propSchedule.snapshotRetention,
|
||||
timezone: propSchedule.timezone,
|
||||
},
|
||||
{
|
||||
copyRetention,
|
||||
cron,
|
||||
exportRetention,
|
||||
snapshotRetention,
|
||||
timezone,
|
||||
}
|
||||
),
|
||||
@ -119,8 +99,8 @@ export default [
|
||||
}),
|
||||
injectState,
|
||||
({ effects, state }) => {
|
||||
const { tmpSchedule = {}, schedule = tmpSchedule } = state
|
||||
const { name } = schedule
|
||||
const { tmpSchedule = DEFAULT_SCHEDULE, schedule = tmpSchedule } = state
|
||||
const { name, copyRetention, snapshotRetention, exportRetention } = schedule
|
||||
|
||||
return (
|
||||
<form id={state.formId}>
|
||||
@ -148,7 +128,7 @@ export default [
|
||||
<Number
|
||||
min='0'
|
||||
onChange={effects.setExportRetention}
|
||||
value={state.exportRetention}
|
||||
value={exportRetention}
|
||||
/>
|
||||
</FormGroup>
|
||||
)}
|
||||
@ -160,7 +140,7 @@ export default [
|
||||
<Number
|
||||
min='0'
|
||||
onChange={effects.setCopyRetention}
|
||||
value={state.copyRetention}
|
||||
value={copyRetention}
|
||||
/>
|
||||
</FormGroup>
|
||||
)}
|
||||
@ -172,7 +152,7 @@ export default [
|
||||
<Number
|
||||
min='0'
|
||||
onChange={effects.setSnapshotRetention}
|
||||
value={state.snapshotRetention}
|
||||
value={snapshotRetention}
|
||||
/>
|
||||
</FormGroup>
|
||||
)}
|
||||
@ -188,11 +168,11 @@ export default [
|
||||
<br />
|
||||
<ActionButton
|
||||
btnStyle='primary'
|
||||
data-copyRetention={state.copyRetention}
|
||||
data-copyRetention={copyRetention}
|
||||
data-cron={state.cron}
|
||||
data-exportRetention={state.exportRetention}
|
||||
data-exportRetention={exportRetention}
|
||||
data-name={name}
|
||||
data-snapshotRetention={state.snapshotRetention}
|
||||
data-snapshotRetention={snapshotRetention}
|
||||
data-timezone={state.timezone}
|
||||
disabled={state.isScheduleInvalid}
|
||||
form={state.formId}
|
||||
|
@ -149,12 +149,7 @@ export default [
|
||||
</CardBlock>
|
||||
</FormFeedback>
|
||||
{state.editionMode !== undefined && (
|
||||
<NewSchedule
|
||||
copyMode={state.copyMode}
|
||||
exportMode={state.exportMode}
|
||||
schedule={state.tmpSchedule || {}}
|
||||
snapshotMode={state.snapshotMode}
|
||||
/>
|
||||
<NewSchedule schedule={state.tmpSchedule || {}} />
|
||||
)}
|
||||
</div>
|
||||
),
|
||||
|
@ -2,6 +2,8 @@ import Icon from 'icon'
|
||||
import PropTypes from 'prop-types'
|
||||
import React from 'react'
|
||||
|
||||
export const DEFAULT_RETENTION = 1
|
||||
|
||||
export const FormGroup = props => <div {...props} className='form-group' />
|
||||
export const Input = props => <input {...props} className='form-control' />
|
||||
export const Ul = props => <ul {...props} className='list-group' />
|
||||
|
Loading…
Reference in New Issue
Block a user