chore(api): decaffeinate vdi (#643)

This commit is contained in:
Julien Fontanet 2018-01-08 12:00:30 +01:00 committed by GitHub
parent a601154fc7
commit cfcd302294
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 122 additions and 126 deletions

View File

@ -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
})

122
src/api/vdi.js Normal file
View File

@ -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'],
}