[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 1/7] qemu-agent: add agent init callback when detectin
From: |
Chen Fan |
Subject: |
[Qemu-devel] [RFC 1/7] qemu-agent: add agent init callback when detecting guest setup |
Date: |
Fri, 17 Apr 2015 16:53:03 +0800 |
sometimes, we want to do some initialize work in guest when guest startup,
but currently, qemu-agent doesn't support that. so here we add an init
callback, when guest startup, notify libvirt it has been up, then
libvirt can do some work for guest.
Signed-off-by: Chen Fan <address@hidden>
---
src/qemu/qemu_agent.c | 26 +++++++++++++++++++++++---
src/qemu/qemu_agent.h | 2 ++
src/qemu/qemu_process.c | 6 ++++++
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 548d580..cee0f8b 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -92,6 +92,7 @@ struct _qemuAgent {
int watch;
bool connectPending;
+ bool connected;
virDomainObjPtr vm;
@@ -306,6 +307,7 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
virJSONValuePtr obj = NULL;
int ret = -1;
unsigned long long id;
+ const char *status;
VIR_DEBUG("Line [%s]", line);
@@ -318,7 +320,11 @@ qemuAgentIOProcessLine(qemuAgentPtr mon,
goto cleanup;
}
- if (virJSONValueObjectHasKey(obj, "QMP") == 1) {
+ if (virJSONValueObjectHasKey(obj, "QMP") == 1 ||
+ virJSONValueObjectHasKey(obj, "status") == 1) {
+ status = virJSONValueObjectGetString(obj, "status");
+ if (STREQ(status, "connected"))
+ mon->connected = true;
ret = 0;
} else if (virJSONValueObjectHasKey(obj, "event") == 1) {
ret = qemuAgentIOProcessEvent(mon, obj);
@@ -700,8 +706,22 @@ qemuAgentIO(int watch, int fd, int events, void *opaque)
VIR_DEBUG("Triggering error callback");
(errorNotify)(mon, vm);
} else {
- virObjectUnlock(mon);
- virObjectUnref(mon);
+ if (mon->connected) {
+ void (*init)(qemuAgentPtr, virDomainObjPtr)
+ = mon->cb->init;
+ virDomainObjPtr vm = mon->vm;
+
+ mon->connected = false;
+
+ virObjectUnlock(mon);
+ virObjectUnref(mon);
+
+ VIR_DEBUG("Triggering init callback");
+ (init)(mon, vm);
+ } else {
+ virObjectUnlock(mon);
+ virObjectUnref(mon);
+ }
}
}
diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
index 1cd5749..42414a7 100644
--- a/src/qemu/qemu_agent.h
+++ b/src/qemu/qemu_agent.h
@@ -34,6 +34,8 @@ typedef qemuAgent *qemuAgentPtr;
typedef struct _qemuAgentCallbacks qemuAgentCallbacks;
typedef qemuAgentCallbacks *qemuAgentCallbacksPtr;
struct _qemuAgentCallbacks {
+ void (*init)(qemuAgentPtr mon,
+ virDomainObjPtr vm);
void (*destroy)(qemuAgentPtr mon,
virDomainObjPtr vm);
void (*eofNotify)(qemuAgentPtr mon,
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 276837e..e6fc53a 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -194,8 +194,14 @@ static void qemuProcessHandleAgentDestroy(qemuAgentPtr
agent,
virObjectUnref(vm);
}
+static void qemuProcessHandleAgentInit(qemuAgentPtr agent ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm)
+{
+ VIR_DEBUG("Received init from agent on %p '%s'", vm, vm->def->name);
+}
static qemuAgentCallbacks agentCallbacks = {
+ .init = qemuProcessHandleAgentInit,
.destroy = qemuProcessHandleAgentDestroy,
.eofNotify = qemuProcessHandleAgentEOF,
.errorNotify = qemuProcessHandleAgentError,
--
1.9.3
- [Qemu-devel] [RFC 0/7] Live Migration with Pass-through Devices proposal, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 1/7] qemu-agent: add agent init callback when detecting guest setup,
Chen Fan <=
- [Qemu-devel] [RFC 2/7] qemu: add guest init event callback to do the initialize work for guest, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 3/7] hostdev: add a 'bond' type element in <hostdev> element, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 4/7] qemu-agent: add qemuAgentCreateBond interface, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 6/7] migrate: hot remove hostdev at perform phase for bond device, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 5/7] hostdev: add parse ip and route for bond configure, Chen Fan, 2015/04/17
- [Qemu-devel] [RFC 0/3] add support migration with passthrough device, Chen Fan, 2015/04/17