'use strict' const assert = require('assert') const { formatFilenameDate } = require('./_filenameDate.js') const { importDeltaVm } = require('./_deltaVm.js') const { Task } = require('./Task.js') const { watchStreamSize } = require('./_watchStreamSize.js') exports.ImportVmBackup = class ImportVmBackup { constructor({ adapter, metadata, srUuid, xapi, settings: { newMacAddresses, mapVdisSrs = {} } = {} }) { this._adapter = adapter this._importDeltaVmSettings = { newMacAddresses, mapVdisSrs } this._metadata = metadata this._srUuid = srUuid this._xapi = xapi } async run() { const adapter = this._adapter const metadata = this._metadata const isFull = metadata.mode === 'full' const sizeContainer = { size: 0 } let backup if (isFull) { backup = await adapter.readFullVmBackup(metadata) watchStreamSize(backup, sizeContainer) } else { assert.strictEqual(metadata.mode, 'delta') const ignoredVdis = new Set( Object.entries(this._importDeltaVmSettings.mapVdisSrs) .filter(([_, srUuid]) => srUuid === null) .map(([vdiUuid]) => vdiUuid) ) backup = await adapter.readDeltaVmBackup(metadata, ignoredVdis) Object.values(backup.streams).forEach(stream => watchStreamSize(stream, sizeContainer)) } return Task.run( { name: 'transfer', }, async () => { const xapi = this._xapi const srRef = await xapi.call('SR.get_by_uuid', this._srUuid) const vmRef = isFull ? await xapi.VM_import(backup, srRef) : await importDeltaVm(backup, await xapi.getRecord('SR', srRef), { ...this._importDeltaVmSettings, detectBase: false, }) await Promise.all([ xapi.call('VM.add_tags', vmRef, 'restored from backup'), xapi.call( 'VM.set_name_label', vmRef, `${metadata.vm.name_label} (${formatFilenameDate(metadata.timestamp)})` ), ]) return { size: sizeContainer.size, id: await xapi.getField('VM', vmRef, 'uuid'), } } ) } }