From e36efaec08377df3e6dc1b9328df093822c062e4 Mon Sep 17 00:00:00 2001 From: badrAZ Date: Wed, 24 Feb 2021 10:02:57 +0100 Subject: [PATCH] feat(xo-server#_listPoolMetadataBackups): use @xen-orchestra/backups lib (#5607) --- .../src/xo-mixins/metadata-backups.js | 60 +++++-------------- 1 file changed, 15 insertions(+), 45 deletions(-) diff --git a/packages/xo-server/src/xo-mixins/metadata-backups.js b/packages/xo-server/src/xo-mixins/metadata-backups.js index be1202082..d8bb0f3c1 100644 --- a/packages/xo-server/src/xo-mixins/metadata-backups.js +++ b/packages/xo-server/src/xo-mixins/metadata-backups.js @@ -1,7 +1,7 @@ // @flow import asyncMap from '@xen-orchestra/async-map' import createLogger from '@xen-orchestra/log' -import { fromEvent, ignoreErrors, timeout } from 'promise-toolbox' +import { fromEvent, ignoreErrors, timeout, using } from 'promise-toolbox' import { parseDuration } from '@vates/parse-duration' import { debounceWithKey, REMOVE_CACHE_ENTRY } from '../_pDebounceWithKey' @@ -713,59 +713,29 @@ export default class metadataBackup { // } async _listPoolMetadataBackups(remoteId) { const app = this._app - const { proxy, url, options } = await app.getRemoteWithCredentials(remoteId) - if (proxy !== undefined) { - const { [remoteId]: backupsByPool } = await app.callProxyMethod(proxy, 'backup.listPoolMetadataBackups', { + const remote = await app.getRemoteWithCredentials(remoteId) + + let backupsByPool + if (remote.proxy !== undefined) { + ;({ [remoteId]: backupsByPool } = await app.callProxyMethod(remote.proxy, 'backup.listPoolMetadataBackups', { remotes: { [remoteId]: { - url, - options, + url: remote.url, + options: remote.options, }, }, - }) - - // inject the remote id on the backup which is needed for restoreMetadataBackup() - Object.values(backupsByPool).forEach(backups => - backups.forEach(backup => { - backup.id = `${remoteId}${backup.id}` - }) - ) - - return backupsByPool + })) + } else { + backupsByPool = await using(app.getBackupsRemoteAdapter(remote), adapter => adapter.listPoolMetadataBackups()) } - const handler = await this._app.getRemoteHandler(remoteId) - const safeReaddir = createSafeReaddir(handler, 'listXoMetadataBackups') - - const backupsByPool = {} - await asyncMap(safeReaddir(DIR_XO_POOL_METADATA_BACKUPS, { prependDir: true }), scheduleDir => - asyncMap(safeReaddir(scheduleDir), poolId => { - const backups = backupsByPool[poolId] ?? (backupsByPool[poolId] = []) - return asyncMap(safeReaddir(`${scheduleDir}/${poolId}`, { prependDir: true }), async backupDir => { - try { - backups.push({ - id: `${remoteId}${backupDir}`, - ...JSON.parse(String(await handler.readFile(`${backupDir}/metadata.json`))), - }) - } catch (error) { - log.warn(`listPoolMetadataBackups ${backupDir}`, { - error, - }) - } - }) + // inject the remote id on the backup which is needed for restoreMetadataBackup() + Object.values(backupsByPool).forEach(backups => + backups.forEach(backup => { + backup.id = `${remoteId}${backup.id}` }) ) - // delete empty entries and sort backups - Object.keys(backupsByPool).forEach(poolId => { - const backups = backupsByPool[poolId] - if (backups.length === 0) { - delete backupsByPool[poolId] - } else { - backups.sort(compareTimestamp) - } - }) - return backupsByPool }