chore(backups/DeltaReplication): unify base VM detection

Might help avoiding the *unable to find base VM* error.
This commit is contained in:
Julien Fontanet
2021-07-09 15:14:37 +02:00
parent 65e62018e6
commit 9139c5e9d6
3 changed files with 16 additions and 13 deletions

View File

@@ -44,7 +44,6 @@ exports.ImportVmBackup = class ImportVmBackup {
? await xapi.VM_import(backup, srRef)
: await importDeltaVm(backup, await xapi.getRecord('SR', srRef), {
...this._importDeltaVmSettings,
detectBase: false,
})
await Promise.all([

View File

@@ -143,7 +143,14 @@ exports.importDeltaVm = defer(async function importDeltaVm(
$defer,
deltaVm,
sr,
{ cancelToken = CancelToken.none, detectBase = true, mapVdisSrs = {}, newMacAddresses = false } = {}
{
// can be set to a specific VM
baseVm = false,
cancelToken = CancelToken.none,
mapVdisSrs = {},
newMacAddresses = false,
} = {}
) {
const { version } = deltaVm
if (compareVersions(version, '1.0.0') < 0) {
@@ -153,16 +160,8 @@ exports.importDeltaVm = defer(async function importDeltaVm(
const vmRecord = deltaVm.vm
const xapi = sr.$xapi
let baseVm
if (detectBase) {
const remoteBaseVmUuid = vmRecord.other_config[TAG_BASE_DELTA]
if (remoteBaseVmUuid) {
baseVm = find(xapi.objects.all, obj => (obj = obj.other_config) && obj[TAG_COPY_SRC] === remoteBaseVmUuid)
if (!baseVm) {
throw new Error(`could not find the base VM (copy of ${remoteBaseVmUuid})`)
}
}
if (!(baseVm === false || TAG_BASE_DELTA in vmRecord.other_config)) {
baseVm = undefined
}
const baseVdis = {}
@@ -230,7 +229,7 @@ exports.importDeltaVm = defer(async function importDeltaVm(
const vdi = vdiRecords[vdiRef]
let newVdi
const remoteBaseVdiUuid = detectBase && vdi.other_config[TAG_BASE_DELTA]
const remoteBaseVdiUuid = baseVm && vdi.other_config[TAG_BASE_DELTA]
if (remoteBaseVdiUuid) {
const baseVdi = find(baseVdis, vdi => vdi.other_config[TAG_COPY_SRC] === remoteBaseVdiUuid)
if (!baseVdi) {

View File

@@ -12,6 +12,8 @@ const { MixinReplicationWriter } = require('./_MixinReplicationWriter.js')
const { listReplicatedVms } = require('./_listReplicatedVms.js')
exports.DeltaReplicationWriter = class DeltaReplicationWriter extends MixinReplicationWriter(AbstractDeltaWriter) {
#baseVm
async checkBaseVdis(baseUuidToSrcVdi, baseVm) {
const sr = this._sr
const replicatedVm = listReplicatedVms(sr.$xapi, this._backup.job.id, sr.uuid, this._backup.vm.uuid).find(
@@ -21,6 +23,8 @@ exports.DeltaReplicationWriter = class DeltaReplicationWriter extends MixinRepli
return baseUuidToSrcVdi.clear()
}
this.#baseVm = replicatedVm
const xapi = replicatedVm.$xapi
const replicatedVdis = new Set(
await asyncMap(await replicatedVm.$getDisks(), async vdiRef => {
@@ -88,6 +92,7 @@ exports.DeltaReplicationWriter = class DeltaReplicationWriter extends MixinRepli
targetVmRef = await importDeltaVm(
{
__proto__: deltaExport,
baseVm: this.#baseVm,
vm: {
...deltaExport.vm,
tags: [...deltaExport.vm.tags, 'Continuous Replication'],