diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index 803656c6c..4440b5c25 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -9,6 +9,7 @@ - [Backup] Go back to previous page instead of going to the overview after editing a job: keeps current filters and page (PR [#5913](https://github.com/vatesfr/xen-orchestra/pull/5913)) - [Health] Do not take into consideration duplicated MAC addresses from CR VMs (PR [#5916](https://github.com/vatesfr/xen-orchestra/pull/5916)) +- [Health] Ability to filter duplicated MAC addresses by running VMs (PR [#5917](https://github.com/vatesfr/xen-orchestra/pull/5917)) ### Bug fixes diff --git a/packages/xo-web/src/common/intl/messages.js b/packages/xo-web/src/common/intl/messages.js index ec2ba2908..d97dbe5d5 100644 --- a/packages/xo-web/src/common/intl/messages.js +++ b/packages/xo-web/src/common/intl/messages.js @@ -117,6 +117,7 @@ const messages = { filterOnlyManaged: 'Managed disks', filterOnlyOrphaned: 'Orphaned disks', filterOnlyRegular: 'Normal disks', + filterOnlyRunningVms: 'Running VMs', filterOnlySnapshots: 'Snapshot disks', filterOnlyUnmanaged: 'Unmanaged disks', filterSaveAs: 'Save…', 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 d4a345723..169549117 100644 --- a/packages/xo-web/src/xo-app/dashboard/health/index.js +++ b/packages/xo-web/src/xo-app/dashboard/health/index.js @@ -80,14 +80,14 @@ const AlarmColPool = connectStore(() => ({ const DUPLICATED_MAC_ADDRESSES_COLUMNS = [ { name: _('vifMacLabel'), - itemRenderer: macAddress =>
{macAddress}
, - sortCriteria: macAddress => macAddress, + itemRenderer: ({ mac }) =>
{mac}
, + sortCriteria: ({ mac }) => mac, }, { name: _('vifs'), - itemRenderer: (macAddress, { vifsByMac }) => ( + itemRenderer: ({ vifs }) => (
- {vifsByMac[macAddress].map(vif => ( + {vifs.map(vif => ( {_('vifOnVmWithNetwork', { @@ -103,6 +103,10 @@ const DUPLICATED_MAC_ADDRESSES_COLUMNS = [ }, ] +const DUPLICATED_MAC_ADDRESSES_FILTERS = { + filterOnlyRunningVms: 'nRunningVms:>1', +} + const SR_COLUMNS = [ { name: _('srName'), @@ -532,6 +536,7 @@ const HANDLED_VDI_TYPES = new Set(['system', 'user', 'ephemeral']) guestToolsVms: getGuestToolsVms, userSrs: getUserSrs, vifsByMac: getVifsByMac, + vms: getVms, } }) export default class Health extends Component { @@ -584,11 +589,16 @@ export default class Health extends Component { _getDuplicatedMacAddresses = createCollectionWrapper( createSelector( () => this._getVifsByMac(), - vifsByMac => { + () => this.props.vms, + (vifsByMac, vms) => { const duplicatedMacAddresses = [] for (const [macAddress, vifs] of Object.entries(vifsByMac)) { if (vifs.length > 1) { - duplicatedMacAddresses.push(macAddress) + duplicatedMacAddresses.push({ + mac: macAddress, + nRunningVms: vifs.filter(vif => vms[vif.$VM].power_state === 'Running').length, + vifs, + }) } } return duplicatedMacAddresses.sort() @@ -754,8 +764,8 @@ export default class Health extends Component { collection={props.areObjectsFetched ? duplicatedMacAddresses : null} columns={DUPLICATED_MAC_ADDRESSES_COLUMNS} component={SortedTable} - data-vifsByMac={this.props.vifsByMac} emptyMessage={_('noDuplicatedMacAddresses')} + filters={DUPLICATED_MAC_ADDRESSES_FILTERS} stateUrlParam='s_duplicated_mac_addresses' />