chore(xen-api/*setField*): take separate type and ref

This commit is contained in:
Julien Fontanet 2019-02-22 18:30:43 +01:00
parent 5eb1454e67
commit 58e8d75935
2 changed files with 21 additions and 28 deletions

View File

@ -82,21 +82,17 @@ ${cliName} v${pkg.version}
)
await Promise.all([
srcXapi.setFieldEntries(srcSnapshot, 'other_config', metadata),
srcXapi.setFieldEntries(srcSnapshot, 'other_config', {
srcSnapshot.update_other_config(metadata),
srcSnapshot.update_other_config({
'xo:backup:exported': 'true',
}),
tgtXapi.setField(
tgtVm,
'name_label',
`${srcVm.name_label} (${srcSnapshot.snapshot_time})`
),
tgtXapi.setFieldEntries(tgtVm, 'other_config', metadata),
tgtXapi.setFieldEntries(tgtVm, 'other_config', {
tgtVm.set_name_label(`${srcVm.name_label} (${srcSnapshot.snapshot_time})`),
tgtVm.update_other_config(metadata),
tgtVm.update_other_config({
'xo:backup:sr': tgtSr.uuid,
'xo:copy_of': srcSnapshotUuid,
}),
tgtXapi.setFieldEntries(tgtVm, 'blocked_operations', {
tgtVm.update_blocked_operations({
start:
'Start operation for this vm is blocked, clone it if you want to use it.',
}),
@ -105,12 +101,9 @@ ${cliName} v${pkg.version}
const srcDisk = srcDisks[userDevice]
const tgtDisk = tgtDisks[userDevice]
return tgtXapi.setFieldEntry(
tgtDisk,
'other_config',
'xo:copy_of',
srcDisk.uuid
)
return tgtDisk.update_other_config({
'xo:copy_of': srcDisk.uuid,
})
})
),
])

View File

@ -724,39 +724,39 @@ export class Xapi extends EventEmitter {
)
}
setField({ $type, $ref }, field, value) {
return this.call(`${$type}.set_${field}`, $ref, value).then(noop)
setField(type, ref, field, value) {
return this.call(`${type}.set_${field}`, ref, value).then(noop)
}
setFieldEntries(record, field, entries) {
setFieldEntries(type, ref, field, entries) {
return Promise.all(
getKeys(entries).map(entry => {
const value = entries[entry]
if (value !== undefined) {
return value === null
? this.unsetFieldEntry(record, field, entry)
: this.setFieldEntry(record, field, entry, value)
? this.unsetFieldEntry(type, ref, field, entry)
: this.setFieldEntry(type, ref, field, entry, value)
}
})
).then(noop)
}
async setFieldEntry({ $type, $ref }, field, entry, value) {
async setFieldEntry(type, ref, field, entry, value) {
while (true) {
try {
await this.call(`${$type}.add_to_${field}`, $ref, entry, value)
await this.call(`${type}.add_to_${field}`, ref, entry, value)
return
} catch (error) {
if (error == null || error.code !== 'MAP_DUPLICATE_KEY') {
throw error
}
}
await this.unsetFieldEntry({ $type, $ref }, field, entry)
await this.unsetFieldEntry(type, ref, field, entry)
}
}
unsetFieldEntry({ $type, $ref }, field, entry) {
return this.call(`${$type}.remove_from_${field}`, $ref, entry)
unsetFieldEntry(type, ref, field, entry) {
return this.call(`${type}.remove_from_${field}`, ref, entry)
}
watchTask(ref) {
@ -1073,7 +1073,7 @@ export class Xapi extends EventEmitter {
const props = { $type: type }
fields.forEach(field => {
props[`set_${field}`] = function(value) {
return xapi.setField(this, field, value)
return xapi.setField(this.$type, this.$ref, field, value)
}
const $field = (field in RESERVED_FIELDS ? '$$' : '$') + field
@ -1102,7 +1102,7 @@ export class Xapi extends EventEmitter {
return result
}
props[`update_${field}`] = function(entries) {
return xapi.setFieldEntries(this, field, entries)
return xapi.setFieldEntries(this.$type, this.$ref, field, entries)
}
} else if (value === '' || isOpaqueRef(value)) {
// 2019-02-07 - JFT: even if `value` should not be an empty string for