fix(xo-web/VM): allow self-service user to insert CD (#2647)

Fixes #2503
This commit is contained in:
Rajaa.BARHTAOUI 2018-02-22 15:42:43 +00:00 committed by Pierre Donias
parent 01a5963947
commit a02d393457
2 changed files with 29 additions and 7 deletions

View File

@ -411,7 +411,9 @@ insertCd.params = {
insertCd.resolve = {
vm: ['id', 'VM', 'operate'],
vdi: ['cd_id', 'VDI', 'view'],
// Not compatible with resource sets.
// FIXME: find a workaround.
vdi: ['cd_id', 'VDI', ''],
}
// -------------------------------------------------------------------

View File

@ -7,19 +7,23 @@ import Icon from 'icon'
import propTypes from './prop-types-decorator'
import Tooltip from 'tooltip'
import { alert } from 'modal'
import { connectStore } from './utils'
import { SelectVdi } from './select-objects'
import { isAdmin } from 'selectors'
import { SelectVdi, SelectResourceSetsVdi } from './select-objects'
import { addSubscriptions, connectStore, resolveResourceSet } from './utils'
import { ejectCd, insertCd, subscribeResourceSets } from './xo'
import {
createGetObjectsOfType,
createFinder,
createGetObject,
createSelector,
} from './selectors'
import { ejectCd, insertCd } from './xo'
@propTypes({
vm: propTypes.object.isRequired,
})
@addSubscriptions({
resourceSets: subscribeResourceSets,
})
@connectStore(() => {
const getCdDrive = createFinder(
createGetObjectsOfType('VBD').pick((_, { vm }) => vm.$VBDs),
@ -35,6 +39,7 @@ import { ejectCd, insertCd } from './xo'
return {
cdDrive: getCdDrive,
isAdmin,
mountedIso: getMountedIso,
}
})
@ -55,6 +60,17 @@ export default class IsoDevice extends Component {
}
)
_getResolvedResourceSet = createSelector(
createFinder(
() => this.props.resourceSets,
createSelector(
() => this.props.vm.resourceSet,
id => resourceSet => resourceSet.id === id
)
),
resolveResourceSet
)
_handleInsert = iso => {
const { vm } = this.props
@ -70,13 +86,17 @@ export default class IsoDevice extends Component {
_showWarning = () => alert(_('cdDriveNotInstalled'), _('cdDriveInstallation'))
render () {
const { cdDrive, mountedIso } = this.props
const { cdDrive, isAdmin, mountedIso } = this.props
const resourceSet = this._getResolvedResourceSet()
const useResourceSet = !(isAdmin || resourceSet === undefined)
const SelectVdi_ = useResourceSet ? SelectResourceSetsVdi : SelectVdi
return (
<div className='input-group'>
<SelectVdi
srPredicate={this._getPredicate()}
<SelectVdi_
onChange={this._handleInsert}
resourceSet={useResourceSet ? resourceSet : undefined}
srPredicate={this._getPredicate()}
value={mountedIso}
/>
<span className='input-group-btn'>