From cfcd302294edfb6ca3e7b807c6ec53572f20f33c Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 8 Jan 2018 12:00:30 +0100 Subject: [PATCH] chore(api): decaffeinate vdi (#643) --- src/api/vdi.coffee | 126 --------------------------------------------- src/api/vdi.js | 122 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 126 deletions(-) delete mode 100644 src/api/vdi.coffee create mode 100644 src/api/vdi.js diff --git a/src/api/vdi.coffee b/src/api/vdi.coffee deleted file mode 100644 index de645b69f..000000000 --- a/src/api/vdi.coffee +++ /dev/null @@ -1,126 +0,0 @@ -# FIXME: rename to disk.* - -{coroutine: $coroutine} = require 'bluebird' - -{format} = require 'json-rpc-peer' -{invalidParameters, unauthorized} = require 'xo-common/api-errors' -{isArray: $isArray, parseSize} = require '../utils' -{JsonRpcError} = require 'json-rpc-peer' -{reduce} = require 'lodash' - -#===================================================================== - -delete_ = $coroutine ({vdi}) -> - resourceSet = reduce( - vdi.$VBDs - (resourceSet, vbd) => resourceSet || @getObject(@getObject(vbd, 'VBD').VM).resourceSet - undefined - ) - - if resourceSet != undefined - yield this.allocateLimitsInResourceSet({ disk: -vdi.size }, resourceSet) - - yield @getXapi(vdi).deleteVdi(vdi._xapiId) - - return - -delete_.params = { - id: { type: 'string' }, -} - -delete_.resolve = { - vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], -} - -exports.delete = delete_ - -#--------------------------------------------------------------------- - -# FIXME: human readable strings should be handled. -set = $coroutine (params) -> - {vdi} = params - xapi = @getXapi vdi - ref = vdi._xapiRef - - # Size. - if 'size' of params - size = parseSize(params.size) - - if size < vdi.size - throw invalidParameters( - "cannot set new size (#{size}) below the current size (#{vdi.size})" - ) - - vbds = vdi.$VBDs - if ( - vbds.length == 1 && - (resourceSetId = xapi.xo.getData(@getObject(vbds[0], 'VBD').VM, 'resourceSet')) != undefined - ) - if @user.permission != 'admin' - yield @checkResourceSetConstraints(resourceSetId, @user.id) - - yield @allocateLimitsInResourceSet({ disk: size - vdi.size }, resourceSetId) - else if !( - @user.permission == 'admin' || - yield @hasPermissions(@user.id, [ [ vdi.$SR, 'operate' ] ]) - ) - throw unauthorized() - - yield xapi.resizeVdi(ref, size) - - # Other fields. - for param, fields of { - 'name_label' - 'name_description' - } - continue unless param of params - - for field in (if $isArray fields then fields else [fields]) - yield xapi.call "VDI.set_#{field}", ref, "#{params[param]}" - - return true - -set.params = { - # Identifier of the VDI to update. - id: { type: 'string' } - - name_label: { type: 'string', optional: true } - - name_description: { type: 'string', optional: true } - - # size of VDI - size: { type: ['integer', 'string'], optional: true } -} - -set.resolve = { - vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], -} - -exports.set = set - -#--------------------------------------------------------------------- - -migrate = $coroutine ({vdi, sr}) -> - xapi = @getXapi vdi - - yield xapi.moveVdi(vdi._xapiRef, sr._xapiRef) - - return true - -migrate.params = { - id: { type: 'string' } - sr_id: { type: 'string' } -} - -migrate.resolve = { - vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], - sr: ['sr_id', 'SR', 'administrate'], -} - -exports.migrate = migrate - -#===================================================================== - -Object.defineProperty(exports, '__esModule', { - value: true -}) diff --git a/src/api/vdi.js b/src/api/vdi.js new file mode 100644 index 000000000..d4399da30 --- /dev/null +++ b/src/api/vdi.js @@ -0,0 +1,122 @@ +// FIXME: rename to disk.* + +import { invalidParameters, unauthorized } from 'xo-common/api-errors' +import { isArray, reduce } from 'lodash' + +import { parseSize } from '../utils' + +// ==================================================================== + +export async function delete_ ({vdi}) { + const resourceSet = reduce( + vdi.$VBDs, + (resourceSet, vbd) => resourceSet || this.getObject(this.getObject(vbd, 'VBD').VM).resourceSet, + undefined + ) + + if (resourceSet !== undefined) { + await this.allocateLimitsInResourceSet({ disk: -vdi.size }, resourceSet) + } + + await this.getXapi(vdi).deleteVdi(vdi._xapiId) +} + +delete_.params = { + id: { type: 'string' }, +} + +delete_.resolve = { + vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], +} + +export { delete_ as delete } + +// ------------------------------------------------------------------- + +// FIXME: human readable strings should be handled. +export async function set (params) { + const {vdi} = params + const xapi = this.getXapi(vdi) + const ref = vdi._xapiRef + + // Size. + if ('size' in params) { + let resourceSetId + const size = parseSize(params.size) + + if (size < vdi.size) { + throw invalidParameters( + `cannot set new size (${size}) below the current size (${vdi.size})` + ) + } + + const vbds = vdi.$VBDs + if ( + (vbds.length === 1) && + ((resourceSetId = xapi.xo.getData(this.getObject(vbds[0], 'VBD').VM, 'resourceSet')) !== undefined) + ) { + if (this.user.permission !== 'admin') { + await this.checkResourceSetConstraints(resourceSetId, this.user.id) + } + + await this.allocateLimitsInResourceSet({ disk: size - vdi.size }, resourceSetId) + } else if (!( + (this.user.permission === 'admin') || + (await this.hasPermissions(this.user.id, [ [ vdi.$SR, 'operate' ] ])) + )) { + throw unauthorized() + } + + await xapi.resizeVdi(ref, size) + } + + // Other fields. + const object = { + 'name_label': 'name_label', + 'name_description': 'name_description', + } + for (const param in object) { + const fields = object[param] + if (!(param in params)) { continue } + + for (const field of (isArray(fields) ? fields : [fields])) { + await xapi.call(`VDI.set_${field}`, ref, `${params[param]}`) + } + } +} + +set.params = { + // Identifier of the VDI to update. + id: { type: 'string' }, + + name_label: { type: 'string', optional: true }, + + name_description: { type: 'string', optional: true }, + + // size of VDI + size: { type: ['integer', 'string'], optional: true }, +} + +set.resolve = { + vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], +} + +// ------------------------------------------------------------------- + +export async function migrate ({vdi, sr}) { + const xapi = this.getXapi(vdi) + + await xapi.moveVdi(vdi._xapiRef, sr._xapiRef) + + return true +} + +migrate.params = { + id: { type: 'string' }, + sr_id: { type: 'string' }, +} + +migrate.resolve = { + vdi: ['id', ['VDI', 'VDI-snapshot'], 'administrate'], + sr: ['sr_id', 'SR', 'administrate'], +}