mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
Add qemuMonitorJSONSetObjectProperty() method for QMP qom-set command
Add a new qemuMonitorJSONSetObjectProperty() method to support invocation of the 'qom-set' JSON monitor command with a provided path, property, and expected data type to set. NOTE: The set API was added only for the purpose of the qemumonitorjsontest The test code uses the same "/machine/i440fx" property as the get test and attempts to set the "realized" property to "true" (which it should be set at anyway).
This commit is contained in:
parent
bdce278984
commit
50336d871a
@ -4691,6 +4691,68 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define MAKE_SET_CMD(STRING, VALUE) \
|
||||||
|
cmd = qemuMonitorJSONMakeCommand("qom-set", \
|
||||||
|
"s:path", path, \
|
||||||
|
"s:property", property, \
|
||||||
|
STRING, VALUE, \
|
||||||
|
NULL)
|
||||||
|
int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon,
|
||||||
|
const char *path,
|
||||||
|
const char *property,
|
||||||
|
qemuMonitorJSONObjectPropertyPtr prop)
|
||||||
|
{
|
||||||
|
int ret = -1;
|
||||||
|
virJSONValuePtr cmd = NULL;
|
||||||
|
virJSONValuePtr reply = NULL;
|
||||||
|
|
||||||
|
switch ((qemuMonitorJSONObjectPropertyType) prop->type) {
|
||||||
|
/* Simple cases of boolean, int, long, uint, ulong, double, and string
|
||||||
|
* will receive return value as part of {"return": xxx} statement
|
||||||
|
*/
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN:
|
||||||
|
MAKE_SET_CMD("b:value", prop->val.b);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_INT:
|
||||||
|
MAKE_SET_CMD("i:value", prop->val.iv);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_LONG:
|
||||||
|
MAKE_SET_CMD("I:value", prop->val.l);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_UINT:
|
||||||
|
MAKE_SET_CMD("u:value", prop->val.ui);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_ULONG:
|
||||||
|
MAKE_SET_CMD("U:value", prop->val.ul);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_DOUBLE:
|
||||||
|
MAKE_SET_CMD("d:value", prop->val.d);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_STRING:
|
||||||
|
MAKE_SET_CMD("s:value", prop->val.str);
|
||||||
|
break;
|
||||||
|
case QEMU_MONITOR_OBJECT_PROPERTY_LAST:
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
|
_("qom-set invalid object property type %d"),
|
||||||
|
prop->type);
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (!cmd)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) == 0)
|
||||||
|
ret = qemuMonitorJSONCheckError(cmd, reply);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virJSONValueFree(cmd);
|
||||||
|
virJSONValueFree(reply);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#undef MAKE_SET_CMD
|
||||||
|
|
||||||
|
|
||||||
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
|
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
|
||||||
const char *type,
|
const char *type,
|
||||||
char ***props)
|
char ***props)
|
||||||
|
@ -349,7 +349,9 @@ int qemuMonitorJSONGetObjectListPaths(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
void qemuMonitorJSONListPathFree(qemuMonitorJSONListPathPtr paths);
|
void qemuMonitorJSONListPathFree(qemuMonitorJSONListPathPtr paths);
|
||||||
|
|
||||||
/* ObjectProperty structures and API are public only for qemumonitorjsontest */
|
/* ObjectProperty structures and Get/Set API's are public only
|
||||||
|
* for qemumonitorjsontest
|
||||||
|
*/
|
||||||
/* Flags for the 'type' field in _qemuMonitorJSONObjectProperty */
|
/* Flags for the 'type' field in _qemuMonitorJSONObjectProperty */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN=1,
|
QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN=1,
|
||||||
@ -384,6 +386,12 @@ int qemuMonitorJSONGetObjectProperty(qemuMonitorPtr mon,
|
|||||||
qemuMonitorJSONObjectPropertyPtr prop)
|
qemuMonitorJSONObjectPropertyPtr prop)
|
||||||
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
||||||
|
|
||||||
|
int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon,
|
||||||
|
const char *path,
|
||||||
|
const char *property,
|
||||||
|
qemuMonitorJSONObjectPropertyPtr prop)
|
||||||
|
ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
||||||
|
|
||||||
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
|
int qemuMonitorJSONGetObjectProps(qemuMonitorPtr mon,
|
||||||
const char *type,
|
const char *type,
|
||||||
char ***props)
|
char ***props)
|
||||||
|
@ -824,6 +824,64 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This test will use a path to /machine/i440fx which should exist in order
|
||||||
|
* to ensure that the qom-set property set works properly. The test will
|
||||||
|
* set a true property to true just as a proof of concept. Setting it to
|
||||||
|
* false is not a good idea...
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
testQemuMonitorJSONSetObjectProperty(const void *data)
|
||||||
|
{
|
||||||
|
const virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
|
||||||
|
qemuMonitorTestPtr test = qemuMonitorTestNew(true, xmlopt);
|
||||||
|
int ret = -1;
|
||||||
|
qemuMonitorJSONObjectProperty prop;
|
||||||
|
|
||||||
|
if (!test)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (qemuMonitorTestAddItem(test, "qom-set",
|
||||||
|
"{ \"return\": {} }") < 0)
|
||||||
|
goto cleanup;
|
||||||
|
if (qemuMonitorTestAddItem(test, "qom-get",
|
||||||
|
"{ \"return\": true }") < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* Let's attempt the setting */
|
||||||
|
memset(&prop, 0, sizeof(qemuMonitorJSONObjectProperty));
|
||||||
|
prop.type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN;
|
||||||
|
prop.val.b = true;
|
||||||
|
if (qemuMonitorJSONSetObjectProperty(qemuMonitorTestGetMonitor(test),
|
||||||
|
"/machine/i440fx",
|
||||||
|
"realized",
|
||||||
|
&prop) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* To make sure it worked, fetch the property - if this succeeds then
|
||||||
|
* we didn't hose things
|
||||||
|
*/
|
||||||
|
memset(&prop, 0, sizeof(qemuMonitorJSONObjectProperty));
|
||||||
|
prop.type = QEMU_MONITOR_OBJECT_PROPERTY_BOOLEAN;
|
||||||
|
if (qemuMonitorJSONGetObjectProperty(qemuMonitorTestGetMonitor(test),
|
||||||
|
"/machine/i440fx",
|
||||||
|
"realized",
|
||||||
|
&prop) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!prop.val.b) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
"expected true, but false returned");
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
qemuMonitorTestFree(test);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mymain(void)
|
mymain(void)
|
||||||
{
|
{
|
||||||
@ -856,6 +914,7 @@ mymain(void)
|
|||||||
DO_TEST(DetachChardev);
|
DO_TEST(DetachChardev);
|
||||||
DO_TEST(GetListPaths);
|
DO_TEST(GetListPaths);
|
||||||
DO_TEST(GetObjectProperty);
|
DO_TEST(GetObjectProperty);
|
||||||
|
DO_TEST(SetObjectProperty);
|
||||||
|
|
||||||
virObjectUnref(xmlopt);
|
virObjectUnref(xmlopt);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user