mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-24 06:03:52 +03:00
qemu: monitor: Make wrapping of 'props' of 'object-add' optional
Construct the JSON object which is used for object-add without the 'props' wrapper and add the wrapper only in the monitor code. This simplifies the JSON->commandline generator in the first place and also prepares for upcoming qemu where 'props' will be removed. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
3d50ecc9bb
commit
e0eeb2cc67
@ -109,6 +109,9 @@ struct _qemuMonitor {
|
||||
qemuMonitorReportDomainLogError logFunc;
|
||||
void *logOpaque;
|
||||
virFreeCallback logDestroy;
|
||||
|
||||
/* true if qemu no longer wants 'props' sub-object of object-add */
|
||||
bool objectAddNoWrap;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -3017,14 +3020,12 @@ qemuMonitorCreateObjectPropsWrap(const char *type,
|
||||
const char *alias,
|
||||
virJSONValuePtr *props)
|
||||
{
|
||||
virJSONValuePtr ret;
|
||||
|
||||
ignore_value(virJSONValueObjectCreate(&ret,
|
||||
"s:qom-type", type,
|
||||
"s:id", alias,
|
||||
"A:props", props,
|
||||
NULL));
|
||||
return ret;
|
||||
if (virJSONValueObjectPrependString(*props, "id", alias) < 0 ||
|
||||
virJSONValueObjectPrependString(*props, "qom-type", type))
|
||||
return NULL;
|
||||
|
||||
return g_steal_pointer(props);
|
||||
}
|
||||
|
||||
|
||||
@ -3044,26 +3045,28 @@ qemuMonitorCreateObjectProps(virJSONValuePtr *propsret,
|
||||
const char *alias,
|
||||
...)
|
||||
{
|
||||
virJSONValuePtr props = NULL;
|
||||
int ret = -1;
|
||||
g_autoptr(virJSONValue) props = NULL;
|
||||
int rc;
|
||||
va_list args;
|
||||
|
||||
*propsret = NULL;
|
||||
if (virJSONValueObjectCreate(&props,
|
||||
"s:qom-type", type,
|
||||
"s:id", alias,
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
|
||||
|
||||
va_start(args, alias);
|
||||
|
||||
if (virJSONValueObjectCreateVArgs(&props, args) < 0)
|
||||
goto cleanup;
|
||||
rc = virJSONValueObjectAddVArgs(props, args);
|
||||
|
||||
if (!(*propsret = qemuMonitorCreateObjectPropsWrap(type, alias, &props)))
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virJSONValueFree(props);
|
||||
va_end(args);
|
||||
return ret;
|
||||
|
||||
if (rc < 0)
|
||||
return -1;
|
||||
|
||||
*propsret = g_steal_pointer(&props);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -3083,6 +3086,7 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
|
||||
virJSONValuePtr *props,
|
||||
char **alias)
|
||||
{
|
||||
g_autoptr(virJSONValue) pr = NULL;
|
||||
const char *type = NULL;
|
||||
const char *id = NULL;
|
||||
g_autofree char *aliasCopy = NULL;
|
||||
@ -3110,7 +3114,31 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
|
||||
if (alias)
|
||||
aliasCopy = g_strdup(id);
|
||||
|
||||
if (qemuMonitorJSONAddObject(mon, props) < 0)
|
||||
if (mon->objectAddNoWrap) {
|
||||
pr = g_steal_pointer(props);
|
||||
} else {
|
||||
/* we need to create a wrapper which has the 'qom-type' and 'id' and
|
||||
* store everything else under a 'props' sub-object */
|
||||
g_autoptr(virJSONValue) typeobj = NULL;
|
||||
g_autoptr(virJSONValue) idobj = NULL;
|
||||
|
||||
ignore_value(virJSONValueObjectRemoveKey(*props, "qom-type", &typeobj));
|
||||
ignore_value(virJSONValueObjectRemoveKey(*props, "id", &idobj));
|
||||
|
||||
if (!virJSONValueObjectGetKey(*props, 0)) {
|
||||
virJSONValueFree(*props);
|
||||
*props = NULL;
|
||||
}
|
||||
|
||||
if (virJSONValueObjectCreate(&pr,
|
||||
"s:qom-type", type,
|
||||
"s:id", id,
|
||||
"A:props", props,
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (qemuMonitorJSONAddObject(mon, &pr) < 0)
|
||||
return -1;
|
||||
|
||||
if (alias)
|
||||
|
@ -303,12 +303,13 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
|
||||
const char *type,
|
||||
const char *alias,
|
||||
virJSONValuePtr props)
|
||||
int
|
||||
virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
|
||||
virJSONValuePtr objprops)
|
||||
{
|
||||
const char *type = virJSONValueObjectGetString(objprops, "qom-type");
|
||||
const char *alias = virJSONValueObjectGetString(objprops, "id");
|
||||
|
||||
if (!type || !alias) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("missing 'type'(%s) or 'alias'(%s) field of QOM 'object'"),
|
||||
@ -316,31 +317,16 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
|
||||
return -1;
|
||||
}
|
||||
|
||||
virBufferAsprintf(buf, "%s,id=%s", type, alias);
|
||||
virBufferAsprintf(buf, "%s,", type);
|
||||
|
||||
if (props) {
|
||||
virBufferAddLit(buf, ",");
|
||||
if (virQEMUBuildCommandLineJSON(props, buf, NULL,
|
||||
virQEMUBuildCommandLineJSONArrayBitmap) < 0)
|
||||
return -1;
|
||||
}
|
||||
if (virQEMUBuildCommandLineJSON(objprops, buf, "qom-type",
|
||||
virQEMUBuildCommandLineJSONArrayBitmap) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
|
||||
virJSONValuePtr objprops)
|
||||
{
|
||||
const char *type = virJSONValueObjectGetString(objprops, "qom-type");
|
||||
const char *alias = virJSONValueObjectGetString(objprops, "id");
|
||||
virJSONValuePtr props = virJSONValueObjectGetObject(objprops, "props");
|
||||
|
||||
return virQEMUBuildObjectCommandlineFromJSONInternal(buf, type, alias, props);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr srcdef)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user