diff --git a/CHANGELOG.md b/CHANGELOG.md index 430ba86a5..9169e3188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ - [Pools] Filter GPU groups by pool [#3176](https://github.com/vatesfr/xen-orchestra/issues/3176) (PR [#3253](https://github.com/vatesfr/xen-orchestra/pull/3253)) - [Backup NG] Fix delta backups with SMB remotes [#3224](https://github.com/vatesfr/xen-orchestra/issues/3224) (PR [#3278](https://github.com/vatesfr/xen-orchestra/pull/3278)) - Fix VM restoration getting stuck on local SRs [#3245](https://github.com/vatesfr/xen-orchestra/issues/3245) (PR [#3243](https://github.com/vatesfr/xen-orchestra/pull/3243)) +- [New VM / Self] Filter out SRs that are not in the template's pool [#3068](https://github.com/vatesfr/xen-orchestra/issues/3068) (PR [#3070](https://github.com/vatesfr/xen-orchestra/pull/3070)) +- [New VM / Self] Fix 'unknown item' displayed in SR selector [#3267](https://github.com/vatesfr/xen-orchestra/issues/3267) (PR [#3070](https://github.com/vatesfr/xen-orchestra/pull/3070)) ### Released packages diff --git a/packages/xo-web/src/common/render-xo-item.js b/packages/xo-web/src/common/render-xo-item.js index 97f76536d..4afaca0ec 100644 --- a/packages/xo-web/src/common/render-xo-item.js +++ b/packages/xo-web/src/common/render-xo-item.js @@ -143,6 +143,32 @@ PoolItem.propTypes = XO_ITEM_PROP_TYPES // =================================================================== +export const SrResourceSetItem = [ + connectStore(() => { + const getSr = createGetObject() + return (state, props) => ({ + // true to bypass permissions as a self user + sr: getSr(state, props, true), + }) + }), + ({ sr, ...props }) => ( + + {() => ( + + {sr.name_label || sr.id} + {isSrWritable(sr) && ( + {` (${formatSize(sr.size - sr.physical_usage)} free)`} + )} + + )} + + ), +].reduceRight((value, decorator) => decorator(value)) + +SrResourceSetItem.propTypes = XO_ITEM_PROP_TYPES + +// =================================================================== + // Host, Network, VM-template. const PoolObjectItem = propTypes({ object: propTypes.object.isRequired, @@ -237,6 +263,7 @@ const xoItemToRender = { // SR. SR: ({ id }) => , + 'SR-resourceSet': ({ id }) => , // VM. VM: ({ id }) => , diff --git a/packages/xo-web/src/common/select-objects.js b/packages/xo-web/src/common/select-objects.js index 63d0e2db8..0458f2091 100644 --- a/packages/xo-web/src/common/select-objects.js +++ b/packages/xo-web/src/common/select-objects.js @@ -221,6 +221,11 @@ class GenericSelect extends React.Component { } // GroupBy: Display option with margin if not disabled and containers exists. + /* TODO: When all item components are implemented, change type to this: + type: this.props.resourceSet !== undefined && option.xoItem.type !== undefined + ? `${option.xoItem.type}-resourceSet` + : undefined + */ _renderOption = option => ( - {renderXoItem(option.xoItem)} + {renderXoItem(option.xoItem, { + type: + this.props.resourceSet && option.xoItem.type === 'SR' + ? 'SR-resourceSet' + : undefined, + })} ) @@ -790,13 +800,16 @@ export class SelectResourceSetsSr extends React.PureComponent { set value (value) { this.refs.select.value = value } - _getSrs = createSelector( - () => this.props.resourceSet, - ({ objectsByType }) => { - const { predicate } = this.props - const srs = objectsByType['SR'] - return sortBy(predicate ? filter(srs, predicate) : srs, 'name_label') - } + + _getSrs = createSort( + createFilter( + () => this.props.resourceSet.objectsByType.SR, + createSelector( + () => this.props.predicate, + predicate => predicate || (() => true) + ) + ), + 'name_label' ) render () { diff --git a/packages/xo-web/src/xo-app/new-vm/index.js b/packages/xo-web/src/xo-app/new-vm/index.js index 8ee779514..48c2e4ad9 100644 --- a/packages/xo-web/src/xo-app/new-vm/index.js +++ b/packages/xo-web/src/xo-app/new-vm/index.js @@ -549,10 +549,14 @@ export default class NewVm extends BaseComponent { _getSrPredicate = createSelector( this._getIsInPool, this._getIsInResourceSet, - (isInPool, isInResourceSet) => disk => - (isInResourceSet(disk.id) || isInPool(disk)) && + () => this.state.state.template, + () => this.props.pool === undefined, + (isInPool, isInResourceSet, template, self) => disk => + (self ? isInResourceSet(disk.id) : isInPool(disk)) && disk.content_type !== 'iso' && - disk.size > 0 + disk.size > 0 && + template !== undefined && + template.$pool === disk.$pool ) _getIsoPredicate = createSelector( () => this.props.pool && this.props.pool.id, @@ -715,7 +719,10 @@ export default class NewVm extends BaseComponent { resolveIds( filter( this._getResolvedResourceSet().objectsByType.SR, - this._getSrPredicate() + sr => + sr.$pool === template.$pool && + sr.content_type !== 'iso' && + sr.size > 0 ) ), defaultSr