fix(xo-server/vm.delete): fix template handling (#3695)

Fixes #3498

It seems a recent version of XenServer forbids from destroying VM templates directly, we need to set `is_a_template` to `false` before calling `VM.destroy`.
This commit is contained in:
Julien Fontanet
2018-11-16 11:04:56 +01:00
committed by Pierre Donias
parent 82e4197237
commit 2934b23d2f
2 changed files with 18 additions and 8 deletions

View File

@@ -24,6 +24,7 @@
- [Backup NG] Errors listing backups on SMB remotes with extraneous files (PR [#3685](https://github.com/vatesfr/xen-orchestra/pull/3685))
- [Remotes] Don't expose credentials to users [#3682](https://github.com/vatesfr/xen-orchestra/issues/3682) (PR [#3687](https://github.com/vatesfr/xen-orchestra/pull/3687))
- [VM] Correctly display guest metrics updates (tools, network, etc.) [#3533](https://github.com/vatesfr/xen-orchestra/issues/3533) (PR [#3694](https://github.com/vatesfr/xen-orchestra/pull/3694))
- [VM Templates] Fix deletion [#3498](https://github.com/vatesfr/xen-orchestra/issues/3498) (PR [#3695](https://github.com/vatesfr/xen-orchestra/pull/3695))
### Released packages

View File

@@ -658,23 +658,32 @@ export default class Xapi extends XapiBase {
// ensure the vm record is up-to-date
vm = await this.barrier($ref)
if (!force && 'destroy' in vm.blocked_operations) {
throw forbiddenOperation('destroy', vm.blocked_operations.destroy.reason)
}
if (
!forceDeleteDefaultTemplate &&
vm.other_config.default_template === 'true'
) {
throw forbiddenOperation('destroy', 'VM is default template')
}
// It is necessary for suspended VMs to be shut down
// to be able to delete their VDIs.
if (vm.power_state !== 'Halted') {
await this.call('VM.hard_shutdown', $ref)
}
if (force) {
await this._updateObjectMapProperty(vm, 'blocked_operations', {
await Promise.all(
this.call('VM.set_is_a_template', vm.$ref, false),
this._updateObjectMapProperty(vm, 'blocked_operations', {
destroy: null,
})
}
if (forceDeleteDefaultTemplate) {
await this._updateObjectMapProperty(vm, 'other_config', {
}),
this._updateObjectMapProperty(vm, 'other_config', {
default_template: null,
})
}
)
// must be done before destroying the VM
const disks = getVmDisks(vm)