From d52bed9618d8148de7dd39a9d0e9cef50cbb4c6a Mon Sep 17 00:00:00 2001 From: Pierre Donias Date: Tue, 30 Jan 2018 10:19:26 +0100 Subject: [PATCH] feat(vm/delete): force param to bypass blocked_operations (#648) See vatesfr/xo-web#2525 --- src/api/vm.js | 9 +++++++-- src/xapi/index.js | 13 ++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/api/vm.js b/src/api/vm.js index 001997514..e680f6a01 100644 --- a/src/api/vm.js +++ b/src/api/vm.js @@ -322,7 +322,7 @@ create.resolve = { // ------------------------------------------------------------------- -async function delete_ ({ vm, delete_disks: deleteDisks = false }) { +async function delete_ ({ vm, delete_disks: deleteDisks = false, force }) { const xapi = this.getXapi(vm) this.getAllAcls().then(acls => { @@ -365,7 +365,7 @@ async function delete_ ({ vm, delete_disks: deleteDisks = false }) { ) } - return xapi.deleteVm(vm._xapiId, deleteDisks) + return xapi.deleteVm(vm._xapiId, deleteDisks, force) } delete_.params = { @@ -375,6 +375,11 @@ delete_.params = { optional: true, type: 'boolean', }, + + force: { + optional: true, + type: 'boolean', + }, } delete_.resolve = { vm: ['id', ['VM', 'VM-snapshot', 'VM-template'], 'administrate'], diff --git a/src/xapi/index.js b/src/xapi/index.js index e4b4e191b..3c5e2c1fc 100644 --- a/src/xapi/index.js +++ b/src/xapi/index.js @@ -650,7 +650,7 @@ export default class Xapi extends XapiBase { })) } - async _deleteVm (vm, deleteDisks = true) { + async _deleteVm (vm, deleteDisks = true, force = false) { debug(`Deleting VM ${vm.name_label}`) const { $ref } = vm @@ -661,6 +661,12 @@ export default class Xapi extends XapiBase { await this.call('VM.hard_shutdown', $ref) } + if (force) { + await this._updateObjectMapProperty(vm, 'blocked_operations', { + destroy: null, + }) + } + // ensure the vm record is up-to-date vm = await this.barrier('VM', $ref) @@ -702,10 +708,11 @@ export default class Xapi extends XapiBase { ]) } - async deleteVm (vmId, deleteDisks) { + async deleteVm (vmId, deleteDisks, force) { return /* await */ this._deleteVm( this.getObject(vmId), - deleteDisks + deleteDisks, + force ) }