From f94212729aa89dd3ce61a5503644902197f21689 Mon Sep 17 00:00:00 2001 From: Pierre Donias Date: Tue, 30 Jan 2018 10:48:04 +0100 Subject: [PATCH] feat: can force delete a VM if operation is blocked (#2598) Fixes #2525 --- src/common/intl/messages.js | 3 +++ src/common/xo/index.js | 42 +++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/common/intl/messages.js b/src/common/intl/messages.js index 2bbb4be3a..6dd7a57db 100644 --- a/src/common/intl/messages.js +++ b/src/common/intl/messages.js @@ -1199,6 +1199,9 @@ const messages = { deleteVmModalTitle: 'Delete VM', deleteVmModalMessage: 'Are you sure you want to delete this VM? ALL VM DISKS WILL BE REMOVED', + deleteVmBlockedModalTitle: 'Blocked operation', + deleteVmBlockedModalMessage: + 'Removing the VM is a blocked operation. Would you like to remove it anyway?', migrateVmModalTitle: 'Migrate VM', migrateVmSelectHost: 'Select a destination host:', migrateVmSelectMigrationNetwork: 'Select a migration network:', diff --git a/src/common/xo/index.js b/src/common/xo/index.js index a3e291694..a24cd3e98 100644 --- a/src/common/xo/index.js +++ b/src/common/xo/index.js @@ -944,11 +944,7 @@ export const deleteTemplates = templates => body: _('templateDeleteModalBody', { templates: templates.length }), }).then( () => - Promise.all( - map(resolveIds(templates), id => - _call('vm.delete', { id, delete_disks: true }) - ) - ), + Promise.all(map(resolveIds(templates), id => _call('vm.delete', { id }))), noop ) @@ -964,10 +960,7 @@ export const deleteSnapshot = vm => confirm({ title: _('deleteSnapshotModalTitle'), body: _('deleteSnapshotModalMessage'), - }).then( - () => _call('vm.delete', { id: resolveId(vm), delete_disks: true }), - noop - ) + }).then(() => _call('vm.delete', { id: resolveId(vm) }), noop) export const deleteSnapshots = vms => confirm({ @@ -975,11 +968,7 @@ export const deleteSnapshots = vms => body: _('deleteSnapshotsModalMessage', { nVms: vms.length }), }).then( () => - Promise.all( - map(vms, vm => - _call('vm.delete', { id: resolveId(vm), delete_disks: true }) - ) - ), + Promise.all(map(vms, vm => _call('vm.delete', { id: resolveId(vm) }))), noop ) @@ -1053,14 +1042,25 @@ export const createVms = (args, nameLabels) => export const getCloudInitConfig = template => _call('vm.getCloudInitConfig', { template }) -export const deleteVm = vm => +export const deleteVm = (vm, retryWithForce = true) => confirm({ title: _('deleteVmModalTitle'), body: _('deleteVmModalMessage'), - }).then( - () => _call('vm.delete', { id: resolveId(vm), delete_disks: true }), - noop - ) + }) + .then(() => _call('vm.delete', { id: resolveId(vm) }), noop) + .catch(error => { + if (forbiddenOperation.is(error) || !retryWithForce) { + throw error + } + + return confirm({ + title: _('deleteVmBlockedModalTitle'), + body: _('deleteVmBlockedModalMessage'), + }).then( + () => _call('vm.delete', { id: resolveId(vm), force: true }), + noop + ) + }) export const deleteVms = vms => confirm({ @@ -1072,7 +1072,9 @@ export const deleteVms = vms => }, }).then( () => - map(vms, vmId => _call('vm.delete', { id: vmId, delete_disks: true })), + Promise.all( + map(vms, vmId => _call('vm.delete', { id: resolveId(vmId) })) + ), noop )