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 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
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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}
|
||||||
|
@ -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>
|
||||||
),
|
),
|
||||||
|
@ -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' />
|
||||||
|
Loading…
Reference in New Issue
Block a user