chore(xo-server): use Xapi's field entries updaters (#4230)
This commit is contained in:
@@ -1542,9 +1542,10 @@ export async function downloadAndInstallXosanPack({ id, version, pool }) {
|
||||
const res = await this.requestResource('xosan', id, version)
|
||||
|
||||
await xapi.installSupplementalPackOnAllHosts(res)
|
||||
await xapi._updateObjectMapProperty(xapi.pool, 'other_config', {
|
||||
xosan_pack_installation_time: String(Math.floor(Date.now() / 1e3)),
|
||||
})
|
||||
await xapi.pool.update_other_config(
|
||||
'xosan_pack_installation_time',
|
||||
String(Math.floor(Date.now() / 1e3))
|
||||
)
|
||||
}
|
||||
|
||||
downloadAndInstallXosanPack.description = 'Register a resource via cloud plugin'
|
||||
|
||||
@@ -255,30 +255,6 @@ export default class Xapi extends XapiBase {
|
||||
)::ignoreErrors()
|
||||
}
|
||||
|
||||
async _updateObjectMapProperty(object, prop, values) {
|
||||
const { $ref: ref, $type: type } = object
|
||||
|
||||
prop = camelToSnakeCase(prop)
|
||||
|
||||
const add = `${type}.add_to_${prop}`
|
||||
const remove = `${type}.remove_from_${prop}`
|
||||
|
||||
await Promise.all(
|
||||
mapToArray(values, (value, name) => {
|
||||
if (value !== undefined) {
|
||||
name = camelToSnakeCase(name)
|
||||
const removal = this.call(remove, ref, name)
|
||||
|
||||
return value === null
|
||||
? removal
|
||||
: removal
|
||||
::ignoreErrors()
|
||||
.then(() => this.call(add, ref, name, prepareXapiParam(value)))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
async setHostProperties(id, { nameLabel, nameDescription }) {
|
||||
await this._setObjectProperties(this.getObject(id), {
|
||||
nameLabel,
|
||||
@@ -295,9 +271,7 @@ export default class Xapi extends XapiBase {
|
||||
nameDescription,
|
||||
}),
|
||||
autoPoweron != null &&
|
||||
this._updateObjectMapProperty(pool, 'other_config', {
|
||||
autoPoweron: autoPoweron ? 'true' : null,
|
||||
}),
|
||||
pool.update_other_config('autoPoweron', autoPoweron ? 'true' : null),
|
||||
])
|
||||
}
|
||||
|
||||
@@ -323,10 +297,10 @@ export default class Xapi extends XapiBase {
|
||||
nameDescription,
|
||||
nameLabel,
|
||||
}),
|
||||
this._updateObjectMapProperty(network, 'other_config', {
|
||||
automatic:
|
||||
automatic === undefined ? undefined : automatic ? 'true' : null,
|
||||
}),
|
||||
network.update_other_config(
|
||||
'automatic',
|
||||
automatic === undefined ? undefined : automatic ? 'true' : null
|
||||
),
|
||||
])
|
||||
}
|
||||
|
||||
@@ -446,9 +420,7 @@ export default class Xapi extends XapiBase {
|
||||
$defer(() => this.plugPbd(ref))
|
||||
})
|
||||
|
||||
return this._updateObjectMapProperty(
|
||||
host,
|
||||
'other_config',
|
||||
return host.update_other_config(
|
||||
multipathing
|
||||
? {
|
||||
multipathing: 'true',
|
||||
@@ -722,12 +694,8 @@ export default class Xapi extends XapiBase {
|
||||
|
||||
await Promise.all([
|
||||
this.call('VM.set_is_a_template', vm.$ref, false),
|
||||
this._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
destroy: null,
|
||||
}),
|
||||
this._updateObjectMapProperty(vm, 'other_config', {
|
||||
default_template: null,
|
||||
}),
|
||||
vm.update_blocked_operations('destroy', null),
|
||||
vm.update_other_config('default_template', null),
|
||||
])
|
||||
|
||||
// must be done before destroying the VM
|
||||
@@ -1075,12 +1043,8 @@ export default class Xapi extends XapiBase {
|
||||
this._setObjectProperties(vm, {
|
||||
name_label: `[Importing…] ${name_label}`,
|
||||
}),
|
||||
this._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
start: 'Importing…',
|
||||
}),
|
||||
this._updateObjectMapProperty(vm, 'other_config', {
|
||||
[TAG_COPY_SRC]: delta.vm.uuid,
|
||||
}),
|
||||
vm.update_blocked_operations('start', 'Importing…'),
|
||||
vm.update_other_config(TAG_COPY_SRC, delta.vm.uuid),
|
||||
])
|
||||
|
||||
// 2. Delete all VBDs which may have been created by the import.
|
||||
@@ -1104,9 +1068,7 @@ export default class Xapi extends XapiBase {
|
||||
newVdi = await this._getOrWaitObject(await this._cloneVdi(baseVdi))
|
||||
$defer.onFailure(() => this._deleteVdi(newVdi.$ref))
|
||||
|
||||
await this._updateObjectMapProperty(newVdi, 'other_config', {
|
||||
[TAG_COPY_SRC]: vdi.uuid,
|
||||
})
|
||||
await newVdi.update_other_config(TAG_COPY_SRC, vdi.uuid)
|
||||
} else {
|
||||
newVdi = await this.createVdi({
|
||||
...vdi,
|
||||
@@ -1205,11 +1167,12 @@ export default class Xapi extends XapiBase {
|
||||
name_label,
|
||||
}),
|
||||
// FIXME: move
|
||||
this._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
start: disableStartAfterImport
|
||||
vm.update_blocked_operations(
|
||||
'start',
|
||||
disableStartAfterImport
|
||||
? 'Do not start this VM, clone it if you want to use it.'
|
||||
: null,
|
||||
}),
|
||||
: null
|
||||
),
|
||||
])
|
||||
|
||||
return { transferSize, vm }
|
||||
@@ -1633,18 +1596,17 @@ export default class Xapi extends XapiBase {
|
||||
}
|
||||
|
||||
async setVcpuWeight(vmId, weight) {
|
||||
weight = weight || null // Take all falsy values as a removal (0 included)
|
||||
const vm = this.getObject(vmId)
|
||||
await this._updateObjectMapProperty(vm, 'VCPUs_params', { weight })
|
||||
await this.getObject(vmId).update_VCPUs_params(
|
||||
'weight',
|
||||
weight || null // Take all falsy values as a removal (0 included)
|
||||
)
|
||||
}
|
||||
|
||||
async _startVm(vm, host, force) {
|
||||
log.debug(`Starting VM ${vm.name_label}`)
|
||||
|
||||
if (force) {
|
||||
await this._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
start: null,
|
||||
})
|
||||
await vm.update_blocked_operations('start', null)
|
||||
}
|
||||
|
||||
return host === undefined
|
||||
@@ -1683,16 +1645,12 @@ export default class Xapi extends XapiBase {
|
||||
if (isVmHvm(vm)) {
|
||||
const { order } = vm.HVM_boot_params
|
||||
|
||||
await this._updateObjectMapProperty(vm, 'HVM_boot_params', {
|
||||
order: 'd',
|
||||
})
|
||||
await vm.update_HVM_boot_params('order', 'd')
|
||||
|
||||
try {
|
||||
await this._startVm(vm)
|
||||
} finally {
|
||||
await this._updateObjectMapProperty(vm, 'HVM_boot_params', {
|
||||
order,
|
||||
})
|
||||
await vm.update_HVM_boot_params('order', order)
|
||||
}
|
||||
} else {
|
||||
// Find the original template by name (*sigh*).
|
||||
@@ -1727,7 +1685,7 @@ export default class Xapi extends XapiBase {
|
||||
this._setObjectProperties(vm, {
|
||||
PV_bootloader: 'eliloader',
|
||||
}),
|
||||
this._updateObjectMapProperty(vm, 'other_config', {
|
||||
vm.update_other_config({
|
||||
'install-distro':
|
||||
template && template.other_config['install-distro'],
|
||||
'install-repository': 'cdrom',
|
||||
|
||||
@@ -68,11 +68,6 @@ declare export class Xapi {
|
||||
sr?: XapiObject,
|
||||
onVmCreation?: (XapiObject) => any
|
||||
): Promise<string>;
|
||||
_updateObjectMapProperty(
|
||||
object: XapiObject,
|
||||
property: string,
|
||||
entries: $Dict<null | string>
|
||||
): Promise<void>;
|
||||
_setObjectProperties(
|
||||
object: XapiObject,
|
||||
properties: $Dict<mixed>
|
||||
|
||||
@@ -353,9 +353,10 @@ export default {
|
||||
if (JSON.parse(update).exit !== 0) {
|
||||
throw new Error('Update install failed')
|
||||
} else {
|
||||
await this._updateObjectMapProperty(host, 'other_config', {
|
||||
rpm_patch_installation_time: String(Date.now() / 1000),
|
||||
})
|
||||
await host.update_other_config(
|
||||
'rpm_patch_installation_time',
|
||||
String(Date.now() / 1000)
|
||||
)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
@@ -125,13 +125,12 @@ export default {
|
||||
if (installMethod === 'network') {
|
||||
// TODO: normalize RHEL URL?
|
||||
|
||||
await this._updateObjectMapProperty(vm, 'other_config', {
|
||||
'install-repository': installRepository,
|
||||
})
|
||||
await vm.update_other_config(
|
||||
'install-repository',
|
||||
installRepository
|
||||
)
|
||||
} else if (installMethod === 'cd') {
|
||||
await this._updateObjectMapProperty(vm, 'other_config', {
|
||||
'install-repository': 'cdrom',
|
||||
})
|
||||
await vm.update_other_config('install-repository', 'cdrom')
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -276,9 +275,7 @@ export default {
|
||||
autoPoweron: {
|
||||
set(value, vm) {
|
||||
return Promise.all([
|
||||
this._updateObjectMapProperty(vm, 'other_config', {
|
||||
autoPoweron: value ? 'true' : null,
|
||||
}),
|
||||
vm.update_other_config('autoPoweron', value ? 'true' : null),
|
||||
value &&
|
||||
this.setPoolProperties({
|
||||
autoPoweron: true,
|
||||
@@ -304,11 +301,8 @@ export default {
|
||||
},
|
||||
|
||||
coresPerSocket: {
|
||||
set(coresPerSocket, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'platform', {
|
||||
'cores-per-socket': coresPerSocket,
|
||||
})
|
||||
},
|
||||
set: (coresPerSocket, vm) =>
|
||||
vm.update_platform('cores-per-socket', coresPerSocket),
|
||||
},
|
||||
|
||||
CPUs: 'cpus',
|
||||
@@ -334,18 +328,16 @@ export default {
|
||||
|
||||
cpuCap: {
|
||||
get: vm => vm.VCPUs_params.cap && +vm.VCPUs_params.cap,
|
||||
set(cap, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'VCPUs_params', { cap })
|
||||
},
|
||||
set: (cap, vm) => vm.update_VCPUs_params('cap', cap),
|
||||
},
|
||||
|
||||
cpuMask: {
|
||||
get: vm => vm.VCPUs_params.mask && vm.VCPUs_params.mask.split(','),
|
||||
set(cpuMask, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'VCPUs_params', {
|
||||
mask: cpuMask == null ? cpuMask : cpuMask.join(','),
|
||||
})
|
||||
},
|
||||
set: (cpuMask, vm) =>
|
||||
vm.update_VCPUs_params(
|
||||
'mask',
|
||||
cpuMask == null ? cpuMask : cpuMask.join(',')
|
||||
),
|
||||
},
|
||||
|
||||
cpusMax: 'cpusStaticMax',
|
||||
@@ -359,9 +351,7 @@ export default {
|
||||
|
||||
cpuWeight: {
|
||||
get: vm => vm.VCPUs_params.weight && +vm.VCPUs_params.weight,
|
||||
set(weight, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'VCPUs_params', { weight })
|
||||
},
|
||||
set: (weight, vm) => vm.update_VCPUs_params('weight', weight),
|
||||
},
|
||||
|
||||
highAvailability: {
|
||||
@@ -439,19 +429,12 @@ export default {
|
||||
hasVendorDevice: true,
|
||||
|
||||
expNestedHvm: {
|
||||
set(expNestedHvm, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'platform', {
|
||||
'exp-nested-hvm': expNestedHvm ? 'true' : null,
|
||||
})
|
||||
},
|
||||
set: (expNestedHvm, vm) =>
|
||||
vm.update_platform('exp-nested-hvm', expNestedHvm ? 'true' : null),
|
||||
},
|
||||
|
||||
nicType: {
|
||||
set(nicType, vm) {
|
||||
return this._updateObjectMapProperty(vm, 'platform', {
|
||||
nic_type: nicType,
|
||||
})
|
||||
},
|
||||
set: (nicType, vm) => vm.update_platform('nic_type', nicType),
|
||||
},
|
||||
|
||||
vga: {
|
||||
@@ -461,7 +444,7 @@ export default {
|
||||
`The different values that the VGA can take are: ${XEN_VGA_VALUES}`
|
||||
)
|
||||
}
|
||||
return this._updateObjectMapProperty(vm, 'platform', { vga })
|
||||
return vm.update_platform('vga', vga)
|
||||
},
|
||||
},
|
||||
|
||||
@@ -472,7 +455,7 @@ export default {
|
||||
`The different values that the video RAM can take are: ${XEN_VIDEORAM_VALUES}`
|
||||
)
|
||||
}
|
||||
return this._updateObjectMapProperty(vm, 'platform', { videoram })
|
||||
return vm.update_platform('videoram', videoram)
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
@@ -162,11 +162,17 @@ export const makeEditObject = specs => {
|
||||
}
|
||||
}
|
||||
|
||||
const map = set.slice(0, index)
|
||||
const prop = set.slice(index + 1)
|
||||
const field = set.slice(0, index)
|
||||
const entry = set.slice(index + 1)
|
||||
|
||||
return function(value, object) {
|
||||
return this._updateObjectMapProperty(object, map, { [prop]: value })
|
||||
return this.setFieldEntry(
|
||||
object.$type,
|
||||
object.$ref,
|
||||
field,
|
||||
entry,
|
||||
value
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -937,7 +937,7 @@ export default class BackupNg {
|
||||
message: 'clean backup metadata on VM',
|
||||
parentId: taskId,
|
||||
},
|
||||
xapi._updateObjectMapProperty(vm, 'other_config', {
|
||||
vm.update_other_config({
|
||||
'xo:backup:datetime': null,
|
||||
'xo:backup:deltaChainLength': null,
|
||||
'xo:backup:exported': null,
|
||||
@@ -1051,7 +1051,7 @@ export default class BackupNg {
|
||||
message: 'add metadata to snapshot',
|
||||
parentId: taskId,
|
||||
},
|
||||
xapi._updateObjectMapProperty(snapshot, 'other_config', {
|
||||
snapshot.update_other_config({
|
||||
'xo:backup:datetime': snapshot.snapshot_time,
|
||||
'xo:backup:job': jobId,
|
||||
'xo:backup:schedule': scheduleId,
|
||||
@@ -1270,13 +1270,11 @@ export default class BackupNg {
|
||||
await Promise.all([
|
||||
xapi.addTag(vm.$ref, 'Disaster Recovery'),
|
||||
disableVmHighAvailability(xapi, vm),
|
||||
xapi._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
start:
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.',
|
||||
}),
|
||||
xapi._updateObjectMapProperty(vm, 'other_config', {
|
||||
'xo:backup:sr': srId,
|
||||
}),
|
||||
vm.update_blocked_operations(
|
||||
'start',
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.'
|
||||
),
|
||||
vm.update_other_config('xo:backup:sr', srId),
|
||||
])
|
||||
|
||||
if (!deleteFirst) {
|
||||
@@ -1630,13 +1628,11 @@ export default class BackupNg {
|
||||
await Promise.all([
|
||||
xapi.addTag(vm.$ref, 'Continuous Replication'),
|
||||
disableVmHighAvailability(xapi, vm),
|
||||
xapi._updateObjectMapProperty(vm, 'blocked_operations', {
|
||||
start:
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.',
|
||||
}),
|
||||
xapi._updateObjectMapProperty(vm, 'other_config', {
|
||||
'xo:backup:sr': srId,
|
||||
}),
|
||||
vm.update_blocked_operations(
|
||||
'start',
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.'
|
||||
),
|
||||
vm.update_other_config('xo:backup:sr', srId),
|
||||
])
|
||||
|
||||
if (!deleteFirst) {
|
||||
@@ -1667,9 +1663,7 @@ export default class BackupNg {
|
||||
message: 'set snapshot.other_config[xo:backup:exported]',
|
||||
parentId: taskId,
|
||||
},
|
||||
xapi._updateObjectMapProperty(snapshot, 'other_config', {
|
||||
'xo:backup:exported': 'true',
|
||||
})
|
||||
snapshot.update_other_config('xo:backup:exported', 'true')
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -456,11 +456,9 @@ export default class {
|
||||
|
||||
// (Asynchronously) Identify snapshot as future base.
|
||||
promise
|
||||
.then(() => {
|
||||
return srcXapi._updateObjectMapProperty(srcVm, 'other_config', {
|
||||
[TAG_LAST_BASE_DELTA]: delta.vm.uuid,
|
||||
})
|
||||
})
|
||||
.then(() =>
|
||||
srcVm.update_other_config(TAG_LAST_BASE_DELTA, delta.vm.uuid)
|
||||
)
|
||||
::ignoreErrors()
|
||||
|
||||
return promise
|
||||
@@ -974,10 +972,10 @@ export default class {
|
||||
nameLabel: copyName,
|
||||
})
|
||||
|
||||
targetXapi._updateObjectMapProperty(data.vm, 'blocked_operations', {
|
||||
start:
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.',
|
||||
})
|
||||
data.vm.update_blocked_operations(
|
||||
'start',
|
||||
'Start operation for this vm is blocked, clone it if you want to use it.'
|
||||
)
|
||||
|
||||
await targetXapi.addTag(data.vm.$id, 'Disaster Recovery')
|
||||
|
||||
|
||||
@@ -386,14 +386,12 @@ export default class {
|
||||
return value && JSON.parse(value)
|
||||
},
|
||||
setData: async (id, key, value) => {
|
||||
await xapi._updateObjectMapProperty(
|
||||
xapi.getObject(id),
|
||||
'other_config',
|
||||
{
|
||||
[`xo:${camelToSnakeCase(key)}`]:
|
||||
value !== null ? JSON.stringify(value) : value,
|
||||
}
|
||||
)
|
||||
await xapi
|
||||
.getObject(id)
|
||||
.update_other_config(
|
||||
`xo:${camelToSnakeCase(key)}`,
|
||||
value !== null ? JSON.stringify(value) : value
|
||||
)
|
||||
|
||||
// Register the updated object.
|
||||
addObject(await xapi._waitObject(id))
|
||||
|
||||
Reference in New Issue
Block a user