feat(xo-web/health): filter duplicated MAC addresses by running VMs (#5917)

See xoa-support#4054
This commit is contained in:
Mathieu 2021-09-24 17:25:42 +02:00 committed by GitHub
parent 216b759df1
commit 919d118f21
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 7 deletions

View File

@ -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)) - [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] 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 ### Bug fixes

View File

@ -117,6 +117,7 @@ const messages = {
filterOnlyManaged: 'Managed disks', filterOnlyManaged: 'Managed disks',
filterOnlyOrphaned: 'Orphaned disks', filterOnlyOrphaned: 'Orphaned disks',
filterOnlyRegular: 'Normal disks', filterOnlyRegular: 'Normal disks',
filterOnlyRunningVms: 'Running VMs',
filterOnlySnapshots: 'Snapshot disks', filterOnlySnapshots: 'Snapshot disks',
filterOnlyUnmanaged: 'Unmanaged disks', filterOnlyUnmanaged: 'Unmanaged disks',
filterSaveAs: 'Save…', filterSaveAs: 'Save…',

View File

@ -80,14 +80,14 @@ const AlarmColPool = connectStore(() => ({
const DUPLICATED_MAC_ADDRESSES_COLUMNS = [ const DUPLICATED_MAC_ADDRESSES_COLUMNS = [
{ {
name: _('vifMacLabel'), name: _('vifMacLabel'),
itemRenderer: macAddress => <pre>{macAddress}</pre>, itemRenderer: ({ mac }) => <pre>{mac}</pre>,
sortCriteria: macAddress => macAddress, sortCriteria: ({ mac }) => mac,
}, },
{ {
name: _('vifs'), name: _('vifs'),
itemRenderer: (macAddress, { vifsByMac }) => ( itemRenderer: ({ vifs }) => (
<div> <div>
{vifsByMac[macAddress].map(vif => ( {vifs.map(vif => (
<Row key={vif.id}> <Row key={vif.id}>
<Col> <Col>
{_('vifOnVmWithNetwork', { {_('vifOnVmWithNetwork', {
@ -103,6 +103,10 @@ const DUPLICATED_MAC_ADDRESSES_COLUMNS = [
}, },
] ]
const DUPLICATED_MAC_ADDRESSES_FILTERS = {
filterOnlyRunningVms: 'nRunningVms:>1',
}
const SR_COLUMNS = [ const SR_COLUMNS = [
{ {
name: _('srName'), name: _('srName'),
@ -532,6 +536,7 @@ const HANDLED_VDI_TYPES = new Set(['system', 'user', 'ephemeral'])
guestToolsVms: getGuestToolsVms, guestToolsVms: getGuestToolsVms,
userSrs: getUserSrs, userSrs: getUserSrs,
vifsByMac: getVifsByMac, vifsByMac: getVifsByMac,
vms: getVms,
} }
}) })
export default class Health extends Component { export default class Health extends Component {
@ -584,11 +589,16 @@ export default class Health extends Component {
_getDuplicatedMacAddresses = createCollectionWrapper( _getDuplicatedMacAddresses = createCollectionWrapper(
createSelector( createSelector(
() => this._getVifsByMac(), () => this._getVifsByMac(),
vifsByMac => { () => this.props.vms,
(vifsByMac, vms) => {
const duplicatedMacAddresses = [] const duplicatedMacAddresses = []
for (const [macAddress, vifs] of Object.entries(vifsByMac)) { for (const [macAddress, vifs] of Object.entries(vifsByMac)) {
if (vifs.length > 1) { 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() return duplicatedMacAddresses.sort()
@ -754,8 +764,8 @@ export default class Health extends Component {
collection={props.areObjectsFetched ? duplicatedMacAddresses : null} collection={props.areObjectsFetched ? duplicatedMacAddresses : null}
columns={DUPLICATED_MAC_ADDRESSES_COLUMNS} columns={DUPLICATED_MAC_ADDRESSES_COLUMNS}
component={SortedTable} component={SortedTable}
data-vifsByMac={this.props.vifsByMac}
emptyMessage={_('noDuplicatedMacAddresses')} emptyMessage={_('noDuplicatedMacAddresses')}
filters={DUPLICATED_MAC_ADDRESSES_FILTERS}
stateUrlParam='s_duplicated_mac_addresses' stateUrlParam='s_duplicated_mac_addresses'
/> />
</CardBlock> </CardBlock>