feat(xo-web/vm): rescan ISO SRs available in console view

This commit is contained in:
mathieuRA 2021-07-12 11:55:02 +02:00
parent 9139c5e9d6
commit d7940292d0
2 changed files with 22 additions and 21 deletions

View File

@ -8,8 +8,9 @@ import Icon from 'icon'
import Tooltip from 'tooltip' import Tooltip from 'tooltip'
import { alert } from 'modal' import { alert } from 'modal'
import { isAdmin } from 'selectors' import { isAdmin } from 'selectors'
import { isEmpty } from 'lodash'
import { addSubscriptions, connectStore, resolveResourceSet } from './utils' import { addSubscriptions, connectStore, resolveResourceSet } from './utils'
import { ejectCd, insertCd, subscribeResourceSets } from './xo' import { ejectCd, insertCd, rescanSrs, subscribeResourceSets } from './xo'
import { createGetObjectsOfType, createFinder, createGetObject, createSelector } from './selectors' import { createGetObjectsOfType, createFinder, createGetObject, createSelector } from './selectors'
import { SelectResourceSetsVdi, SelectVdi as SelectAnyVdi } from './select-objects' import { SelectResourceSetsVdi, SelectVdi as SelectAnyVdi } from './select-objects'
@ -24,6 +25,12 @@ const vdiPredicate = vdi => !vdi.missing
[vbd => vbd.is_cd_drive] [vbd => vbd.is_cd_drive]
) )
const getIsoSrs = createGetObjectsOfType('SR').filter(
(_, { vm: { $pool } }) =>
sr =>
sr.$pool === $pool && sr.SR_type === 'iso'
)
const getMountedIso = createGetObject((state, props) => { const getMountedIso = createGetObject((state, props) => {
const cdDrive = getCdDrive(state, props) const cdDrive = getCdDrive(state, props)
if (cdDrive) { if (cdDrive) {
@ -34,6 +41,7 @@ const vdiPredicate = vdi => !vdi.missing
return { return {
cdDrive: getCdDrive, cdDrive: getCdDrive,
isAdmin, isAdmin,
isoSrs: getIsoSrs,
mountedIso: getMountedIso, mountedIso: getMountedIso,
} }
}) })
@ -81,10 +89,12 @@ export default class IsoDevice extends Component {
_handleEject = () => ejectCd(this.props.vm) _handleEject = () => ejectCd(this.props.vm)
_rescanIsoSrs = () => rescanSrs(this.props.isoSrs)
_showWarning = () => alert(_('cdDriveNotInstalled'), _('cdDriveInstallation')) _showWarning = () => alert(_('cdDriveNotInstalled'), _('cdDriveInstallation'))
render() { render() {
const { cdDrive, isAdmin, mountedIso } = this.props const { cdDrive, isAdmin, isoSrs, mountedIso } = this.props
const resourceSet = this._getResolvedResourceSet() const resourceSet = this._getResolvedResourceSet()
const useResourceSet = !(isAdmin || resourceSet === undefined) const useResourceSet = !(isAdmin || resourceSet === undefined)
const SelectVdi = useResourceSet ? SelectResourceSetsVdi : SelectAnyVdi const SelectVdi = useResourceSet ? SelectResourceSetsVdi : SelectAnyVdi
@ -98,6 +108,14 @@ export default class IsoDevice extends Component {
srPredicate={this._getSrPredicate()} srPredicate={this._getSrPredicate()}
value={mountedIso} value={mountedIso}
/> />
<span className='input-group-btn'>
<ActionButton
disabled={isEmpty(isoSrs)}
handler={this._rescanIsoSrs}
icon='refresh'
tooltip={_('rescanIsoSrs')}
/>
</span>
<span className='input-group-btn'> <span className='input-group-btn'>
<ActionButton disabled={!mountedIso} handler={this._handleEject} icon='vm-eject' /> <ActionButton disabled={!mountedIso} handler={this._handleEject} icon='vm-eject' />
</span> </span>

View File

@ -11,7 +11,7 @@ import React from 'react'
import StateButton from 'state-button' import StateButton from 'state-button'
import SortedTable from 'sorted-table' import SortedTable from 'sorted-table'
import TabButton from 'tab-button' import TabButton from 'tab-button'
import { compact, every, filter, find, forEach, get, isEmpty, map, some, sortedUniq, uniq } from 'lodash' import { compact, every, filter, find, forEach, get, map, some, sortedUniq, uniq } from 'lodash'
import { Sr } from 'render-xo-item' import { Sr } from 'render-xo-item'
import { Container, Row, Col } from 'grid' import { Container, Row, Col } from 'grid'
import { import {
@ -54,7 +54,6 @@ import {
isSrWritable, isSrWritable,
isVmRunning, isVmRunning,
migrateVdi, migrateVdi,
rescanSrs,
setBootableVbd, setBootableVbd,
subscribeResourceSets, subscribeResourceSets,
} from 'xo' } from 'xo'
@ -455,17 +454,11 @@ class AttachDisk extends Component {
})) }))
@connectStore(() => { @connectStore(() => {
const getAllVbds = createGetObjectsOfType('VBD') const getAllVbds = createGetObjectsOfType('VBD')
const getIsoSrs = createGetObjectsOfType('SR').filter(
(_, { pool: { $pool } }) =>
sr =>
sr.$pool === $pool && sr.SR_type === 'iso'
)
return (state, props) => ({ return (state, props) => ({
allVbds: getAllVbds(state, props), allVbds: getAllVbds(state, props),
checkPermissions: getCheckPermissions(state, props), checkPermissions: getCheckPermissions(state, props),
isAdmin: isAdmin(state, props), isAdmin: isAdmin(state, props),
isoSrs: getIsoSrs(state, props),
resolvedResourceSet: getResolvedResourceSet(state, props, !props.isAdmin && props.resourceSet !== undefined), resolvedResourceSet: getResolvedResourceSet(state, props, !props.isAdmin && props.resourceSet !== undefined),
}) })
}) })
@ -621,8 +614,6 @@ export default class TabDisks extends Component {
) )
) )
_rescanIsoSrs = () => rescanSrs(this.props.isoSrs)
actions = [ actions = [
{ {
disabled: selectedVbds => some(selectedVbds, 'attached'), disabled: selectedVbds => some(selectedVbds, 'attached'),
@ -653,7 +644,7 @@ export default class TabDisks extends Component {
] ]
render() { render() {
const { allVbds, isoSrs, resolvedResourceSet, vm } = this.props const { allVbds, resolvedResourceSet, vm } = this.props
const { attachDisk, newDisk } = this.state const { attachDisk, newDisk } = this.state
@ -718,14 +709,6 @@ export default class TabDisks extends Component {
<Col mediumSize={5}> <Col mediumSize={5}>
<IsoDevice vm={vm} /> <IsoDevice vm={vm} />
</Col> </Col>
<Col mediumSize={1}>
<ActionButton
disabled={isEmpty(isoSrs)}
handler={this._rescanIsoSrs}
icon='refresh'
tooltip={_('rescanIsoSrs')}
/>
</Col>
</Row> </Row>
</Container> </Container>
) )