@xen-orchestra/backups 0.39.0 → 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 (64) 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} +4 -6
  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} +13 -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} +6 -8
  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} +22 -24
  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.js → _MixinXapiWriter.mjs} +5 -7
  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 +8 -7
  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/_checkVhd.js +0 -8
@@ -1,19 +1,17 @@
1
- 'use strict'
1
+ import { asyncMap, asyncMapSettled } from '@xen-orchestra/async-map'
2
+ import ignoreErrors from 'promise-toolbox/ignoreErrors'
3
+ import { formatDateTime } from '@xen-orchestra/xapi'
2
4
 
3
- const { asyncMap, asyncMapSettled } = require('@xen-orchestra/async-map')
4
- const ignoreErrors = require('promise-toolbox/ignoreErrors')
5
- const { formatDateTime } = require('@xen-orchestra/xapi')
5
+ import { formatFilenameDate } from '../../_filenameDate.mjs'
6
+ import { getOldEntries } from '../../_getOldEntries.mjs'
7
+ import { importIncrementalVm, TAG_COPY_SRC } from '../../_incrementalVm.mjs'
8
+ import { Task } from '../../Task.mjs'
6
9
 
7
- const { formatFilenameDate } = require('../../_filenameDate.js')
8
- const { getOldEntries } = require('../../_getOldEntries.js')
9
- const { importIncrementalVm, TAG_COPY_SRC } = require('../../_incrementalVm.js')
10
- const { Task } = require('../../Task.js')
10
+ import { AbstractIncrementalWriter } from './_AbstractIncrementalWriter.mjs'
11
+ import { MixinXapiWriter } from './_MixinXapiWriter.mjs'
12
+ import { listReplicatedVms } from './_listReplicatedVms.mjs'
11
13
 
12
- const { AbstractIncrementalWriter } = require('./_AbstractIncrementalWriter.js')
13
- const { MixinXapiWriter } = require('./_MixinXapiWriter.js')
14
- const { listReplicatedVms } = require('./_listReplicatedVms.js')
15
-
16
- exports.IncrementalXapiWriter = class IncrementalXapiWriter extends MixinXapiWriter(AbstractIncrementalWriter) {
14
+ export class IncrementalXapiWriter extends MixinXapiWriter(AbstractIncrementalWriter) {
17
15
  async checkBaseVdis(baseUuidToSrcVdi, baseVm) {
18
16
  const sr = this._sr
19
17
  const replicatedVm = listReplicatedVms(sr.$xapi, this._job.id, sr.uuid, this._vmUuid).find(
@@ -1,8 +1,6 @@
1
- 'use strict'
1
+ import { AbstractWriter } from './_AbstractWriter.mjs'
2
2
 
3
- const { AbstractWriter } = require('./_AbstractWriter.js')
4
-
5
- exports.AbstractFullWriter = class AbstractFullWriter extends AbstractWriter {
3
+ export class AbstractFullWriter extends AbstractWriter {
6
4
  async run({ timestamp, sizeContainer, stream, vm, vmSnapshot }) {
7
5
  try {
8
6
  return await this._run({ timestamp, sizeContainer, stream, vm, vmSnapshot })
@@ -1,8 +1,6 @@
1
- 'use strict'
1
+ import { AbstractWriter } from './_AbstractWriter.mjs'
2
2
 
3
- const { AbstractWriter } = require('./_AbstractWriter.js')
4
-
5
- exports.AbstractIncrementalWriter = class AbstractIncrementalWriter extends AbstractWriter {
3
+ export class AbstractIncrementalWriter extends AbstractWriter {
6
4
  checkBaseVdis(baseUuidToSrcVdi, baseVm) {
7
5
  throw new Error('Not implemented')
8
6
  }
@@ -1,9 +1,7 @@
1
- 'use strict'
1
+ import { formatFilenameDate } from '../../_filenameDate.mjs'
2
+ import { getVmBackupDir } from '../../_getVmBackupDir.mjs'
2
3
 
3
- const { formatFilenameDate } = require('../../_filenameDate')
4
- const { getVmBackupDir } = require('../../_getVmBackupDir')
5
-
6
- exports.AbstractWriter = class AbstractWriter {
4
+ export class AbstractWriter {
7
5
  constructor({ config, healthCheckSr, job, vmUuid, scheduleId, settings }) {
8
6
  this._config = config
9
7
  this._healthCheckSr = healthCheckSr
@@ -1,19 +1,17 @@
1
- 'use strict'
1
+ import { createLogger } from '@xen-orchestra/log'
2
+ import { join } from 'node:path'
3
+ import assert from 'node:assert'
2
4
 
3
- const { createLogger } = require('@xen-orchestra/log')
4
- const { join } = require('path')
5
-
6
- const assert = require('assert')
7
- const { formatFilenameDate } = require('../../_filenameDate.js')
8
- const { getVmBackupDir } = require('../../_getVmBackupDir.js')
9
- const { HealthCheckVmBackup } = require('../../HealthCheckVmBackup.js')
10
- const { ImportVmBackup } = require('../../ImportVmBackup.js')
11
- const { Task } = require('../../Task.js')
12
- const MergeWorker = require('../../merge-worker/index.js')
5
+ import { formatFilenameDate } from '../../_filenameDate.mjs'
6
+ import { getVmBackupDir } from '../../_getVmBackupDir.mjs'
7
+ import { HealthCheckVmBackup } from '../../HealthCheckVmBackup.mjs'
8
+ import { ImportVmBackup } from '../../ImportVmBackup.mjs'
9
+ import { Task } from '../../Task.mjs'
10
+ import * as MergeWorker from '../../merge-worker/index.mjs'
13
11
 
14
12
  const { info, warn } = createLogger('xo:backups:MixinBackupWriter')
15
13
 
16
- exports.MixinRemoteWriter = (BaseClass = Object) =>
14
+ export const MixinRemoteWriter = (BaseClass = Object) =>
17
15
  class MixinRemoteWriter extends BaseClass {
18
16
  #lock
19
17
 
@@ -1,12 +1,10 @@
1
- 'use strict'
1
+ import { extractOpaqueRef } from '@xen-orchestra/xapi'
2
+ import assert from 'node:assert/strict'
2
3
 
3
- const { extractOpaqueRef } = require('@xen-orchestra/xapi')
4
+ import { HealthCheckVmBackup } from '../../HealthCheckVmBackup.mjs'
5
+ import { Task } from '../../Task.mjs'
4
6
 
5
- const { Task } = require('../../Task')
6
- const assert = require('node:assert/strict')
7
- const { HealthCheckVmBackup } = require('../../HealthCheckVmBackup')
8
-
9
- exports.MixinXapiWriter = (BaseClass = Object) =>
7
+ export const MixinXapiWriter = (BaseClass = Object) =>
10
8
  class MixinXapiWriter extends BaseClass {
11
9
  constructor({ sr, ...rest }) {
12
10
  super(rest)
@@ -0,0 +1,6 @@
1
+ import { openVhd } from 'vhd-lib'
2
+ import Disposable from 'promise-toolbox/Disposable'
3
+
4
+ export async function checkVhd(handler, path) {
5
+ await Disposable.use(openVhd(handler, path), () => {})
6
+ }
@@ -1,5 +1,3 @@
1
- 'use strict'
2
-
3
1
  const getReplicatedVmDatetime = vm => {
4
2
  const { 'xo:backup:datetime': datetime = vm.name_label.slice(-17, -1) } = vm.other_config
5
3
  return datetime
@@ -7,7 +5,7 @@ const getReplicatedVmDatetime = vm => {
7
5
 
8
6
  const compareReplicatedVmDatetime = (a, b) => (getReplicatedVmDatetime(a) < getReplicatedVmDatetime(b) ? -1 : 1)
9
7
 
10
- exports.listReplicatedVms = function listReplicatedVms(xapi, scheduleOrJobId, srUuid, vmUuid) {
8
+ export function listReplicatedVms(xapi, scheduleOrJobId, srUuid, vmUuid) {
11
9
  const { all } = xapi.objects
12
10
  const vms = {}
13
11
  for (const key in all) {
@@ -1,7 +1,5 @@
1
- 'use strict'
2
-
3
1
  const PARSE_UUID_RE = /-/g
4
2
 
5
- exports.packUuid = function packUuid(uuid) {
3
+ export function packUuid(uuid) {
6
4
  return Buffer.from(uuid.replace(PARSE_UUID_RE, ''), 'hex')
7
5
  }
@@ -1,6 +1,4 @@
1
- 'use strict'
2
-
3
- exports.watchStreamSize = function watchStreamSize(stream, container = { size: 0 }) {
1
+ export function watchStreamSize(stream, container = { size: 0 }) {
4
2
  stream.on('data', data => {
5
3
  container.size += data.length
6
4
  })
@@ -1,6 +1,4 @@
1
- 'use strict'
2
-
3
- exports.extractIdsFromSimplePattern = function extractIdsFromSimplePattern(pattern) {
1
+ export function extractIdsFromSimplePattern(pattern) {
4
2
  if (pattern === undefined) {
5
3
  return []
6
4
  }
@@ -1,7 +1,5 @@
1
- 'use strict'
2
-
3
- const mapValues = require('lodash/mapValues.js')
4
- const { dirname } = require('path')
1
+ import mapValues from 'lodash/mapValues.js'
2
+ import { dirname } from 'node:path'
5
3
 
6
4
  function formatVmBackup(backup) {
7
5
  return {
@@ -31,6 +29,6 @@ function formatVmBackup(backup) {
31
29
  }
32
30
 
33
31
  // format all backups as returned by RemoteAdapter#listAllVmBackups()
34
- exports.formatVmBackups = function formatVmBackups(backupsByVM) {
32
+ export function formatVmBackups(backupsByVM) {
35
33
  return mapValues(backupsByVM, backups => backups.map(formatVmBackup))
36
34
  }
@@ -2,19 +2,17 @@
2
2
  // eslint-disable-next-line eslint-comments/disable-enable-pair
3
3
  /* eslint-disable n/shebang */
4
4
 
5
- 'use strict'
5
+ import { catchGlobalErrors } from '@xen-orchestra/log/configure'
6
+ import { createLogger } from '@xen-orchestra/log'
7
+ import { getSyncedHandler } from '@xen-orchestra/fs'
8
+ import { join } from 'node:path'
9
+ import Disposable from 'promise-toolbox/Disposable'
10
+ import min from 'lodash/min.js'
6
11
 
7
- const { catchGlobalErrors } = require('@xen-orchestra/log/configure')
8
- const { createLogger } = require('@xen-orchestra/log')
9
- const { getSyncedHandler } = require('@xen-orchestra/fs')
10
- const { join } = require('path')
11
- const Disposable = require('promise-toolbox/Disposable')
12
- const min = require('lodash/min')
12
+ import { getVmBackupDir } from '../_getVmBackupDir.mjs'
13
+ import { RemoteAdapter } from '../RemoteAdapter.mjs'
13
14
 
14
- const { getVmBackupDir } = require('../_getVmBackupDir.js')
15
- const { RemoteAdapter } = require('../RemoteAdapter.js')
16
-
17
- const { CLEAN_VM_QUEUE } = require('./index.js')
15
+ import { CLEAN_VM_QUEUE } from './index.mjs'
18
16
 
19
17
  // -------------------------------------------------------------------
20
18
 
@@ -1,13 +1,12 @@
1
- 'use strict'
1
+ import { join } from 'node:path'
2
+ import { spawn } from 'child_process'
3
+ import { check } from 'proper-lockfile'
2
4
 
3
- const { join, resolve } = require('path')
4
- const { spawn } = require('child_process')
5
- const { check } = require('proper-lockfile')
5
+ export const CLEAN_VM_QUEUE = '/xo-vm-backups/.queue/clean-vm/'
6
6
 
7
- const CLEAN_VM_QUEUE = (exports.CLEAN_VM_QUEUE = '/xo-vm-backups/.queue/clean-vm/')
7
+ const CLI_PATH = new URL('cli.mjs', import.meta.url).pathname
8
8
 
9
- const CLI_PATH = resolve(__dirname, 'cli.js')
10
- exports.run = async function runMergeWorker(remotePath) {
9
+ export const run = async function runMergeWorker(remotePath) {
11
10
  try {
12
11
  // TODO: find a way to pass the acquire the lock and then pass it down the worker
13
12
  if (await check(join(remotePath, CLEAN_VM_QUEUE))) {
package/package.json CHANGED
@@ -8,13 +8,13 @@
8
8
  "type": "git",
9
9
  "url": "https://github.com/vatesfr/xen-orchestra.git"
10
10
  },
11
- "version": "0.39.0",
11
+ "version": "0.40.0",
12
12
  "engines": {
13
13
  "node": ">=14.18"
14
14
  },
15
15
  "scripts": {
16
16
  "postversion": "npm publish --access public",
17
- "test-integration": "node--test *.integ.js"
17
+ "test-integration": "node--test *.integ.mjs"
18
18
  },
19
19
  "dependencies": {
20
20
  "@kldzj/stream-throttle": "^1.1.1",
@@ -23,8 +23,8 @@
23
23
  "@vates/compose": "^2.1.0",
24
24
  "@vates/decorate-with": "^2.0.0",
25
25
  "@vates/disposable": "^0.1.4",
26
- "@vates/fuse-vhd": "^1.0.0",
27
- "@vates/nbd-client": "^1.2.1",
26
+ "@vates/fuse-vhd": "^2.0.0",
27
+ "@vates/nbd-client": "^2.0.0",
28
28
  "@vates/parse-duration": "^0.1.1",
29
29
  "@xen-orchestra/async-map": "^0.1.2",
30
30
  "@xen-orchestra/fs": "^4.0.1",
@@ -33,7 +33,6 @@
33
33
  "compare-versions": "^5.0.1",
34
34
  "d3-time-format": "^3.0.0",
35
35
  "decorator-synchronized": "^0.6.0",
36
- "fs-extra": "^11.1.0",
37
36
  "golike-defer": "^0.5.1",
38
37
  "limit-concurrency-decorator": "^0.5.0",
39
38
  "lodash": "^4.17.20",
@@ -41,19 +40,21 @@
41
40
  "parse-pairs": "^2.0.0",
42
41
  "promise-toolbox": "^0.21.0",
43
42
  "proper-lockfile": "^4.1.2",
43
+ "tar": "^6.1.15",
44
44
  "uuid": "^9.0.0",
45
45
  "vhd-lib": "^4.5.0",
46
- "xen-api": "^1.3.3",
46
+ "xen-api": "^1.3.4",
47
47
  "yazl": "^2.5.1"
48
48
  },
49
49
  "devDependencies": {
50
+ "fs-extra": "^11.1.0",
50
51
  "rimraf": "^5.0.1",
51
52
  "sinon": "^15.0.1",
52
53
  "test": "^3.2.1",
53
54
  "tmp": "^0.2.1"
54
55
  },
55
56
  "peerDependencies": {
56
- "@xen-orchestra/xapi": "^2.2.1"
57
+ "@xen-orchestra/xapi": "^3.0.0"
57
58
  },
58
59
  "license": "AGPL-3.0-or-later",
59
60
  "author": {
@@ -1,8 +1,6 @@
1
- 'use strict'
1
+ import { DIR_XO_CONFIG_BACKUPS, DIR_XO_POOL_METADATA_BACKUPS } from './RemoteAdapter.mjs'
2
2
 
3
- const { DIR_XO_CONFIG_BACKUPS, DIR_XO_POOL_METADATA_BACKUPS } = require('./RemoteAdapter.js')
4
-
5
- exports.parseMetadataBackupId = function parseMetadataBackupId(backupId) {
3
+ export function parseMetadataBackupId(backupId) {
6
4
  const [dir, ...rest] = backupId.split('/')
7
5
  if (dir === DIR_XO_CONFIG_BACKUPS) {
8
6
  const [scheduleId, timestamp] = rest
@@ -1,14 +1,11 @@
1
- 'use strict'
2
-
3
- const path = require('path')
4
- const { createLogger } = require('@xen-orchestra/log')
5
- const { fork } = require('child_process')
1
+ import { createLogger } from '@xen-orchestra/log'
2
+ import { fork } from 'child_process'
6
3
 
7
4
  const { warn } = createLogger('xo:backups:backupWorker')
8
5
 
9
- const PATH = path.resolve(__dirname, '_backupWorker.js')
6
+ const PATH = new URL('_backupWorker.mjs', import.meta.url).pathname
10
7
 
11
- exports.runBackupWorker = function runBackupWorker(params, onLog) {
8
+ export function runBackupWorker(params, onLog) {
12
9
  return new Promise((resolve, reject) => {
13
10
  const worker = fork(PATH)
14
11
 
package/_backupType.js DELETED
@@ -1,6 +0,0 @@
1
- 'use strict'
2
-
3
- exports.isMetadataFile = filename => filename.endsWith('.json')
4
- exports.isVhdFile = filename => filename.endsWith('.vhd')
5
- exports.isXvaFile = filename => filename.endsWith('.xva')
6
- exports.isXvaSumFile = filename => filename.endsWith('.xva.checksum')
package/_filenameDate.js DELETED
@@ -1,8 +0,0 @@
1
- 'use strict'
2
-
3
- const { utcFormat, utcParse } = require('d3-time-format')
4
-
5
- // Format a date in ISO 8601 in a safe way to be used in filenames
6
- // (even on Windows).
7
- exports.formatFilenameDate = utcFormat('%Y%m%dT%H%M%SZ')
8
- exports.parseFilenameDate = utcParse('%Y%m%dT%H%M%SZ')
@@ -1,8 +0,0 @@
1
- 'use strict'
2
-
3
- const BACKUP_DIR = 'xo-vm-backups'
4
- exports.BACKUP_DIR = BACKUP_DIR
5
-
6
- exports.getVmBackupDir = function getVmBackupDir(uuid) {
7
- return `${BACKUP_DIR}/${uuid}`
8
- }
@@ -1,6 +0,0 @@
1
- 'use strict'
2
- const { Task } = require('../Task.js')
3
- const noop = Function.prototype
4
- const runTask = (...args) => Task.run(...args).catch(noop) // errors are handled by logs
5
-
6
- exports.runTask = runTask
@@ -1,12 +0,0 @@
1
- 'use strict'
2
-
3
- const { mapValues } = require('lodash')
4
- const { forkStreamUnpipe } = require('../_forkStreamUnpipe')
5
-
6
- exports.forkDeltaExport = function forkDeltaExport(deltaExport) {
7
- return Object.create(deltaExport, {
8
- streams: {
9
- value: mapValues(deltaExport.streams, forkStreamUnpipe),
10
- },
11
- })
12
- }
@@ -1,8 +0,0 @@
1
- 'use strict'
2
-
3
- const openVhd = require('vhd-lib').openVhd
4
- const Disposable = require('promise-toolbox/Disposable')
5
-
6
- exports.checkVhd = async function checkVhd(handler, path) {
7
- await Disposable.use(openVhd(handler, path), () => {})
8
- }