fix(xo-web/New VM): filter out SRs that are not in the template's pool (#3070)
Fixes #3068, fixes #3267
This commit is contained in:
parent
561a9f140d
commit
7dc0c4cf15
@ -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
|
||||
|
||||
|
@ -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 }) => (
|
||||
<XoItem item={sr} to={sr !== undefined && `/srs/${sr.id}`} {...props}>
|
||||
{() => (
|
||||
<span>
|
||||
<Icon icon='sr' /> {sr.name_label || sr.id}
|
||||
{isSrWritable(sr) && (
|
||||
<span>{` (${formatSize(sr.size - sr.physical_usage)} free)`}</span>
|
||||
)}
|
||||
</span>
|
||||
)}
|
||||
</XoItem>
|
||||
),
|
||||
].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 }) => <SrItem id={id} />,
|
||||
'SR-resourceSet': ({ id }) => <SrResourceSetItem id={id} />,
|
||||
|
||||
// VM.
|
||||
VM: ({ id }) => <VmItem id={id} />,
|
||||
|
@ -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 => (
|
||||
<span
|
||||
className={
|
||||
@ -229,7 +234,12 @@ class GenericSelect extends React.Component {
|
||||
: undefined
|
||||
}
|
||||
>
|
||||
{renderXoItem(option.xoItem)}
|
||||
{renderXoItem(option.xoItem, {
|
||||
type:
|
||||
this.props.resourceSet && option.xoItem.type === 'SR'
|
||||
? 'SR-resourceSet'
|
||||
: undefined,
|
||||
})}
|
||||
</span>
|
||||
)
|
||||
|
||||
@ -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 () {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user