@xen-orchestra/backups 0.38.3 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{Backup.js → Backup.mjs} +4 -6
- package/{DurablePartition.js → DurablePartition.mjs} +2 -4
- package/{HealthCheckVmBackup.js → HealthCheckVmBackup.mjs} +2 -4
- package/{ImportVmBackup.js → ImportVmBackup.mjs} +6 -8
- package/{RemoteAdapter.js → RemoteAdapter.mjs} +69 -76
- package/{RestoreMetadataBackup.js → RestoreMetadataBackup.mjs} +6 -5
- package/{Task.js → Task.mjs} +3 -6
- package/_backupType.mjs +4 -0
- package/{_backupWorker.js → _backupWorker.mjs} +22 -22
- package/{_cancelableMap.js → _cancelableMap.mjs} +3 -5
- package/{_cleanVm.js → _cleanVm.mjs} +16 -19
- package/_filenameDate.mjs +6 -0
- package/{_getOldEntries.js → _getOldEntries.mjs} +1 -3
- package/{_getTmpDir.js → _getTmpDir.mjs} +5 -7
- package/_getVmBackupDir.mjs +5 -0
- package/{_incrementalVm.js → _incrementalVm.mjs} +21 -20
- package/{_isValidXva.js → _isValidXva.mjs} +2 -5
- package/{_listPartitions.js → _listPartitions.mjs} +6 -9
- package/{_lvm.js → _lvm.mjs} +5 -7
- package/_runners/{Metadata.js → Metadata.mjs} +10 -12
- package/_runners/{VmsRemote.js → VmsRemote.mjs} +12 -14
- package/_runners/{VmsXapi.js → VmsXapi.mjs} +14 -15
- package/_runners/{_Abstract.js → _Abstract.mjs} +7 -9
- package/_runners/{_PoolMetadataBackup.js → _PoolMetadataBackup.mjs} +7 -10
- package/_runners/{_RemoteTimeoutError.js → _RemoteTimeoutError.mjs} +1 -3
- package/_runners/{_XoMetadataBackup.js → _XoMetadataBackup.mjs} +11 -9
- package/_runners/{_createStreamThrottle.js → _createStreamThrottle.mjs} +4 -6
- package/_runners/{_forkStreamUnpipe.js → _forkStreamUnpipe.mjs} +4 -5
- package/_runners/{_getAdaptersByRemote.js → _getAdaptersByRemote.mjs} +1 -3
- package/_runners/_runTask.mjs +5 -0
- package/_runners/_vmRunners/{FullRemote.js → FullRemote.mjs} +9 -12
- package/_runners/_vmRunners/{FullXapi.js → FullXapi.mjs} +7 -9
- package/_runners/_vmRunners/{IncrementalRemote.js → IncrementalRemote.mjs} +11 -12
- package/_runners/_vmRunners/{IncrementalXapi.js → IncrementalXapi.mjs} +18 -20
- package/_runners/_vmRunners/{_Abstract.js → _Abstract.mjs} +4 -6
- package/_runners/_vmRunners/{_AbstractRemote.js → _AbstractRemote.mjs} +6 -6
- package/_runners/_vmRunners/{_AbstractXapi.js → _AbstractXapi.mjs} +14 -17
- package/_runners/_vmRunners/_forkDeltaExport.mjs +11 -0
- package/_runners/_writers/{FullRemoteWriter.js → FullRemoteWriter.mjs} +6 -8
- package/_runners/_writers/{FullXapiWriter.js → FullXapiWriter.mjs} +10 -12
- package/_runners/_writers/{IncrementalRemoteWriter.js → IncrementalRemoteWriter.mjs} +31 -28
- package/_runners/_writers/{IncrementalXapiWriter.js → IncrementalXapiWriter.mjs} +11 -13
- package/_runners/_writers/{_AbstractFullWriter.js → _AbstractFullWriter.mjs} +2 -4
- package/_runners/_writers/{_AbstractIncrementalWriter.js → _AbstractIncrementalWriter.mjs} +2 -4
- package/_runners/_writers/{_AbstractWriter.js → _AbstractWriter.mjs} +3 -5
- package/_runners/_writers/{_MixinRemoteWriter.js → _MixinRemoteWriter.mjs} +10 -12
- package/_runners/_writers/_MixinXapiWriter.mjs +72 -0
- package/_runners/_writers/_checkVhd.mjs +6 -0
- package/_runners/_writers/{_listReplicatedVms.js → _listReplicatedVms.mjs} +1 -3
- package/_runners/_writers/{_packUuid.js → _packUuid.mjs} +1 -3
- package/{_watchStreamSize.js → _watchStreamSize.mjs} +1 -3
- package/{extractIdsFromSimplePattern.js → extractIdsFromSimplePattern.mjs} +1 -3
- package/{formatVmBackups.js → formatVmBackups.mjs} +3 -5
- package/merge-worker/{cli.js → cli.mjs} +9 -11
- package/merge-worker/{index.js → index.mjs} +6 -7
- package/package.json +10 -8
- package/{parseMetadataBackupId.js → parseMetadataBackupId.mjs} +2 -4
- package/{runBackupWorker.js → runBackupWorker.mjs} +4 -7
- package/_backupType.js +0 -6
- package/_filenameDate.js +0 -8
- package/_getVmBackupDir.js +0 -8
- package/_runners/_runTask.js +0 -6
- package/_runners/_vmRunners/_forkDeltaExport.js +0 -12
- package/_runners/_writers/_MixinXapiWriter.js +0 -46
- package/_runners/_writers/_checkVhd.js +0 -8
|
@@ -1,22 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
2
|
+
import Disposable from 'promise-toolbox/Disposable'
|
|
3
|
+
import ignoreErrors from 'promise-toolbox/ignoreErrors'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const { XoMetadataBackup } = require('./_XoMetadataBackup.js')
|
|
10
|
-
const { DEFAULT_SETTINGS, Abstract } = require('./_Abstract.js')
|
|
11
|
-
const { runTask } = require('./_runTask.js')
|
|
12
|
-
const { getAdaptersByRemote } = require('./_getAdaptersByRemote.js')
|
|
5
|
+
import { extractIdsFromSimplePattern } from '../extractIdsFromSimplePattern.mjs'
|
|
6
|
+
import { PoolMetadataBackup } from './_PoolMetadataBackup.mjs'
|
|
7
|
+
import { XoMetadataBackup } from './_XoMetadataBackup.mjs'
|
|
8
|
+
import { DEFAULT_SETTINGS, Abstract } from './_Abstract.mjs'
|
|
9
|
+
import { runTask } from './_runTask.mjs'
|
|
10
|
+
import { getAdaptersByRemote } from './_getAdaptersByRemote.mjs'
|
|
13
11
|
|
|
14
12
|
const DEFAULT_METADATA_SETTINGS = {
|
|
15
13
|
retentionPoolMetadata: 0,
|
|
16
14
|
retentionXoMetadata: 0,
|
|
17
15
|
}
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
export const Metadata = class MetadataBackupRunner extends Abstract {
|
|
20
18
|
_computeBaseSettings(config, job) {
|
|
21
19
|
const baseSettings = { ...DEFAULT_SETTINGS }
|
|
22
20
|
Object.assign(baseSettings, DEFAULT_METADATA_SETTINGS, config.defaultSettings, config.metadata?.defaultSettings)
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import { asyncMapSettled } from '@xen-orchestra/async-map'
|
|
2
|
+
import Disposable from 'promise-toolbox/Disposable'
|
|
3
|
+
import { limitConcurrency } from 'limit-concurrency-decorator'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const { runTask } = require('./_runTask.js')
|
|
12
|
-
const { getAdaptersByRemote } = require('./_getAdaptersByRemote.js')
|
|
13
|
-
const { FullRemote } = require('./_vmRunners/FullRemote.js')
|
|
14
|
-
const { IncrementalRemote } = require('./_vmRunners/IncrementalRemote.js')
|
|
5
|
+
import { extractIdsFromSimplePattern } from '../extractIdsFromSimplePattern.mjs'
|
|
6
|
+
import { Task } from '../Task.mjs'
|
|
7
|
+
import createStreamThrottle from './_createStreamThrottle.mjs'
|
|
8
|
+
import { DEFAULT_SETTINGS, Abstract } from './_Abstract.mjs'
|
|
9
|
+
import { runTask } from './_runTask.mjs'
|
|
10
|
+
import { getAdaptersByRemote } from './_getAdaptersByRemote.mjs'
|
|
11
|
+
import { FullRemote } from './_vmRunners/FullRemote.mjs'
|
|
12
|
+
import { IncrementalRemote } from './_vmRunners/IncrementalRemote.mjs'
|
|
15
13
|
|
|
16
14
|
const DEFAULT_REMOTE_VM_SETTINGS = {
|
|
17
15
|
concurrency: 2,
|
|
@@ -27,7 +25,7 @@ const DEFAULT_REMOTE_VM_SETTINGS = {
|
|
|
27
25
|
vmTimeout: 0,
|
|
28
26
|
}
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
export const VmsRemote = class RemoteVmsBackupRunner extends Abstract {
|
|
31
29
|
_computeBaseSettings(config, job) {
|
|
32
30
|
const baseSettings = { ...DEFAULT_SETTINGS }
|
|
33
31
|
Object.assign(baseSettings, DEFAULT_REMOTE_VM_SETTINGS, config.defaultSettings, config.vm?.defaultSettings)
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const { IncrementalXapi } = require('./_vmRunners/IncrementalXapi.js')
|
|
14
|
-
const { FullXapi } = require('./_vmRunners/FullXapi.js')
|
|
1
|
+
import { asyncMapSettled } from '@xen-orchestra/async-map'
|
|
2
|
+
import Disposable from 'promise-toolbox/Disposable'
|
|
3
|
+
import { limitConcurrency } from 'limit-concurrency-decorator'
|
|
4
|
+
|
|
5
|
+
import { extractIdsFromSimplePattern } from '../extractIdsFromSimplePattern.mjs'
|
|
6
|
+
import { Task } from '../Task.mjs'
|
|
7
|
+
import createStreamThrottle from './_createStreamThrottle.mjs'
|
|
8
|
+
import { DEFAULT_SETTINGS, Abstract } from './_Abstract.mjs'
|
|
9
|
+
import { runTask } from './_runTask.mjs'
|
|
10
|
+
import { getAdaptersByRemote } from './_getAdaptersByRemote.mjs'
|
|
11
|
+
import { IncrementalXapi } from './_vmRunners/IncrementalXapi.mjs'
|
|
12
|
+
import { FullXapi } from './_vmRunners/FullXapi.mjs'
|
|
15
13
|
|
|
16
14
|
const DEFAULT_XAPI_VM_SETTINGS = {
|
|
17
15
|
bypassVdiChainsCheck: false,
|
|
@@ -19,6 +17,7 @@ const DEFAULT_XAPI_VM_SETTINGS = {
|
|
|
19
17
|
concurrency: 2,
|
|
20
18
|
copyRetention: 0,
|
|
21
19
|
deleteFirst: false,
|
|
20
|
+
diskPerVmConcurrency: 0, // not limited by default
|
|
22
21
|
exportRetention: 0,
|
|
23
22
|
fullInterval: 0,
|
|
24
23
|
healthCheckSr: undefined,
|
|
@@ -35,7 +34,7 @@ const DEFAULT_XAPI_VM_SETTINGS = {
|
|
|
35
34
|
vmTimeout: 0,
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
export const VmsXapi = class VmsXapiBackupRunner extends Abstract {
|
|
39
38
|
_computeBaseSettings(config, job) {
|
|
40
39
|
const baseSettings = { ...DEFAULT_SETTINGS }
|
|
41
40
|
Object.assign(baseSettings, DEFAULT_XAPI_VM_SETTINGS, config.defaultSettings, config.vm?.defaultSettings)
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import Disposable from 'promise-toolbox/Disposable'
|
|
2
|
+
import pTimeout from 'promise-toolbox/timeout'
|
|
3
|
+
import { compileTemplate } from '@xen-orchestra/template'
|
|
4
|
+
import { runTask } from './_runTask.mjs'
|
|
5
|
+
import { RemoteTimeoutError } from './_RemoteTimeoutError.mjs'
|
|
2
6
|
|
|
3
|
-
const
|
|
4
|
-
const pTimeout = require('promise-toolbox/timeout')
|
|
5
|
-
const { compileTemplate } = require('@xen-orchestra/template')
|
|
6
|
-
const { runTask } = require('./_runTask.js')
|
|
7
|
-
const { RemoteTimeoutError } = require('./_RemoteTimeoutError.js')
|
|
8
|
-
|
|
9
|
-
exports.DEFAULT_SETTINGS = {
|
|
7
|
+
export const DEFAULT_SETTINGS = {
|
|
10
8
|
getRemoteTimeout: 300e3,
|
|
11
9
|
reportWhen: 'failure',
|
|
12
10
|
}
|
|
13
11
|
|
|
14
|
-
|
|
12
|
+
export const Abstract = class AbstractRunner {
|
|
15
13
|
constructor({ config, getAdapter, getConnectedRecord, job, schedule }) {
|
|
16
14
|
this._config = config
|
|
17
15
|
this._getRecord = getConnectedRecord
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import { DIR_XO_POOL_METADATA_BACKUPS } from '../RemoteAdapter.mjs'
|
|
4
|
+
import { forkStreamUnpipe } from './_forkStreamUnpipe.mjs'
|
|
5
|
+
import { formatFilenameDate } from '../_filenameDate.mjs'
|
|
6
|
+
import { Task } from '../Task.mjs'
|
|
4
7
|
|
|
5
|
-
const
|
|
6
|
-
const { forkStreamUnpipe } = require('./_forkStreamUnpipe.js')
|
|
7
|
-
const { formatFilenameDate } = require('../_filenameDate.js')
|
|
8
|
-
const { Task } = require('../Task.js')
|
|
8
|
+
export const PATH_DB_DUMP = '/pool/xmldbdump'
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
exports.PATH_DB_DUMP = PATH_DB_DUMP
|
|
12
|
-
|
|
13
|
-
exports.PoolMetadataBackup = class PoolMetadataBackup {
|
|
10
|
+
export class PoolMetadataBackup {
|
|
14
11
|
constructor({ config, job, pool, remoteAdapters, schedule, settings }) {
|
|
15
12
|
this._config = config
|
|
16
13
|
this._job = job
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
class RemoteTimeoutError extends Error {
|
|
1
|
+
export class RemoteTimeoutError extends Error {
|
|
3
2
|
constructor(remoteId) {
|
|
4
3
|
super('timeout while getting the remote ' + remoteId)
|
|
5
4
|
this.remoteId = remoteId
|
|
6
5
|
}
|
|
7
6
|
}
|
|
8
|
-
exports.RemoteTimeoutError = RemoteTimeoutError
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
2
|
+
import { join } from '@xen-orchestra/fs/path'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
import { DIR_XO_CONFIG_BACKUPS } from '../RemoteAdapter.mjs'
|
|
5
|
+
import { formatFilenameDate } from '../_filenameDate.mjs'
|
|
6
|
+
import { Task } from '../Task.mjs'
|
|
4
7
|
|
|
5
|
-
|
|
6
|
-
const { formatFilenameDate } = require('../_filenameDate.js')
|
|
7
|
-
const { Task } = require('../Task.js')
|
|
8
|
-
|
|
9
|
-
exports.XoMetadataBackup = class XoMetadataBackup {
|
|
8
|
+
export class XoMetadataBackup {
|
|
10
9
|
constructor({ config, job, remoteAdapters, schedule, settings }) {
|
|
11
10
|
this._config = config
|
|
12
11
|
this._job = job
|
|
@@ -23,10 +22,11 @@ exports.XoMetadataBackup = class XoMetadataBackup {
|
|
|
23
22
|
const dir = `${scheduleDir}/${formatFilenameDate(timestamp)}`
|
|
24
23
|
|
|
25
24
|
const data = job.xoMetadata
|
|
26
|
-
const
|
|
25
|
+
const dataBaseName = './data.json'
|
|
27
26
|
|
|
28
27
|
const metadata = JSON.stringify(
|
|
29
28
|
{
|
|
29
|
+
data: dataBaseName,
|
|
30
30
|
jobId: job.id,
|
|
31
31
|
jobName: job.name,
|
|
32
32
|
scheduleId: schedule.id,
|
|
@@ -36,6 +36,8 @@ exports.XoMetadataBackup = class XoMetadataBackup {
|
|
|
36
36
|
null,
|
|
37
37
|
2
|
|
38
38
|
)
|
|
39
|
+
|
|
40
|
+
const dataFileName = join(dir, dataBaseName)
|
|
39
41
|
const metaDataFileName = `${dir}/metadata.json`
|
|
40
42
|
|
|
41
43
|
await asyncMap(
|
|
@@ -52,7 +54,7 @@ exports.XoMetadataBackup = class XoMetadataBackup {
|
|
|
52
54
|
async () => {
|
|
53
55
|
const handler = adapter.handler
|
|
54
56
|
const dirMode = this._config.dirMode
|
|
55
|
-
await handler.outputFile(
|
|
57
|
+
await handler.outputFile(dataFileName, data, { dirMode })
|
|
56
58
|
await handler.outputFile(metaDataFileName, metadata, {
|
|
57
59
|
dirMode,
|
|
58
60
|
})
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { ThrottleGroup } = require('@kldzj/stream-throttle')
|
|
5
|
-
const identity = require('lodash/identity.js')
|
|
1
|
+
import { pipeline } from 'node:stream'
|
|
2
|
+
import { ThrottleGroup } from '@kldzj/stream-throttle'
|
|
3
|
+
import identity from 'lodash/identity.js'
|
|
6
4
|
|
|
7
5
|
const noop = Function.prototype
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
export default function createStreamThrottle(rate) {
|
|
10
8
|
if (rate === 0) {
|
|
11
9
|
return identity
|
|
12
10
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
import { createLogger } from '@xen-orchestra/log'
|
|
2
|
+
import { finished, PassThrough } from 'node:stream'
|
|
2
3
|
|
|
3
|
-
const {
|
|
4
|
-
|
|
5
|
-
const { debug } = require('@xen-orchestra/log').createLogger('xo:backups:forkStreamUnpipe')
|
|
4
|
+
const { debug } = createLogger('xo:backups:forkStreamUnpipe')
|
|
6
5
|
|
|
7
6
|
// create a new readable stream from an existing one which may be piped later
|
|
8
7
|
//
|
|
9
8
|
// in case of error in the new readable stream, it will simply be unpiped
|
|
10
9
|
// from the original one
|
|
11
|
-
|
|
10
|
+
export function forkStreamUnpipe(source) {
|
|
12
11
|
const { forks = 0 } = source
|
|
13
12
|
source.forks = forks + 1
|
|
14
13
|
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
const getAdaptersByRemote = adapters => {
|
|
1
|
+
export function getAdaptersByRemote(adapters) {
|
|
3
2
|
const adaptersByRemote = {}
|
|
4
3
|
adapters.forEach(({ adapter, remoteId }) => {
|
|
5
4
|
adaptersByRemote[remoteId] = adapter
|
|
6
5
|
})
|
|
7
6
|
return adaptersByRemote
|
|
8
7
|
}
|
|
9
|
-
exports.getAdaptersByRemote = getAdaptersByRemote
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { decorateMethodsWith } from '@vates/decorate-with'
|
|
2
|
+
import { defer } from 'golike-defer'
|
|
3
|
+
import { AbstractRemote } from './_AbstractRemote.mjs'
|
|
4
|
+
import { FullRemoteWriter } from '../_writers/FullRemoteWriter.mjs'
|
|
5
|
+
import { forkStreamUnpipe } from '../_forkStreamUnpipe.mjs'
|
|
6
|
+
import { watchStreamSize } from '../../_watchStreamSize.mjs'
|
|
7
|
+
import { Task } from '../../Task.mjs'
|
|
2
8
|
|
|
3
|
-
const
|
|
4
|
-
const { defer } = require('golike-defer')
|
|
5
|
-
const { AbstractRemote } = require('./_AbstractRemote')
|
|
6
|
-
const { FullRemoteWriter } = require('../_writers/FullRemoteWriter')
|
|
7
|
-
const { forkStreamUnpipe } = require('../_forkStreamUnpipe')
|
|
8
|
-
const { watchStreamSize } = require('../../_watchStreamSize')
|
|
9
|
-
const { Task } = require('../../Task')
|
|
10
|
-
|
|
11
|
-
class FullRemoteVmBackupRunner extends AbstractRemote {
|
|
9
|
+
export const FullRemote = class FullRemoteVmBackupRunner extends AbstractRemote {
|
|
12
10
|
_getRemoteWriter() {
|
|
13
11
|
return FullRemoteWriter
|
|
14
12
|
}
|
|
@@ -47,7 +45,6 @@ class FullRemoteVmBackupRunner extends AbstractRemote {
|
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
|
|
50
|
-
|
|
51
|
-
decorateMethodsWith(FullRemoteVmBackupRunner, {
|
|
48
|
+
decorateMethodsWith(FullRemote, {
|
|
52
49
|
_run: defer,
|
|
53
50
|
})
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import { createLogger } from '@xen-orchestra/log'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const { watchStreamSize } = require('../../_watchStreamSize.js')
|
|
9
|
-
const { AbstractXapi } = require('./_AbstractXapi.js')
|
|
3
|
+
import { forkStreamUnpipe } from '../_forkStreamUnpipe.mjs'
|
|
4
|
+
import { FullRemoteWriter } from '../_writers/FullRemoteWriter.mjs'
|
|
5
|
+
import { FullXapiWriter } from '../_writers/FullXapiWriter.mjs'
|
|
6
|
+
import { watchStreamSize } from '../../_watchStreamSize.mjs'
|
|
7
|
+
import { AbstractXapi } from './_AbstractXapi.mjs'
|
|
10
8
|
|
|
11
9
|
const { debug } = createLogger('xo:backups:FullXapiVmBackup')
|
|
12
10
|
|
|
13
|
-
|
|
11
|
+
export const FullXapi = class FullXapiVmBackupRunner extends AbstractXapi {
|
|
14
12
|
_getWriters() {
|
|
15
13
|
return [FullRemoteWriter, FullXapiWriter]
|
|
16
14
|
}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { asyncEach } from '@vates/async-each'
|
|
2
|
+
import { decorateMethodsWith } from '@vates/decorate-with'
|
|
3
|
+
import { defer } from 'golike-defer'
|
|
4
|
+
import assert from 'node:assert'
|
|
5
|
+
import isVhdDifferencingDisk from 'vhd-lib/isVhdDifferencingDisk.js'
|
|
6
|
+
import mapValues from 'lodash/mapValues.js'
|
|
3
7
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const { AbstractRemote } = require('./_AbstractRemote')
|
|
9
|
-
const { IncrementalRemoteWriter } = require('../_writers/IncrementalRemoteWriter')
|
|
10
|
-
const { forkDeltaExport } = require('./_forkDeltaExport')
|
|
11
|
-
const isVhdDifferencingDisk = require('vhd-lib/isVhdDifferencingDisk')
|
|
12
|
-
const { asyncEach } = require('@vates/async-each')
|
|
8
|
+
import { AbstractRemote } from './_AbstractRemote.mjs'
|
|
9
|
+
import { forkDeltaExport } from './_forkDeltaExport.mjs'
|
|
10
|
+
import { IncrementalRemoteWriter } from '../_writers/IncrementalRemoteWriter.mjs'
|
|
11
|
+
import { Task } from '../../Task.mjs'
|
|
13
12
|
|
|
14
13
|
class IncrementalRemoteVmBackupRunner extends AbstractRemote {
|
|
15
14
|
_getRemoteWriter() {
|
|
@@ -61,7 +60,7 @@ class IncrementalRemoteVmBackupRunner extends AbstractRemote {
|
|
|
61
60
|
}
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
|
|
63
|
+
export const IncrementalRemote = IncrementalRemoteVmBackupRunner
|
|
65
64
|
decorateMethodsWith(IncrementalRemoteVmBackupRunner, {
|
|
66
65
|
_run: defer,
|
|
67
66
|
})
|
|
@@ -1,28 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const isVhdDifferencingDisk = require('vhd-lib/isVhdDifferencingDisk')
|
|
19
|
-
const { asyncEach } = require('@vates/async-each')
|
|
1
|
+
import { asyncEach } from '@vates/async-each'
|
|
2
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
3
|
+
import { createLogger } from '@xen-orchestra/log'
|
|
4
|
+
import { pipeline } from 'node:stream'
|
|
5
|
+
import findLast from 'lodash/findLast.js'
|
|
6
|
+
import isVhdDifferencingDisk from 'vhd-lib/isVhdDifferencingDisk.js'
|
|
7
|
+
import keyBy from 'lodash/keyBy.js'
|
|
8
|
+
import mapValues from 'lodash/mapValues.js'
|
|
9
|
+
import vhdStreamValidator from 'vhd-lib/vhdStreamValidator.js'
|
|
10
|
+
|
|
11
|
+
import { AbstractXapi } from './_AbstractXapi.mjs'
|
|
12
|
+
import { exportIncrementalVm } from '../../_incrementalVm.mjs'
|
|
13
|
+
import { forkDeltaExport } from './_forkDeltaExport.mjs'
|
|
14
|
+
import { IncrementalRemoteWriter } from '../_writers/IncrementalRemoteWriter.mjs'
|
|
15
|
+
import { IncrementalXapiWriter } from '../_writers/IncrementalXapiWriter.mjs'
|
|
16
|
+
import { Task } from '../../Task.mjs'
|
|
17
|
+
import { watchStreamSize } from '../../_watchStreamSize.mjs'
|
|
20
18
|
|
|
21
19
|
const { debug } = createLogger('xo:backups:IncrementalXapiVmBackup')
|
|
22
20
|
|
|
23
21
|
const noop = Function.prototype
|
|
24
22
|
|
|
25
|
-
|
|
23
|
+
export const IncrementalXapi = class IncrementalXapiVmBackupRunner extends AbstractXapi {
|
|
26
24
|
_getWriters() {
|
|
27
25
|
return [IncrementalRemoteWriter, IncrementalXapiWriter]
|
|
28
26
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { createLogger } = require('@xen-orchestra/log')
|
|
5
|
-
const { Task } = require('../../Task.js')
|
|
1
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
2
|
+
import { createLogger } from '@xen-orchestra/log'
|
|
3
|
+
import { Task } from '../../Task.mjs'
|
|
6
4
|
|
|
7
5
|
const { debug, warn } = createLogger('xo:backups:AbstractVmRunner')
|
|
8
6
|
|
|
@@ -19,7 +17,7 @@ const asyncEach = async (iterable, fn, thisArg = iterable) => {
|
|
|
19
17
|
}
|
|
20
18
|
}
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
export const Abstract = class AbstractVmBackupRunner {
|
|
23
21
|
// calls fn for each function, warns of any errors, and throws only if there are no writers left
|
|
24
22
|
async _callWriters(fn, step, parallel = true) {
|
|
25
23
|
const writers = this._writers
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { asyncEach } from '@vates/async-each'
|
|
2
|
+
import { Disposable } from 'promise-toolbox'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
const { asyncEach } = require('@vates/async-each')
|
|
6
|
-
const { Disposable } = require('promise-toolbox')
|
|
4
|
+
import { getVmBackupDir } from '../../_getVmBackupDir.mjs'
|
|
7
5
|
|
|
8
|
-
|
|
6
|
+
import { Abstract } from './_Abstract.mjs'
|
|
7
|
+
|
|
8
|
+
export const AbstractRemote = class AbstractRemoteVmBackupRunner extends Abstract {
|
|
9
9
|
constructor({
|
|
10
10
|
config,
|
|
11
11
|
job,
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
class AbstractXapiVmBackupRunner extends Abstract {
|
|
1
|
+
import assert from 'node:assert'
|
|
2
|
+
import groupBy from 'lodash/groupBy.js'
|
|
3
|
+
import ignoreErrors from 'promise-toolbox/ignoreErrors'
|
|
4
|
+
import { asyncMap } from '@xen-orchestra/async-map'
|
|
5
|
+
import { decorateMethodsWith } from '@vates/decorate-with'
|
|
6
|
+
import { defer } from 'golike-defer'
|
|
7
|
+
import { formatDateTime } from '@xen-orchestra/xapi'
|
|
8
|
+
|
|
9
|
+
import { getOldEntries } from '../../_getOldEntries.mjs'
|
|
10
|
+
import { Task } from '../../Task.mjs'
|
|
11
|
+
import { Abstract } from './_Abstract.mjs'
|
|
12
|
+
|
|
13
|
+
export const AbstractXapi = class AbstractXapiVmBackupRunner extends Abstract {
|
|
16
14
|
constructor({
|
|
17
15
|
config,
|
|
18
16
|
getSnapshotNameLabel,
|
|
@@ -271,8 +269,7 @@ class AbstractXapiVmBackupRunner extends Abstract {
|
|
|
271
269
|
await this._healthCheck()
|
|
272
270
|
}
|
|
273
271
|
}
|
|
274
|
-
exports.AbstractXapi = AbstractXapiVmBackupRunner
|
|
275
272
|
|
|
276
|
-
decorateMethodsWith(
|
|
273
|
+
decorateMethodsWith(AbstractXapi, {
|
|
277
274
|
run: defer,
|
|
278
275
|
})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import mapValues from 'lodash/mapValues.js'
|
|
2
|
+
|
|
3
|
+
import { forkStreamUnpipe } from '../_forkStreamUnpipe.mjs'
|
|
4
|
+
|
|
5
|
+
export function forkDeltaExport(deltaExport) {
|
|
6
|
+
return Object.create(deltaExport, {
|
|
7
|
+
streams: {
|
|
8
|
+
value: mapValues(deltaExport.streams, forkStreamUnpipe),
|
|
9
|
+
},
|
|
10
|
+
})
|
|
11
|
+
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { formatFilenameDate } from '../../_filenameDate.mjs'
|
|
2
|
+
import { getOldEntries } from '../../_getOldEntries.mjs'
|
|
3
|
+
import { Task } from '../../Task.mjs'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const { Task } = require('../../Task.js')
|
|
5
|
+
import { MixinRemoteWriter } from './_MixinRemoteWriter.mjs'
|
|
6
|
+
import { AbstractFullWriter } from './_AbstractFullWriter.mjs'
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
const { AbstractFullWriter } = require('./_AbstractFullWriter.js')
|
|
9
|
-
|
|
10
|
-
exports.FullRemoteWriter = class FullRemoteWriter extends MixinRemoteWriter(AbstractFullWriter) {
|
|
8
|
+
export class FullRemoteWriter extends MixinRemoteWriter(AbstractFullWriter) {
|
|
11
9
|
constructor(props) {
|
|
12
10
|
super(props)
|
|
13
11
|
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import ignoreErrors from 'promise-toolbox/ignoreErrors'
|
|
2
|
+
import { asyncMap, asyncMapSettled } from '@xen-orchestra/async-map'
|
|
3
|
+
import { formatDateTime } from '@xen-orchestra/xapi'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
import { formatFilenameDate } from '../../_filenameDate.mjs'
|
|
6
|
+
import { getOldEntries } from '../../_getOldEntries.mjs'
|
|
7
|
+
import { Task } from '../../Task.mjs'
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
import { AbstractFullWriter } from './_AbstractFullWriter.mjs'
|
|
10
|
+
import { MixinXapiWriter } from './_MixinXapiWriter.mjs'
|
|
11
|
+
import { listReplicatedVms } from './_listReplicatedVms.mjs'
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
const { MixinXapiWriter } = require('./_MixinXapiWriter.js')
|
|
13
|
-
const { listReplicatedVms } = require('./_listReplicatedVms.js')
|
|
14
|
-
|
|
15
|
-
exports.FullXapiWriter = class FullXapiWriter extends MixinXapiWriter(AbstractFullWriter) {
|
|
13
|
+
export class FullXapiWriter extends MixinXapiWriter(AbstractFullWriter) {
|
|
16
14
|
constructor(props) {
|
|
17
15
|
super(props)
|
|
18
16
|
|