@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.
Files changed (65) hide show
  1. package/{Backup.js → Backup.mjs} +4 -6
  2. package/{DurablePartition.js → DurablePartition.mjs} +2 -4
  3. package/{HealthCheckVmBackup.js → HealthCheckVmBackup.mjs} +2 -4
  4. package/{ImportVmBackup.js → ImportVmBackup.mjs} +6 -8
  5. package/{RemoteAdapter.js → RemoteAdapter.mjs} +69 -76
  6. package/{RestoreMetadataBackup.js → RestoreMetadataBackup.mjs} +6 -5
  7. package/{Task.js → Task.mjs} +3 -6
  8. package/_backupType.mjs +4 -0
  9. package/{_backupWorker.js → _backupWorker.mjs} +22 -22
  10. package/{_cancelableMap.js → _cancelableMap.mjs} +3 -5
  11. package/{_cleanVm.js → _cleanVm.mjs} +16 -19
  12. package/_filenameDate.mjs +6 -0
  13. package/{_getOldEntries.js → _getOldEntries.mjs} +1 -3
  14. package/{_getTmpDir.js → _getTmpDir.mjs} +5 -7
  15. package/_getVmBackupDir.mjs +5 -0
  16. package/{_incrementalVm.js → _incrementalVm.mjs} +21 -20
  17. package/{_isValidXva.js → _isValidXva.mjs} +2 -5
  18. package/{_listPartitions.js → _listPartitions.mjs} +6 -9
  19. package/{_lvm.js → _lvm.mjs} +5 -7
  20. package/_runners/{Metadata.js → Metadata.mjs} +10 -12
  21. package/_runners/{VmsRemote.js → VmsRemote.mjs} +12 -14
  22. package/_runners/{VmsXapi.js → VmsXapi.mjs} +14 -15
  23. package/_runners/{_Abstract.js → _Abstract.mjs} +7 -9
  24. package/_runners/{_PoolMetadataBackup.js → _PoolMetadataBackup.mjs} +7 -10
  25. package/_runners/{_RemoteTimeoutError.js → _RemoteTimeoutError.mjs} +1 -3
  26. package/_runners/{_XoMetadataBackup.js → _XoMetadataBackup.mjs} +11 -9
  27. package/_runners/{_createStreamThrottle.js → _createStreamThrottle.mjs} +4 -6
  28. package/_runners/{_forkStreamUnpipe.js → _forkStreamUnpipe.mjs} +4 -5
  29. package/_runners/{_getAdaptersByRemote.js → _getAdaptersByRemote.mjs} +1 -3
  30. package/_runners/_runTask.mjs +5 -0
  31. package/_runners/_vmRunners/{FullRemote.js → FullRemote.mjs} +9 -12
  32. package/_runners/_vmRunners/{FullXapi.js → FullXapi.mjs} +7 -9
  33. package/_runners/_vmRunners/{IncrementalRemote.js → IncrementalRemote.mjs} +11 -12
  34. package/_runners/_vmRunners/{IncrementalXapi.js → IncrementalXapi.mjs} +18 -20
  35. package/_runners/_vmRunners/{_Abstract.js → _Abstract.mjs} +4 -6
  36. package/_runners/_vmRunners/{_AbstractRemote.js → _AbstractRemote.mjs} +6 -6
  37. package/_runners/_vmRunners/{_AbstractXapi.js → _AbstractXapi.mjs} +14 -17
  38. package/_runners/_vmRunners/_forkDeltaExport.mjs +11 -0
  39. package/_runners/_writers/{FullRemoteWriter.js → FullRemoteWriter.mjs} +6 -8
  40. package/_runners/_writers/{FullXapiWriter.js → FullXapiWriter.mjs} +10 -12
  41. package/_runners/_writers/{IncrementalRemoteWriter.js → IncrementalRemoteWriter.mjs} +31 -28
  42. package/_runners/_writers/{IncrementalXapiWriter.js → IncrementalXapiWriter.mjs} +11 -13
  43. package/_runners/_writers/{_AbstractFullWriter.js → _AbstractFullWriter.mjs} +2 -4
  44. package/_runners/_writers/{_AbstractIncrementalWriter.js → _AbstractIncrementalWriter.mjs} +2 -4
  45. package/_runners/_writers/{_AbstractWriter.js → _AbstractWriter.mjs} +3 -5
  46. package/_runners/_writers/{_MixinRemoteWriter.js → _MixinRemoteWriter.mjs} +10 -12
  47. package/_runners/_writers/_MixinXapiWriter.mjs +72 -0
  48. package/_runners/_writers/_checkVhd.mjs +6 -0
  49. package/_runners/_writers/{_listReplicatedVms.js → _listReplicatedVms.mjs} +1 -3
  50. package/_runners/_writers/{_packUuid.js → _packUuid.mjs} +1 -3
  51. package/{_watchStreamSize.js → _watchStreamSize.mjs} +1 -3
  52. package/{extractIdsFromSimplePattern.js → extractIdsFromSimplePattern.mjs} +1 -3
  53. package/{formatVmBackups.js → formatVmBackups.mjs} +3 -5
  54. package/merge-worker/{cli.js → cli.mjs} +9 -11
  55. package/merge-worker/{index.js → index.mjs} +6 -7
  56. package/package.json +10 -8
  57. package/{parseMetadataBackupId.js → parseMetadataBackupId.mjs} +2 -4
  58. package/{runBackupWorker.js → runBackupWorker.mjs} +4 -7
  59. package/_backupType.js +0 -6
  60. package/_filenameDate.js +0 -8
  61. package/_getVmBackupDir.js +0 -8
  62. package/_runners/_runTask.js +0 -6
  63. package/_runners/_vmRunners/_forkDeltaExport.js +0 -12
  64. package/_runners/_writers/_MixinXapiWriter.js +0 -46
  65. package/_runners/_writers/_checkVhd.js +0 -8
@@ -1,22 +1,20 @@
1
- 'use strict'
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
- const { asyncMap } = require('@xen-orchestra/async-map')
4
- const Disposable = require('promise-toolbox/Disposable')
5
- const ignoreErrors = require('promise-toolbox/ignoreErrors')
6
-
7
- const { extractIdsFromSimplePattern } = require('../extractIdsFromSimplePattern.js')
8
- const { PoolMetadataBackup } = require('./_PoolMetadataBackup.js')
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
- exports.Metadata = class MetadataBackupRunner extends Abstract {
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
- 'use strict'
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
- const { asyncMapSettled } = require('@xen-orchestra/async-map')
4
- const Disposable = require('promise-toolbox/Disposable')
5
- const { limitConcurrency } = require('limit-concurrency-decorator')
6
-
7
- const { extractIdsFromSimplePattern } = require('../extractIdsFromSimplePattern.js')
8
- const { Task } = require('../Task.js')
9
- const createStreamThrottle = require('./_createStreamThrottle.js')
10
- const { DEFAULT_SETTINGS, Abstract } = require('./_Abstract.js')
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
- exports.VmsRemote = class RemoteVmsBackupRunner extends Abstract {
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
- 'use strict'
2
-
3
- const { asyncMapSettled } = require('@xen-orchestra/async-map')
4
- const Disposable = require('promise-toolbox/Disposable')
5
- const { limitConcurrency } = require('limit-concurrency-decorator')
6
-
7
- const { extractIdsFromSimplePattern } = require('../extractIdsFromSimplePattern.js')
8
- const { Task } = require('../Task.js')
9
- const createStreamThrottle = require('./_createStreamThrottle.js')
10
- const { DEFAULT_SETTINGS, Abstract } = require('./_Abstract.js')
11
- const { runTask } = require('./_runTask.js')
12
- const { getAdaptersByRemote } = require('./_getAdaptersByRemote.js')
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
- exports.VmsXapi = class VmsXapiBackupRunner extends Abstract {
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
- 'use strict'
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 Disposable = require('promise-toolbox/Disposable')
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
- exports.Abstract = class AbstractRunner {
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
- 'use strict'
1
+ import { asyncMap } from '@xen-orchestra/async-map'
2
2
 
3
- const { asyncMap } = require('@xen-orchestra/async-map')
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 { DIR_XO_POOL_METADATA_BACKUPS } = require('../RemoteAdapter.js')
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
- const PATH_DB_DUMP = '/pool/xmldbdump'
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
- 'use strict'
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
- 'use strict'
1
+ import { asyncMap } from '@xen-orchestra/async-map'
2
+ import { join } from '@xen-orchestra/fs/path'
2
3
 
3
- const { asyncMap } = require('@xen-orchestra/async-map')
4
+ import { DIR_XO_CONFIG_BACKUPS } from '../RemoteAdapter.mjs'
5
+ import { formatFilenameDate } from '../_filenameDate.mjs'
6
+ import { Task } from '../Task.mjs'
4
7
 
5
- const { DIR_XO_CONFIG_BACKUPS } = require('../RemoteAdapter.js')
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 fileName = `${dir}/data.json`
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(fileName, data, { dirMode })
57
+ await handler.outputFile(dataFileName, data, { dirMode })
56
58
  await handler.outputFile(metaDataFileName, metadata, {
57
59
  dirMode,
58
60
  })
@@ -1,12 +1,10 @@
1
- 'use strict'
2
-
3
- const { pipeline } = require('node:stream')
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
- module.exports = function createStreamThrottle(rate) {
7
+ export default function createStreamThrottle(rate) {
10
8
  if (rate === 0) {
11
9
  return identity
12
10
  }
@@ -1,14 +1,13 @@
1
- 'use strict'
1
+ import { createLogger } from '@xen-orchestra/log'
2
+ import { finished, PassThrough } from 'node:stream'
2
3
 
3
- const { finished, PassThrough } = require('node:stream')
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
- exports.forkStreamUnpipe = function forkStreamUnpipe(source) {
10
+ export function forkStreamUnpipe(source) {
12
11
  const { forks = 0 } = source
13
12
  source.forks = forks + 1
14
13
 
@@ -1,9 +1,7 @@
1
- 'use strict'
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
@@ -0,0 +1,5 @@
1
+ import { Task } from '../Task.mjs'
2
+
3
+ const noop = Function.prototype
4
+
5
+ export const runTask = (...args) => Task.run(...args).catch(noop) // errors are handled by logs
@@ -1,14 +1,12 @@
1
- 'use strict'
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 { decorateMethodsWith } = require('@vates/decorate-with')
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
- exports.FullRemote = FullRemoteVmBackupRunner
51
- decorateMethodsWith(FullRemoteVmBackupRunner, {
48
+ decorateMethodsWith(FullRemote, {
52
49
  _run: defer,
53
50
  })
@@ -1,16 +1,14 @@
1
- 'use strict'
1
+ import { createLogger } from '@xen-orchestra/log'
2
2
 
3
- const { createLogger } = require('@xen-orchestra/log')
4
-
5
- const { forkStreamUnpipe } = require('../_forkStreamUnpipe.js')
6
- const { FullRemoteWriter } = require('../_writers/FullRemoteWriter.js')
7
- const { FullXapiWriter } = require('../_writers/FullXapiWriter.js')
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
- exports.FullXapi = class FullXapiVmBackupRunner extends AbstractXapi {
11
+ export const FullXapi = class FullXapiVmBackupRunner extends AbstractXapi {
14
12
  _getWriters() {
15
13
  return [FullRemoteWriter, FullXapiWriter]
16
14
  }
@@ -1,15 +1,14 @@
1
- 'use strict'
2
- const assert = require('node:assert')
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
- const { decorateMethodsWith } = require('@vates/decorate-with')
5
- const { defer } = require('golike-defer')
6
- const { mapValues } = require('lodash')
7
- const { Task } = require('../../Task')
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
- exports.IncrementalRemote = IncrementalRemoteVmBackupRunner
63
+ export const IncrementalRemote = IncrementalRemoteVmBackupRunner
65
64
  decorateMethodsWith(IncrementalRemoteVmBackupRunner, {
66
65
  _run: defer,
67
66
  })
@@ -1,28 +1,26 @@
1
- 'use strict'
2
-
3
- const findLast = require('lodash/findLast.js')
4
- const keyBy = require('lodash/keyBy.js')
5
- const mapValues = require('lodash/mapValues.js')
6
- const vhdStreamValidator = require('vhd-lib/vhdStreamValidator.js')
7
- const { asyncMap } = require('@xen-orchestra/async-map')
8
- const { createLogger } = require('@xen-orchestra/log')
9
- const { pipeline } = require('node:stream')
10
-
11
- const { IncrementalRemoteWriter } = require('../_writers/IncrementalRemoteWriter.js')
12
- const { IncrementalXapiWriter } = require('../_writers/IncrementalXapiWriter.js')
13
- const { exportIncrementalVm } = require('../../_incrementalVm.js')
14
- const { Task } = require('../../Task.js')
15
- const { watchStreamSize } = require('../../_watchStreamSize.js')
16
- const { AbstractXapi } = require('./_AbstractXapi.js')
17
- const { forkDeltaExport } = require('./_forkDeltaExport.js')
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
- exports.IncrementalXapi = class IncrementalXapiVmBackupRunner extends AbstractXapi {
23
+ export const IncrementalXapi = class IncrementalXapiVmBackupRunner extends AbstractXapi {
26
24
  _getWriters() {
27
25
  return [IncrementalRemoteWriter, IncrementalXapiWriter]
28
26
  }
@@ -1,8 +1,6 @@
1
- 'use strict'
2
-
3
- const { asyncMap } = require('@xen-orchestra/async-map')
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
- exports.Abstract = class AbstractVmBackupRunner {
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
- 'use strict'
2
- const { Abstract } = require('./_Abstract')
1
+ import { asyncEach } from '@vates/async-each'
2
+ import { Disposable } from 'promise-toolbox'
3
3
 
4
- const { getVmBackupDir } = require('../../_getVmBackupDir')
5
- const { asyncEach } = require('@vates/async-each')
6
- const { Disposable } = require('promise-toolbox')
4
+ import { getVmBackupDir } from '../../_getVmBackupDir.mjs'
7
5
 
8
- exports.AbstractRemote = class AbstractRemoteVmBackupRunner extends Abstract {
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
- 'use strict'
2
-
3
- const assert = require('assert')
4
- const groupBy = require('lodash/groupBy.js')
5
- const ignoreErrors = require('promise-toolbox/ignoreErrors')
6
- const { asyncMap } = require('@xen-orchestra/async-map')
7
- const { decorateMethodsWith } = require('@vates/decorate-with')
8
- const { defer } = require('golike-defer')
9
- const { formatDateTime } = require('@xen-orchestra/xapi')
10
-
11
- const { getOldEntries } = require('../../_getOldEntries.js')
12
- const { Task } = require('../../Task.js')
13
- const { Abstract } = require('./_Abstract.js')
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(AbstractXapiVmBackupRunner, {
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
- 'use strict'
1
+ import { formatFilenameDate } from '../../_filenameDate.mjs'
2
+ import { getOldEntries } from '../../_getOldEntries.mjs'
3
+ import { Task } from '../../Task.mjs'
2
4
 
3
- const { formatFilenameDate } = require('../../_filenameDate.js')
4
- const { getOldEntries } = require('../../_getOldEntries.js')
5
- const { Task } = require('../../Task.js')
5
+ import { MixinRemoteWriter } from './_MixinRemoteWriter.mjs'
6
+ import { AbstractFullWriter } from './_AbstractFullWriter.mjs'
6
7
 
7
- const { MixinRemoteWriter } = require('./_MixinRemoteWriter.js')
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
- 'use strict'
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
- const ignoreErrors = require('promise-toolbox/ignoreErrors')
4
- const { asyncMap, asyncMapSettled } = require('@xen-orchestra/async-map')
5
- const { formatDateTime } = require('@xen-orchestra/xapi')
5
+ import { formatFilenameDate } from '../../_filenameDate.mjs'
6
+ import { getOldEntries } from '../../_getOldEntries.mjs'
7
+ import { Task } from '../../Task.mjs'
6
8
 
7
- const { formatFilenameDate } = require('../../_filenameDate.js')
8
- const { getOldEntries } = require('../../_getOldEntries.js')
9
- const { Task } = require('../../Task.js')
9
+ import { AbstractFullWriter } from './_AbstractFullWriter.mjs'
10
+ import { MixinXapiWriter } from './_MixinXapiWriter.mjs'
11
+ import { listReplicatedVms } from './_listReplicatedVms.mjs'
10
12
 
11
- const { AbstractFullWriter } = require('./_AbstractFullWriter.js')
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