feat: differentiate PV drivers and management agent (#5007)
Fixes #4783
This commit is contained in:
parent
edc4414de4
commit
1bd504d67e
@ -12,6 +12,7 @@
|
||||
- [Plugin] Disable test plugin action when the plugin is not loaded (PR [#5038](https://github.com/vatesfr/xen-orchestra/pull/5038))
|
||||
- [Home/Template] Ability to copy/clone VM templates [#4734](https://github.com/vatesfr/xen-orchestra/issues/4734) (PR [#5006](https://github.com/vatesfr/xen-orchestra/pull/5006))
|
||||
- [VM/bulk copy] Add fast clone option (PR [#5006](https://github.com/vatesfr/xen-orchestra/pull/5006))
|
||||
- [VM] Differentiate PV drivers detection from management agent detection [#4783](https://github.com/vatesfr/xen-orchestra/issues/4783) (PR [#5007](https://github.com/vatesfr/xen-orchestra/pull/5007))
|
||||
|
||||
### Bug fixes
|
||||
|
||||
|
@ -58,6 +58,31 @@ function toTimestamp(date) {
|
||||
return ms === 0 ? null : Math.round(ms / 1000)
|
||||
}
|
||||
|
||||
// https://github.com/xenserver/xenadmin/blob/093ab0bcd6c4b3dd69da7b1e63ef34bb807c1ddb/XenModel/XenAPI-Extensions/VM.cs#L773-L827
|
||||
const getVmGuestToolsProps = vm => {
|
||||
const { $metrics: metrics, $guest_metrics: guestMetrics } = vm
|
||||
if (!isVmRunning(vm) || metrics === undefined || guestMetrics === undefined) {
|
||||
return {}
|
||||
}
|
||||
|
||||
const { major, minor } = guestMetrics.PV_drivers_version
|
||||
const hasPvVersion = major !== undefined && minor !== undefined
|
||||
|
||||
// "PV_drivers_detected" field doesn't exist on XS < 7
|
||||
const pvDriversDetected = guestMetrics.PV_drivers_detected ?? hasPvVersion
|
||||
|
||||
return {
|
||||
// Linux VMs don't have the flag "feature-static-ip-setting"
|
||||
managementAgentDetected:
|
||||
hasPvVersion || guestMetrics.other['feature-static-ip-setting'] === '1',
|
||||
pvDriversDetected,
|
||||
pvDriversVersion: hasPvVersion ? `${major}.${minor}` : undefined,
|
||||
pvDriversUpToDate: pvDriversDetected
|
||||
? guestMetrics.PV_drivers_up_to_date
|
||||
: undefined,
|
||||
}
|
||||
}
|
||||
|
||||
// ===================================================================
|
||||
|
||||
const TRANSFORMS = {
|
||||
@ -370,13 +395,9 @@ const TRANSFORMS = {
|
||||
VIFs: link(obj, 'VIFs'),
|
||||
virtualizationMode: domainType,
|
||||
|
||||
// <=> Are the Xen Server tools installed?
|
||||
//
|
||||
// - undefined: unknown status
|
||||
// - false: not optimized
|
||||
// - 'out of date': optimized but drivers should be updated
|
||||
// - 'up to date': optimized
|
||||
// deprecated, use pvDriversVersion instead
|
||||
xenTools,
|
||||
...getVmGuestToolsProps(obj),
|
||||
|
||||
// TODO: handle local VMs (`VM.get_possible_hosts()`).
|
||||
$container: isRunning ? link(obj, 'resident_on') : link(obj, 'pool'),
|
||||
|
@ -78,6 +78,7 @@ const messages = {
|
||||
offline: 'Offline',
|
||||
noLicenseAvailable: 'No license available',
|
||||
emailPlaceholderExample: 'Email address, e.g.: it@company.net',
|
||||
unknown: 'Unknown',
|
||||
|
||||
// ----- Modals -----
|
||||
alertOk: 'OK',
|
||||
@ -1009,6 +1010,9 @@ const messages = {
|
||||
|
||||
// ----- VM general tab -----
|
||||
noToolsDetected: 'No Xen tools detected',
|
||||
managementAgentDetected: 'Management agent {version} detected',
|
||||
managementAgentOutOfDate: 'Management agent {version} out of date',
|
||||
managementAgentNotDetected: 'Management agent not detected',
|
||||
noIpv4Record: 'No IPv4 record',
|
||||
noIpRecord: 'No IP record',
|
||||
started: 'Started {ago}',
|
||||
@ -1188,8 +1192,7 @@ const messages = {
|
||||
cpuCapLabel: 'CPU cap',
|
||||
defaultCpuCap: 'Default ({value, number})',
|
||||
pvArgsLabel: 'PV args',
|
||||
xenToolsStatus: 'Xen tools version',
|
||||
xenToolsNotInstalled: 'Not installed',
|
||||
managementAgentVersion: 'Management agent version',
|
||||
osName: 'OS name',
|
||||
osKernel: 'OS kernel',
|
||||
autoPowerOn: 'Auto power on',
|
||||
|
@ -42,7 +42,7 @@ export addSubscriptions from './add-subscriptions'
|
||||
|
||||
export const getVirtualizationModeLabel = vm => {
|
||||
const virtualizationMode =
|
||||
vm.virtualizationMode === 'hvm' && Boolean(vm.xenTools)
|
||||
vm.virtualizationMode === 'hvm' && vm.pvDriversDetected
|
||||
? 'pvhvm'
|
||||
: vm.virtualizationMode
|
||||
|
||||
|
@ -928,12 +928,8 @@ export default class TabAdvanced extends Component {
|
||||
<table className='table table-hover'>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{_('xenToolsStatus')}</th>
|
||||
<td>
|
||||
{vm.xenTools
|
||||
? `${vm.xenTools.major}.${vm.xenTools.minor}`
|
||||
: _('xenToolsNotInstalled')}
|
||||
</td>
|
||||
<th>{_('managementAgentVersion')}</th>
|
||||
<td>{defined(vm.pvDriversVersion, _('unknown'))}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>{_('osName')}</th>
|
||||
|
@ -1,6 +1,6 @@
|
||||
import _ from 'intl'
|
||||
import Copiable from 'copiable'
|
||||
import defined from '@xen-orchestra/defined'
|
||||
import defined, { get } from '@xen-orchestra/defined'
|
||||
import Icon from 'icon'
|
||||
import isEmpty from 'lodash/isEmpty'
|
||||
import map from 'lodash/map'
|
||||
@ -33,6 +33,62 @@ import {
|
||||
XvdSparkLines,
|
||||
} from 'xo-sparklines'
|
||||
|
||||
const GuestToolsDetection = ({ vm }) => {
|
||||
if (vm.power_state !== 'Running' || vm.pvDriversDetected === undefined) {
|
||||
return null
|
||||
}
|
||||
|
||||
if (!vm.pvDriversDetected) {
|
||||
return (
|
||||
<Row className='text-xs-center'>
|
||||
<Col>
|
||||
<Icon icon='error' /> <em>{_('noToolsDetected')}</em>
|
||||
</Col>
|
||||
</Row>
|
||||
)
|
||||
}
|
||||
|
||||
if (!vm.managementAgentDetected) {
|
||||
return (
|
||||
<Row className='text-xs-center'>
|
||||
<Col>
|
||||
<Icon icon='error' /> <em>{_('managementAgentNotDetected')}</em>
|
||||
</Col>
|
||||
</Row>
|
||||
)
|
||||
}
|
||||
|
||||
const version =
|
||||
get(() => vm.pvDriversVersion.split('.')[0]) > 0 ? vm.pvDriversVersion : ''
|
||||
|
||||
if (!vm.pvDriversUpToDate) {
|
||||
return (
|
||||
<Row className='text-xs-center'>
|
||||
<Col>
|
||||
<Icon color='text-warning' icon='alarm' />{' '}
|
||||
<em>
|
||||
{_('managementAgentOutOfDate', {
|
||||
version,
|
||||
})}
|
||||
</em>
|
||||
</Col>
|
||||
</Row>
|
||||
)
|
||||
}
|
||||
|
||||
return (
|
||||
<Row className='text-xs-center'>
|
||||
<Col>
|
||||
<em>
|
||||
{_('managementAgentDetected', {
|
||||
version,
|
||||
})}
|
||||
</em>
|
||||
</Col>
|
||||
</Row>
|
||||
)
|
||||
}
|
||||
|
||||
export default connectStore(() => {
|
||||
const getVgpus = createGetObjectsOfType('vgpu')
|
||||
.pick((_, { vm }) => vm.$VGPUs)
|
||||
@ -79,7 +135,6 @@ export default connectStore(() => {
|
||||
startTime,
|
||||
tags,
|
||||
VIFs: vifs,
|
||||
xenTools,
|
||||
} = vm
|
||||
return (
|
||||
<Container>
|
||||
@ -206,14 +261,7 @@ export default connectStore(() => {
|
||||
</BlockLink>
|
||||
</Col>
|
||||
</Row>
|
||||
{!xenTools && powerState === 'Running' && (
|
||||
<Row className='text-xs-center'>
|
||||
<Col>
|
||||
<Icon icon='error' />
|
||||
<em> {_('noToolsDetected')}.</em>
|
||||
</Col>
|
||||
</Row>
|
||||
)}
|
||||
<GuestToolsDetection vm={vm} />
|
||||
{/* TODO: use CSS style */}
|
||||
<br />
|
||||
<Row>
|
||||
|
Loading…
Reference in New Issue
Block a user