From 68a94da44c0d3fba33e3ba9d5159618d19170e48 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Wed, 2 Aug 2017 12:41:20 +0200 Subject: [PATCH] feat(vm.deltaCopy): force param to bypass VDI chains check (#592) --- src/api/vm.coffee | 5 +++-- src/xapi/index.js | 11 ++++++++--- src/xo-mixins/backups.js | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/api/vm.coffee b/src/api/vm.coffee index 951c241e8..98bb370fe 100644 --- a/src/api/vm.coffee +++ b/src/api/vm.coffee @@ -755,11 +755,12 @@ exports.importDeltaBackup = importDeltaBackup #--------------------------------------------------------------------- -deltaCopy = ({ vm, sr }) -> @deltaCopyVm(vm, sr) +deltaCopy = ({ force, vm, sr }) -> @deltaCopyVm(vm, sr, force) deltaCopy.params = { id: { type: 'string' }, - sr: { type: 'string' } + sr: { type: 'string' }, + force: { type: 'boolean', optional: true } } deltaCopy.resolve = { diff --git a/src/xapi/index.js b/src/xapi/index.js index c41c1f673..9b7b91691 100644 --- a/src/xapi/index.js +++ b/src/xapi/index.js @@ -781,12 +781,17 @@ export default class Xapi extends XapiBase { @cancellable @deferrable.onFailure async exportDeltaVm ($onFailure, $cancelToken, vmId, baseVmId = undefined, { - snapshotNameLabel = undefined, + bypassVdiChainsCheck = false, + // Contains a vdi.$id set of vmId. fullVdisRequired = [], - disableBaseTags = false + + disableBaseTags = false, + snapshotNameLabel = undefined } = {}) { - this._assertHealthyVdiChains(this.getObject(vmId)) + if (!bypassVdiChainsCheck) { + this._assertHealthyVdiChains(this.getObject(vmId)) + } const vm = await this.snapshotVm(vmId) $onFailure(() => this._deleteVm(vm)) diff --git a/src/xo-mixins/backups.js b/src/xo-mixins/backups.js index 76380dd7c..b404273b2 100644 --- a/src/xo-mixins/backups.js +++ b/src/xo-mixins/backups.js @@ -398,7 +398,7 @@ export default class { // ----------------------------------------------------------------- @deferrable.onFailure - async deltaCopyVm ($onFailure, srcVm, targetSr) { + async deltaCopyVm ($onFailure, srcVm, targetSr, force = false) { const srcXapi = this._xo.getXapi(srcVm) const targetXapi = this._xo.getXapi(targetSr) @@ -420,6 +420,7 @@ export default class { const dstVm = await (async () => { const { cancel, token } = CancelToken.source() const delta = await srcXapi.exportDeltaVm(token, srcVm.$id, localBaseUuid, { + bypassVdiChainsCheck: force, snapshotNameLabel: `XO_DELTA_EXPORT: ${targetSr.name_label} (${targetSr.uuid})` }) $onFailure(() => srcXapi.deleteVm(delta.vm.uuid))