diff --git a/packages/xo-server/src/api/vm.js b/packages/xo-server/src/api/vm.js index 7df003f28..59a4a8591 100644 --- a/packages/xo-server/src/api/vm.js +++ b/packages/xo-server/src/api/vm.js @@ -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', ''], } // ------------------------------------------------------------------- diff --git a/packages/xo-web/src/common/iso-device.js b/packages/xo-web/src/common/iso-device.js index 0966434dc..820939df7 100644 --- a/packages/xo-web/src/common/iso-device.js +++ b/packages/xo-web/src/common/iso-device.js @@ -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 (