feat: differentiate PV drivers and management agent (#5007)

Fixes #4783
This commit is contained in:
badrAZ 2020-06-24 11:50:45 +02:00 committed by GitHub
parent edc4414de4
commit 1bd504d67e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 94 additions and 25 deletions

View File

@ -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

View File

@ -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'),

View File

@ -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',

View File

@ -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

View File

@ -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>

View File

@ -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>