feat(xo-web/vm/advanced): set VCPUs-params:mask under Advanced (#3254)

Fixes #3241
This commit is contained in:
Rajaa.BARHTAOUI 2019-01-31 11:33:45 +01:00 committed by Pierre Donias
parent 94d36c3458
commit 1312df8c88
6 changed files with 56 additions and 1 deletions

View File

@ -20,6 +20,7 @@
- [SR] Display iscsi paths and mark the SR with a yellow dot if one path is not available. [#3659](https://github.com/vatesfr/xen-orchestra/issues/3659) (PR [#3829](https://github.com/vatesfr/xen-orchestra/pull/3829))
- [UI] Unifies the Signin buttons (PR [#3913](https://github.com/vatesfr/xen-orchestra/pull/3913))
- [Settings/remotes] NFS: display default option on placeholder [#3631](https://github.com/vatesfr/xen-orchestra/issues/3631) (PR [#3921](https://github.com/vatesfr/xen-orchestra/pull/3921))
- [VM/advanced] Ability to pin vCPU to physical cores [#3241](https://github.com/vatesfr/xen-orchestra/issues/3241) (PR [#3254](https://github.com/vatesfr/xen-orchestra/pull/3254))
### Bug fixes

View File

@ -587,6 +587,8 @@ set.params = {
// Kernel arguments for PV VM.
PV_args: { type: 'string', optional: true },
cpuMask: { type: 'array', optional: true },
cpuWeight: { type: ['integer', 'null'], optional: true },
cpuCap: { type: ['integer', 'null'], optional: true },

View File

@ -427,6 +427,7 @@ const TRANSFORMS = {
let tmp
if ((tmp = obj.VCPUs_params)) {
tmp.cap && (vm.cpuCap = +tmp.cap)
tmp.mask && (vm.cpuMask = tmp.mask.split(',').map(_ => +_))
tmp.weight && (vm.cpuWeight = +tmp.weight)
}

View File

@ -332,6 +332,15 @@ export default {
},
},
cpuMask: {
get: vm => vm.VCPUs_params.mask && vm.VCPUs_params.mask.split(','),
set(cpuMask, vm) {
return this._updateObjectMapProperty(vm, 'VCPUs_params', {
mask: cpuMask == null ? cpuMask : cpuMask.join(','),
})
},
},
cpusMax: 'cpusStaticMax',
cpusStaticMax: {
constraints: {

View File

@ -1071,6 +1071,8 @@ const messages = {
guestOsLabel: 'Guest OS',
miscLabel: 'Misc',
virtualizationMode: 'Virtualization mode',
cpuMaskLabel: 'CPU mask',
selectCpuMask: 'Select core(s)…',
cpuWeightLabel: 'CPU weight',
defaultCpuWeight: 'Default ({value, number})',
cpuCapLabel: 'CPU cap',

View File

@ -14,7 +14,13 @@ import { error } from 'notification'
import { confirm } from 'modal'
import { Container, Row, Col } from 'grid'
import { injectState, provideState } from 'reaclette'
import { Number, Size, Text, XoSelect } from 'editable'
import {
Number,
Select as EditableSelect,
Size,
Text,
XoSelect,
} from 'editable'
import { Select, Toggle } from 'form'
import {
SelectResourceSet,
@ -40,6 +46,7 @@ import {
isEmpty,
keyBy,
map,
times,
some,
uniq,
} from 'lodash'
@ -482,6 +489,27 @@ export default class TabAdvanced extends Component {
getVmsHaValues().then(vmsHaValues => this.setState({ vmsHaValues }))
}
_getCpuMaskOptions = createSelector(
() => this.props.vm,
vm =>
times(vm.CPUs.max, number => ({
value: number,
label: `Core ${number}`,
}))
)
_getCpuMask = createSelector(
this._getCpuMaskOptions,
() => this.props.vm.cpuMask,
(options, cpuMask) =>
cpuMask !== undefined
? options.filter(({ value }) => cpuMask.includes(value))
: undefined
)
_onChangeCpuMask = cpuMask =>
editVm(this.props.vm, { cpuMask: map(cpuMask, 'value') })
_onNicTypeChange = value =>
editVm(this.props.vm, { nicType: value === '' ? null : value })
@ -645,6 +673,18 @@ export default class TabAdvanced extends Component {
</td>
</tr>
)}
<tr>
<th>{_('cpuMaskLabel')}</th>
<td>
<EditableSelect
multi
onChange={this._onChangeCpuMask}
options={this._getCpuMaskOptions()}
placeholder={_('selectCpuMask')}
value={this._getCpuMask()}
/>
</td>
</tr>
<tr>
<th>{_('cpuWeightLabel')}</th>
<td>