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