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