From da4ff3082dcbce68ab6d13877dc683a79dc556e7 Mon Sep 17 00:00:00 2001 From: "Rajaa.BARHTAOUI" Date: Fri, 4 May 2018 15:59:11 +0200 Subject: [PATCH] feat(xo-web/health): list VM snapshots related to non-existing backup jobs (#2899) Fixes #2828 --- packages/xo-web/src/common/intl/messages.js | 2 + .../src/xo-app/dashboard/health/index.js | 55 +++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/packages/xo-web/src/common/intl/messages.js b/packages/xo-web/src/common/intl/messages.js index 24db8e3db..879b10092 100644 --- a/packages/xo-web/src/common/intl/messages.js +++ b/packages/xo-web/src/common/intl/messages.js @@ -1038,6 +1038,8 @@ const messages = { vmNameLabel: 'Name', vmNameDescription: 'Description', vmContainer: 'Resident on', + vmSnapshotsRelatedToNonExistentBackups: + 'VM snapshots related to non-existent backups', alarmMessage: 'Alarms', noAlarms: 'No alarms', alarmDate: 'Date', diff --git a/packages/xo-web/src/xo-app/dashboard/health/index.js b/packages/xo-web/src/xo-app/dashboard/health/index.js index 643af6412..0e50ad0d3 100644 --- a/packages/xo-web/src/xo-app/dashboard/health/index.js +++ b/packages/xo-web/src/xo-app/dashboard/health/index.js @@ -10,14 +10,20 @@ import TabButton from 'tab-button' import Tooltip from 'tooltip' import Upgrade from 'xoa-upgrade' import xml2js from 'xml2js' -import { Card, CardHeader, CardBlock } from 'card' import { confirm } from 'modal' -import { connectStore, formatSize, noop, resolveIds } from 'utils' -import { Container, Row, Col } from 'grid' -import { flatten, get, includes, isEmpty, map, mapValues } from 'lodash' -import { FormattedRelative, FormattedTime } from 'react-intl' -import { fromCallback } from 'promise-toolbox' import { SelectPool } from 'select-objects' +import { fromCallback } from 'promise-toolbox' +import { Container, Row, Col } from 'grid' +import { Card, CardHeader, CardBlock } from 'card' +import { FormattedRelative, FormattedTime } from 'react-intl' +import { flatten, get, includes, isEmpty, map, mapValues } from 'lodash' +import { + addSubscriptions, + connectStore, + formatSize, + noop, + resolveIds, +} from 'utils' import { deleteMessage, deleteOrphanedVdis, @@ -26,6 +32,7 @@ import { deleteVdi, deleteVm, isSrWritable, + subscribeSchedules, } from 'xo' import { areObjectsFetched, @@ -383,6 +390,9 @@ const ALARM_COLUMNS = [ }, ] +@addSubscriptions({ + schedules: subscribeSchedules, +}) @connectStore(() => { const getOrphanVdiSnapshots = createGetObjectsOfType('VDI-snapshot') .filter([_ => !_.$snapshot_of && _.$VBDs.length === 0]) @@ -390,6 +400,15 @@ const ALARM_COLUMNS = [ const getOrphanVmSnapshots = createGetObjectsOfType('VM-snapshot') .filter([snapshot => !snapshot.$snapshot_of]) .sort() + const getLoneBackupSnapshots = createGetObjectsOfType('VM-snapshot').filter( + createSelector( + createCollectionWrapper((_, props) => map(props.schedules, 'id')), + scheduleIds => _ => { + const scheduleId = _.other['xo:backup:schedule'] + return scheduleId !== undefined && !includes(scheduleIds, scheduleId) + } + ) + ) const getUserSrs = createGetObjectsOfType('SR').filter([isSrWritable]) const getVdiSrs = createGetObjectsOfType('SR').pick( createSelector(getOrphanVdiSnapshots, snapshots => map(snapshots, '$SR')) @@ -405,6 +424,7 @@ const ALARM_COLUMNS = [ vdiOrphaned: getOrphanVdiSnapshots, vdiSr: getVdiSrs, vmOrphaned: getOrphanVmSnapshots, + vmBackupSnapshots: getLoneBackupSnapshots, } }) export default class Health extends Component { @@ -490,6 +510,11 @@ export default class Health extends Component { this._getPoolPredicate ) + _getVmBackupSnapshots = createFilter( + () => this.props.vmBackupSnapshots, + this._getPoolPredicate + ) + _getAlertMessages = createFilter( () => this.props.alertMessages, this._getPoolPredicate @@ -610,6 +635,24 @@ export default class Health extends Component { + + + + + {_('vmSnapshotsRelatedToNonExistentBackups')} + + + + + + +