From a02d393457cd439fb828c730f6c5b6bb4bffe6b2 Mon Sep 17 00:00:00 2001 From: "Rajaa.BARHTAOUI" Date: Thu, 22 Feb 2018 15:42:43 +0000 Subject: [PATCH] fix(xo-web/VM): allow self-service user to insert CD (#2647) Fixes #2503 --- packages/xo-server/src/api/vm.js | 4 ++- packages/xo-web/src/common/iso-device.js | 32 +++++++++++++++++++----- 2 files changed, 29 insertions(+), 7 deletions(-) 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 (
-