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 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

View File

@ -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,

View File

@ -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}

View File

@ -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>
),

View File

@ -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' />