chore(api): decaffeinate vdi (#643)
This commit is contained in:
parent
a601154fc7
commit
cfcd302294
@ -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
122
src/api/vdi.js
Normal 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'],
|
||||
}
|
Loading…
Reference in New Issue
Block a user