diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index 498e85ac582..929489b35c6 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -11,6 +11,8 @@ > Users must be able to say: “Nice enhancement, I'm eager to test it” +- [Backups] Add 'report recipients' when creating a metadata backup [#7569](https://github.com/vatesfr/xen-orchestra/issues/7569) (PR [#7776](https://github.com/vatesfr/xen-orchestra/pull/7776)) + ### Bug fixes > Users must be able to say: “I had this issue, happy to know it's fixed” @@ -22,6 +24,7 @@ - [Backups] NBD backups now ignore unreachable host and retry on reachable ones (PR [#7836](https://github.com/vatesfr/xen-orchestra/pull/7836)) - [New SR] Add confirmation modal before creating an SR if SRs are already present in the same path (for NFS/ISCSI) [#4273](https://github.com/vatesfr/xen-orchestra/issues/4273) (PR [#7845](https://github.com/vatesfr/xen-orchestra/pull/7845)) - [XO Tasks] Reduce the number of API calls that incorrectly stay in pending status (often `sr.getAllUnhealthyVdiChainsLength`) [Forum#79281](https://xcp-ng.org/forum/post/79281) [Forum#80010](https://xcp-ng.org/forum/post/80010) +- [Plugin/backup-reports] Fix _Metadata Backup_ report not sent in some cases (PR [#7776](https://github.com/vatesfr/xen-orchestra/pull/7776)) ### Packages to release @@ -45,6 +48,6 @@ - @xen-orchestra/xapi patch - xen-api minor - xo-server minor -- xo-web patch +- xo-web minor diff --git a/packages/xo-server-backup-reports/src/index.js b/packages/xo-server-backup-reports/src/index.js index ab7a3556fdf..b295bf0163a 100644 --- a/packages/xo-server-backup-reports/src/index.js +++ b/packages/xo-server-backup-reports/src/index.js @@ -204,11 +204,13 @@ class BackupReportsXoPlugin { throw new Error(`Unknown backup job type: ${job.type}`) } - async _metadataHandler(log, { name: jobName }, schedule, force) { + async _metadataHandler(log, { name: jobName, settings }, schedule, force) { const xo = this._xo const formatDate = createDateFormatter(schedule?.timezone) + const mailReceivers = get(() => settings[''].reportRecipients) + const tasksByStatus = groupBy(log.tasks, 'status') if (!force && log.data.reportWhen === 'failure') { @@ -218,8 +220,12 @@ class BackupReportsXoPlugin { for (const taskBatch of Object.values(tasksByStatus)) { for (const task of taskBatch) { task.additionnalData = await getAdditionnalData(task, { xo }) - for (const subTask of task.tasks) { - subTask.additionnalData = await getAdditionnalData(subTask, { xo }) + + const subTasks = task.tasks + if (subTasks !== undefined) { + for (const subTask of subTasks) { + subTask.additionnalData = await getAdditionnalData(subTask, { xo }) + } } } } @@ -235,6 +241,7 @@ class BackupReportsXoPlugin { return this._sendReport({ ...(await templatesTransform.markdown(templates.markdown.metadata(context))), ...(await templatesTransform.mjml(templates.mjml.metadata(context))), + mailReceivers, subject: templates.mjml.metadataSubject(context), success: log.status === 'success', }) diff --git a/packages/xo-web/src/xo-app/backup/new/metadata/index.js b/packages/xo-web/src/xo-app/backup/new/metadata/index.js index 748a17d08b0..151bd081521 100644 --- a/packages/xo-web/src/xo-app/backup/new/metadata/index.js +++ b/packages/xo-web/src/xo-app/backup/new/metadata/index.js @@ -22,6 +22,7 @@ import { editSchedule, subscribeRemotes, } from 'xo' +import { ReportRecipients } from '..' import { constructPattern, destructPattern, FormFeedback, FormGroup, Input, Li, Ul } from '../../utils' @@ -180,6 +181,18 @@ export default decorate([ setReportWhen({ setGlobalSettings }, { value }) { setGlobalSettings('reportWhen', value) }, + addReportRecipient({ setGlobalSettings }, value) { + const { reportRecipients = [] } = this.state.settings?.[GLOBAL_SETTING_KEY] ?? {} + if (!reportRecipients.includes(value)) { + reportRecipients.push(value) + setGlobalSettings('reportRecipients', reportRecipients) + } + }, + removeReportRecipient({ setGlobalSettings }, key) { + const { reportRecipients } = this.state.settings[GLOBAL_SETTING_KEY] + reportRecipients.splice(key, 1) + setGlobalSettings('reportRecipients', reportRecipients) + }, toggleMode: (_, { mode }) => state => ({ @@ -274,7 +287,7 @@ export default decorate([ missingSchedules, } = state.showErrors ? state : {} - const { reportWhen = 'failure' } = defined(() => state.settings[GLOBAL_SETTING_KEY], {}) + const { reportWhen = 'failure', reportRecipients = [] } = defined(() => state.settings[GLOBAL_SETTING_KEY], {}) return (
@@ -360,6 +373,11 @@ export default decorate([ +