
On Wed, Jul 03, 2013 at 11:30:46AM -0400, John Ferlan wrote:
On 07/03/2013 06:56 AM, Daniel P. Berrange wrote:
On Tue, Jul 02, 2013 at 09:39:19AM -0400, John Ferlan wrote:
Add a new qemuMonitorGetObjectListPaths() method to support invocation of the 'qom-list' JSON monitor command with a provided path.
The returned list of paired data fields of "name" and "type" that can be used to peruse QOM configuration data and eventually utilize for the balloon statistics.
The test does a "{"execute":"qom-list", "arguments": { "path": "/"}}" which returns "{"return": [{"name": "machine", "type": "child<container>"}, {"name": "type", "type": "string"}]}" resulting in a return of an array of 2 elements with [0].name="machine", [0].type="child<container>". The [1] entry appears to be a header that could be used some day via a command such as "virsh qemuobject --list" to format output.
Top marks for adding a test !
--- src/qemu/qemu_monitor.c | 33 ++++++++++++++++ src/qemu/qemu_monitor.h | 15 +++++++ src/qemu/qemu_monitor_json.c | 93 ++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 6 +++ tests/qemumonitorjsontest.c | 77 ++++++++++++++++++++++++++++++++++++ 5 files changed, 224 insertions(+)
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 86ef635..2e92f8c 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -679,6 +679,21 @@ int qemuMonitorGetKVMState(qemuMonitorPtr mon,
int qemuMonitorGetObjectTypes(qemuMonitorPtr mon, char ***types); + +typedef struct _qemuMonitorListPath qemuMonitorListPath; +typedef qemuMonitorListPath *qemuMonitorListPathPtr; + +struct _qemuMonitorListPath { + char *name; + char *type; +}; + +int qemuMonitorGetObjectListPaths(qemuMonitorPtr mon, + const char *path, + qemuMonitorListPathPtr **paths); + +void qemuMonitorListPathFree(qemuMonitorListPathPtr paths);
The qom related monitor calls are super generic, which also means they are a super PITA to deal with in code. To mitigate this, I think we should try to keep code that uses the qom commands isolated in the qemu_monitor* files, and then expose higher level APIs to the rest of the QEMU driver code.
So I think it is ok to expose these APIs in qemu_monitor_json.h, but we should not expose it in qemu_monitor.h
Daniel
The model I followed was the same model other entry points used through qemu_monitor and into qemu_monitor_json (and for some into qemu_monitor_text).
If I read this correctly, for the first 3 patches it seems you are advocating removing the middle man - that is later rather than calling qemuMonitorGetObjectListPaths call qemuMonitorJSONGetObjectListPaths directly. Similarly for the GetObject & PutObject calls.
No, I'm not recommending that qemu_driver/qemu_process call into qemu_monitor_json.h I'm saying that instead of directly exposing the ugly interface of the QOM commands to callers of qemu_monitor.h, we should have a higher level API exposed. eg, qemu_monitor.h should just expose qemuMonitorGetMemoryStats() (already exists in fact) qemuMonitorSetMemoryStatsRefresPeriod() and then the qemu_monitor.c impls of these methods can call qemuMonitorJSON{GetObjectListPaths,GetObject,PutObject}. No other code outside of the qemu_monitor.c file then has to know about qemuMonitorJSON{GetObjectListPaths,GetObject,PutObject} Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|