feat(xo-web/backup-ng/new): set default retention to 1 (#3290)

Fixes #3134
This commit is contained in:
badrAZ 2018-08-23 10:18:29 +02:00 committed by Julien Fontanet
parent def9f947b7
commit 138aed8ae1
5 changed files with 62 additions and 68 deletions

View File

@ -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 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)) - [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)) - [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 ### Bug fixes

View File

@ -37,6 +37,7 @@ import {
import Schedules from './schedules' import Schedules from './schedules'
import SmartBackup from './smart-backup' import SmartBackup from './smart-backup'
import { import {
DEFAULT_RETENTION,
destructPattern, destructPattern,
FormFeedback, FormFeedback,
FormGroup, FormGroup,
@ -560,7 +561,22 @@ export default [
}), }),
srPredicate: ({ srs }) => sr => isSrWritable(sr) && !includes(srs, sr.id), srPredicate: ({ srs }) => sr => isSrWritable(sr) && !includes(srs, sr.id),
remotePredicate: ({ remotes }) => ({ id }) => !includes(remotes, 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, injectState,

View File

@ -9,35 +9,29 @@ import { injectState, provideState } from '@julien-f/freactal'
import { isEqual } from 'lodash' import { isEqual } from 'lodash'
import { Number } from 'form' 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 [ export default [
injectState, injectState,
provideState({ provideState({
initialState: ({ initialState: ({
copyMode, schedule: { cron = '0 0 * * *', timezone = moment.tz.guess() },
exportMode,
snapshotMode,
schedule: {
cron = '0 0 * * *',
exportRetention = exportMode ? 1 : undefined,
copyRetention = copyMode ? 1 : undefined,
snapshotRetention = snapshotMode ? 1 : undefined,
timezone = moment.tz.guess(),
},
}) => ({ }) => ({
copyRetention,
cron, cron,
exportRetention,
formId: generateRandomId(), formId: generateRandomId(),
idInputName: generateRandomId(), idInputName: generateRandomId(),
schedule: undefined, schedule: undefined,
snapshotRetention,
timezone, timezone,
}), }),
effects: { effects: {
setSchedule: (_, { name, value }) => ({ setSchedule: (_, { name, value }) => ({
tmpSchedule, tmpSchedule = DEFAULT_SCHEDULE,
schedule = tmpSchedule, schedule = tmpSchedule,
}) => ({ }) => ({
schedule: { schedule: {
@ -45,18 +39,24 @@ export default [
[name]: value, [name]: value,
}, },
}), }),
setExportRetention: (_, value) => state => ({ setExportRetention: ({ setSchedule }, value) => () => {
...state, setSchedule({
exportRetention: value, name: 'exportRetention',
}), value,
setCopyRetention: (_, value) => state => ({ })
...state, },
copyRetention: value, setCopyRetention: ({ setSchedule }, value) => () => {
}), setSchedule({
setSnapshotRetention: (_, value) => state => ({ name: 'copyRetention',
...state, value,
snapshotRetention: value, })
}), },
setSnapshotRetention: ({ setSchedule }, value) => () => {
setSchedule({
name: 'snapshotRetention',
value,
})
},
setCronTimezone: (_, { cronPattern, timezone }) => state => ({ setCronTimezone: (_, { cronPattern, timezone }) => state => ({
...state, ...state,
cron: cronPattern, cron: cronPattern,
@ -72,46 +72,26 @@ export default [
computed: { computed: {
isScheduleInvalid: ({ retentionNeeded, scheduleNotEdited }) => isScheduleInvalid: ({ retentionNeeded, scheduleNotEdited }) =>
retentionNeeded || scheduleNotEdited, retentionNeeded || scheduleNotEdited,
retentionNeeded: ({ retentionNeeded: ({ copyMode, exportMode, schedule, snapshotMode }) =>
exportMode, schedule !== undefined &&
exportRetention,
copyMode,
copyRetention,
snapshotMode,
snapshotRetention,
}) =>
!( !(
(exportMode && exportRetention > 0) || (exportMode && schedule.exportRetention > 0) ||
(copyMode && copyRetention > 0) || (copyMode && schedule.copyRetention > 0) ||
(snapshotMode && snapshotRetention > 0) (snapshotMode && schedule.snapshotRetention > 0)
), ),
scheduleNotEdited: ( scheduleNotEdited: (
{ { cron, editionMode, schedule, timezone },
copyRetention,
cron,
editionMode,
exportRetention,
schedule,
snapshotRetention,
timezone,
},
{ schedule: propSchedule } { schedule: propSchedule }
) => ) =>
editionMode !== 'creation' && editionMode !== 'creation' &&
schedule === undefined && schedule === undefined &&
isEqual( isEqual(
{ {
copyRetention: propSchedule.copyRetention,
cron: propSchedule.cron, cron: propSchedule.cron,
exportRetention: propSchedule.exportRetention,
snapshotRetention: propSchedule.snapshotRetention,
timezone: propSchedule.timezone, timezone: propSchedule.timezone,
}, },
{ {
copyRetention,
cron, cron,
exportRetention,
snapshotRetention,
timezone, timezone,
} }
), ),
@ -119,8 +99,8 @@ export default [
}), }),
injectState, injectState,
({ effects, state }) => { ({ effects, state }) => {
const { tmpSchedule = {}, schedule = tmpSchedule } = state const { tmpSchedule = DEFAULT_SCHEDULE, schedule = tmpSchedule } = state
const { name } = schedule const { name, copyRetention, snapshotRetention, exportRetention } = schedule
return ( return (
<form id={state.formId}> <form id={state.formId}>
@ -148,7 +128,7 @@ export default [
<Number <Number
min='0' min='0'
onChange={effects.setExportRetention} onChange={effects.setExportRetention}
value={state.exportRetention} value={exportRetention}
/> />
</FormGroup> </FormGroup>
)} )}
@ -160,7 +140,7 @@ export default [
<Number <Number
min='0' min='0'
onChange={effects.setCopyRetention} onChange={effects.setCopyRetention}
value={state.copyRetention} value={copyRetention}
/> />
</FormGroup> </FormGroup>
)} )}
@ -172,7 +152,7 @@ export default [
<Number <Number
min='0' min='0'
onChange={effects.setSnapshotRetention} onChange={effects.setSnapshotRetention}
value={state.snapshotRetention} value={snapshotRetention}
/> />
</FormGroup> </FormGroup>
)} )}
@ -188,11 +168,11 @@ export default [
<br /> <br />
<ActionButton <ActionButton
btnStyle='primary' btnStyle='primary'
data-copyRetention={state.copyRetention} data-copyRetention={copyRetention}
data-cron={state.cron} data-cron={state.cron}
data-exportRetention={state.exportRetention} data-exportRetention={exportRetention}
data-name={name} data-name={name}
data-snapshotRetention={state.snapshotRetention} data-snapshotRetention={snapshotRetention}
data-timezone={state.timezone} data-timezone={state.timezone}
disabled={state.isScheduleInvalid} disabled={state.isScheduleInvalid}
form={state.formId} form={state.formId}

View File

@ -149,12 +149,7 @@ export default [
</CardBlock> </CardBlock>
</FormFeedback> </FormFeedback>
{state.editionMode !== undefined && ( {state.editionMode !== undefined && (
<NewSchedule <NewSchedule schedule={state.tmpSchedule || {}} />
copyMode={state.copyMode}
exportMode={state.exportMode}
schedule={state.tmpSchedule || {}}
snapshotMode={state.snapshotMode}
/>
)} )}
</div> </div>
), ),

View File

@ -2,6 +2,8 @@ import Icon from 'icon'
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import React from 'react' import React from 'react'
export const DEFAULT_RETENTION = 1
export const FormGroup = props => <div {...props} className='form-group' /> export const FormGroup = props => <div {...props} className='form-group' />
export const Input = props => <input {...props} className='form-control' /> export const Input = props => <input {...props} className='form-control' />
export const Ul = props => <ul {...props} className='list-group' /> export const Ul = props => <ul {...props} className='list-group' />