[libvirt] [PATCH 0/9] Add supports for three new QMP events

This patch series adds support for 3 new QMP events: WAKEUP, SUSPEND, and DEVICE_TRAY_MOVED, and related changes on domain's conf and status. [1/9] Add support for tray moved event [2/9] ~ [5/9]: New attribute "tray" is added to disk target, it indicates the tray status of removable disk, i.e. CDROM and Floppy disks, its value could be either of "open" or "closed", defaults to "closed", and a removable disk with tray == "open" won't have the source when domain is started. The value of "tray" will be updated while tray moved event is emitted from guest. Prior to these patches, if the user ejected the medium of removable disk from guest side, and then do migration or save/restoring, the guest will still starts the medium source ,and thus the medium will still exists in guest, which is strange. These patches fix it. [6/9] + [8/9]: Add support for wakeup event, and update the domain status to paused if the domain is running, while the wakeup event is emitted. [7/9] + [9/9]: Add support for suspend event, and update the domain status to running if the domain was paused by suspend event, while the suspend event is emitted. Osier Yang(9) Add support for event tray moved of removable disks docs: Add documentation for new attribute tray of disk target conf: Parse and for the tray attribute qemu: Do not start with source for removable disks if tray is open qemu: Update tray status while tray moved event is emitted Add support for the wakeup event Add support for the event suspend qemu: Update domain status to paused while suspend event is emitted qemu: Update domain status to running while wakeup event is emitted daemon/remote.c | 80 +++++++++++ docs/formatdomain.html.in | 13 ++- docs/schemas/domaincommon.rng | 8 + examples/domain-events/events-c/event-test.c | 61 ++++++++- examples/domain-events/events-python/event-test.py | 12 ++ include/libvirt/libvirt.h.in | 56 ++++++++ python/libvirt-override-virConnect.py | 27 ++++ python/libvirt-override.c | 146 ++++++++++++++++++++ src/conf/domain_conf.c | 33 +++++- src/conf/domain_conf.h | 9 ++ src/conf/domain_event.c | 117 ++++++++++++++++ src/conf/domain_event.h | 10 ++ src/libvirt_private.syms | 6 + src/qemu/qemu_command.c | 16 ++- src/qemu/qemu_monitor.c | 37 +++++ src/qemu/qemu_monitor.h | 14 ++ src/qemu/qemu_monitor_json.c | 37 +++++- src/qemu/qemu_process.c | 131 ++++++++++++++++++ src/remote/remote_driver.c | 98 +++++++++++++ src/remote/remote_protocol.x | 19 +++- src/remote_protocol-structs | 11 ++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 2 +- .../qemuxml2argv-boot-complex-bootindex.xml | 6 +- .../qemuxml2argvdata/qemuxml2argv-boot-complex.xml | 6 +- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 +- ...uxml2argv-boot-menu-disable-drive-bootindex.xml | 2 +- .../qemuxml2argv-boot-menu-disable-drive.xml | 2 +- .../qemuxml2argv-boot-menu-disable.xml | 2 +- .../qemuxml2argv-boot-menu-enable.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 4 +- tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 2 +- .../qemuxml2argv-disk-cdrom-empty.xml | 2 +- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 4 + .../qemuxml2argv-disk-cdrom-tray-no-device-cap.xml | 32 +++++ .../qemuxml2argv-disk-cdrom-tray.args | 10 ++ .../qemuxml2argv-disk-cdrom-tray.xml | 43 ++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 +- .../qemuxml2argv-disk-copy_on_read.xml | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.xml | 2 +- .../qemuxml2argv-disk-drive-boot-disk.xml | 2 +- .../qemuxml2argv-disk-drive-cache-directsync.xml | 2 +- .../qemuxml2argv-disk-drive-cache-unsafe.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 2 +- ...muxml2argv-disk-drive-error-policy-enospace.xml | 2 +- .../qemuxml2argv-disk-drive-error-policy-stop.xml | 2 +- ...rgv-disk-drive-error-policy-wreport-rignore.xml | 2 +- .../qemuxml2argv-disk-drive-fmt-qcow.xml | 2 +- .../qemuxml2argv-disk-drive-no-boot.xml | 4 +- .../qemuxml2argv-disk-drive-readonly-disk.xml | 2 +- .../qemuxml2argv-disk-drive-readonly-no-device.xml | 2 +- .../qemuxml2argv-disk-drive-shared.xml | 2 +- ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 4 + ...qemuxml2argv-disk-floppy-tray-no-device-cap.xml | 37 +++++ .../qemuxml2argv-disk-floppy-tray.args | 10 ++ .../qemuxml2argv-disk-floppy-tray.xml | 37 +++++ .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 4 +- .../qemuxml2argv-disk-ioeventfd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml | 2 +- .../qemuxml2argv-disk-snapshot.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +- .../qemuxml2argv-floppy-drive-fat.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 2 +- .../qemuxml2argv-net-bandwidth.xml | 2 +- tests/qemuxml2argvtest.c | 6 + .../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml | 8 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml | 4 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml | 2 +- tools/virsh.c | 4 + 88 files changed, 1185 insertions(+), 79 deletions(-) Regards, Osier

This patch introduces a new event type for the QMP event DEVICE_TRAY_MOVED, which occurs when the tray of a removable disk is moved (i.e opened or closed): VIR_DOMAIN_EVENT_ID_TRAY_MOVED The event's data includes the device alias and the tray's status, which indicates whether the tray has been opened or closed. Thus the callback definition for the event is: typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, unsigned int trayOpened, void *opaque); --- daemon/remote.c | 33 +++++++++++ examples/domain-events/events-c/event-test.c | 21 +++++++- examples/domain-events/events-python/event-test.py | 4 ++ include/libvirt/libvirt.h.in | 20 +++++++ python/libvirt-override-virConnect.py | 10 ++++ python/libvirt-override.c | 50 +++++++++++++++++ src/conf/domain_event.c | 58 ++++++++++++++++++++ src/conf/domain_event.h | 6 ++ src/libvirt_private.syms | 2 + src/qemu/qemu_monitor.c | 13 +++++ src/qemu/qemu_monitor.h | 7 +++ src/qemu/qemu_monitor_json.c | 18 ++++++ src/qemu/qemu_process.c | 32 +++++++++++ src/remote/remote_driver.c | 34 ++++++++++++ src/remote/remote_protocol.x | 9 +++- src/remote_protocol-structs | 5 ++ 16 files changed, 320 insertions(+), 2 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 74a5f16..cc464fd 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -505,6 +505,38 @@ mem_error: } +static int remoteRelayDomainEventTrayMoved(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque) { + virNetServerClientPtr client = opaque; + remote_domain_event_tray_moved_msg data; + + if (!client) + return -1; + + VIR_DEBUG("Relaying domain %s %d tray moved devAlias: %s trayOpened: %s", + dom->name, dom->id, devAlias, trayOpened ? "yes": "no"); + + /* build return data */ + memset(&data, 0, sizeof data); + + if (!(data.devAlias = strdup(devAlias))) { + virReportOOMError(); + return -1; + } + data.trayOpened = trayOpened; + + make_nonnull_domain(&data.dom, dom); + + remoteDispatchDomainEventSend(client, remoteProgram, + REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED, + (xdrproc_t)xdr_remote_domain_event_tray_moved_msg, &data); + + return 0; +} + static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventLifecycle), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventReboot), @@ -516,6 +548,7 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventControlError), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventBlockJob), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventDiskChange), + VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventTrayMoved), }; verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index f4938c4..c7bcaeb 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -313,6 +313,17 @@ static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int myDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) removable disk's tray moved devAlias: %s trayOpened: %s\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), + devAlias, trayOpened ? "yes" : "no"); + return 0; +} static void myFreeFunc(void *opaque) { @@ -349,6 +360,7 @@ int main(int argc, char **argv) int callback7ret = -1; int callback8ret = -1; int callback9ret = -1; + int callback10ret = -1; struct sigaction action_stop; memset(&action_stop, 0, sizeof action_stop); @@ -419,6 +431,11 @@ int main(int argc, char **argv) VIR_DOMAIN_EVENT_ID_DISK_CHANGE, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDiskChangeCallback), strdup("disk change"), myFreeFunc); + callback10ret = virConnectDomainEventRegisterAny(dconn, + NULL, + VIR_DOMAIN_EVENT_ID_TRAY_MOVED, + VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayMovedCallback), + strdup("tray moved"), myFreeFunc); if ((callback1ret != -1) && (callback2ret != -1) && @@ -427,7 +444,8 @@ int main(int argc, char **argv) (callback5ret != -1) && (callback6ret != -1) && (callback7ret != -1) && - (callback9ret != -1)) { + (callback9ret != -1) && + (callback10ret != -1)) { if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { virErrorPtr err = virGetLastError(); fprintf(stderr, "Failed to start keepalive protocol: %s\n", @@ -452,6 +470,7 @@ int main(int argc, char **argv) virConnectDomainEventDeregisterAny(dconn, callback6ret); virConnectDomainEventDeregisterAny(dconn, callback7ret); virConnectDomainEventDeregisterAny(dconn, callback9ret); + virConnectDomainEventDeregisterAny(dconn, callback10ret); if (callback8ret != -1) virConnectDomainEventDeregisterAny(dconn, callback8ret); } diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py index 0c75091..f2f5597 100644 --- a/examples/domain-events/events-python/event-test.py +++ b/examples/domain-events/events-python/event-test.py @@ -474,6 +474,9 @@ def myDomainEventGraphicsCallback(conn, dom, phase, localAddr, remoteAddr, authS def myDomainEventDiskChangeCallback(conn, dom, oldSrcPath, newSrcPath, devAlias, reason, opaque): print "myDomainEventDiskChangeCallback: Domain %s(%s) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s" % ( dom.name(), dom.ID(), oldSrcPath, newSrcPath, devAlias, reason) +def myDomainEventTrayMovedCallback(conn, dom, devAlias, trayOpened, opaque): + print "myDomainEventTrayMovedCallback: Domain %s(%s) tray moved devAlias: %s trayOpened: %d" % ( + dom.name(), dom.ID(), devAlias, trayOpened) def usage(out=sys.stderr): print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]" print >>out, " uri will default to qemu:///system" @@ -532,6 +535,7 @@ def main(): vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None) + vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_MOVED, myDomainEventTrayMovedCallback, None) vc.setKeepAlive(5, 3) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 58c4366..730f2a3 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -3643,6 +3643,25 @@ typedef void (*virConnectDomainEventDiskChangeCallback)(virConnectPtr conn, const char *devAlias, int reason, void *opaque); +/** + * virConnectDomainEventTrayMovedCallback: + * @conn: connection object + * @dom: domain on which the event occurred + * @devAlias: device alias + * @trayOpened: the tray has been opened? + * @opaque: application specified data + * + * This callback occurs when the tray of a removable device is moved. + * + * The callback signature to use when registering for an event of type + * VIR_DOMAIN_EVENT_ID_TRAY_MOVED with virConnectDomainEventRegisterAny() + */ +typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque); + /** * VIR_DOMAIN_EVENT_CALLBACK: @@ -3664,6 +3683,7 @@ typedef enum { VIR_DOMAIN_EVENT_ID_CONTROL_ERROR = 7, /* virConnectDomainEventGenericCallback */ VIR_DOMAIN_EVENT_ID_BLOCK_JOB = 8, /* virConnectDomainEventBlockJobCallback */ VIR_DOMAIN_EVENT_ID_DISK_CHANGE = 9, /* virConnectDomainEventDiskChangeCallback */ + VIR_DOMAIN_EVENT_ID_TRAY_MOVED = 10, /* virConnectDomainEventTrayMovedCallback */ #ifdef VIR_ENUM_SENTINELS /* diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py index b908b32..e93efa7 100644 --- a/python/libvirt-override-virConnect.py +++ b/python/libvirt-override-virConnect.py @@ -134,6 +134,16 @@ cb(self, virDomain(self, _obj=dom), oldSrcPath, newSrcPath, devAlias, reason, opaque) return 0; + def _dispatchDomainEventTrayMovedCallback(self, dom, devAlias, trayOpened, cbData): + """Dispatches event to python user domain trayMoved event callbacks + """ + cb = cbData["cb"] + opaque = cbData["opaque"] + + cb(self, virDomain(self, _obj=dom), devAlias, trayOpened, opaque) + return 0; + + def domainEventDeregisterAny(self, callbackID): """Removes a Domain Event Callback. De-registering for a domain callback will disable delivery of this event type """ diff --git a/python/libvirt-override.c b/python/libvirt-override.c index 792cfa3..976c5d8 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -4927,6 +4927,53 @@ libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNU return ret; } +static int +libvirt_virConnectDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque) +{ + PyObject *pyobj_cbData = (PyObject*)opaque; + PyObject *pyobj_dom; + PyObject *pyobj_ret; + PyObject *pyobj_conn; + PyObject *dictKey; + int ret = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + /* Create a python instance of this virDomainPtr */ + virDomainRef(dom); + + pyobj_dom = libvirt_virDomainPtrWrap(dom); + Py_INCREF(pyobj_cbData); + + dictKey = libvirt_constcharPtrWrap("conn"); + pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey); + Py_DECREF(dictKey); + + /* Call the Callback Dispatcher */ + pyobj_ret = PyObject_CallMethod(pyobj_conn, + (char*)"_dispatchDomainEventTrayMovedCallback", + (char*)"OsiO", + pyobj_dom, + devAlias, trayOpened, pyobj_cbData); + + Py_DECREF(pyobj_cbData); + Py_DECREF(pyobj_dom); + + if(!pyobj_ret) { + DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret); + PyErr_Print(); + } else { + Py_DECREF(pyobj_ret); + ret = 0; + } + + LIBVIRT_RELEASE_THREAD_STATE; + return ret; +} + static PyObject * libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) @@ -4987,6 +5034,9 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, case VIR_DOMAIN_EVENT_ID_DISK_CHANGE: cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDiskChangeCallback); break; + case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventTrayMovedCallback); + break; } if (!cb) { diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 1d8b45d..dbd1bf1 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -117,6 +117,10 @@ struct _virDomainEvent { char *devAlias; int reason; } diskChange; + struct { + char *devAlias; + unsigned int trayOpened :1; + } trayMoved; } data; }; @@ -546,6 +550,9 @@ void virDomainEventFree(virDomainEventPtr event) VIR_FREE(event->data.diskChange.newSrcPath); VIR_FREE(event->data.diskChange.devAlias); break; + case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + VIR_FREE(event->data.trayMoved.devAlias); + break; } VIR_FREE(event->dom.name); @@ -1043,6 +1050,50 @@ virDomainEventPtr virDomainEventDiskChangeNewFromDom(virDomainPtr dom, devAlias, reason); } +static virDomainEventPtr +virDomainEventTrayMovedNew(int id, const char *name, + unsigned char *uuid, + const char *devAlias, + unsigned int trayOpened) +{ + virDomainEventPtr ev = + virDomainEventNewInternal(VIR_DOMAIN_EVENT_ID_TRAY_MOVED, + id, name, uuid); + + if (ev) { + if (!(ev->data.trayMoved.devAlias = strdup(devAlias))) + goto error; + + ev->data.trayMoved.trayOpened = trayOpened; + } + + return ev; + +error: + virReportOOMError(); + virDomainEventFree(ev); + return NULL; +} + +virDomainEventPtr virDomainEventTrayMovedNewFromObj(virDomainObjPtr obj, + const char *devAlias, + unsigned int trayOpened) +{ + return virDomainEventTrayMovedNew(obj->def->id, + obj->def->name, + obj->def->uuid, + devAlias, + trayOpened); +} + +virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened) +{ + return virDomainEventTrayMovedNew(dom->id, dom->name, dom->uuid, + devAlias, trayOpened); +} + /** * virDomainEventQueuePush: @@ -1167,6 +1218,13 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, cbopaque); break; + case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + ((virConnectDomainEventTrayMovedCallback)cb)(conn, dom, + event->data.trayMoved.devAlias, + event->data.trayMoved.trayOpened, + cbopaque); + break; + default: VIR_WARN("Unexpected event ID %d", event->eventID); break; diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 0e7cd75..3351be0 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -114,6 +114,12 @@ virDomainEventPtr virDomainEventDiskChangeNewFromDom(virDomainPtr dom, const char *newSrcPath, const char *devAlias, int reason); +virDomainEventPtr virDomainEventTrayMovedNewFromObj(virDomainObjPtr obj, + const char *devAlias, + unsigned int trayOpened); +virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened); void virDomainEventFree(virDomainEventPtr event); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a104e70..27d4ad3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -512,6 +512,8 @@ virDomainEventStateRegisterID; virDomainEventStateFree; virDomainEventStateNew; virDomainEventStateQueue; +virDomainEventTrayMovedNewFromDom; +virDomainEventTrayMovedNewFromObj; virDomainEventWatchdogNewFromDom; virDomainEventWatchdogNewFromObj; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1da73f6..dfa2960 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1040,6 +1040,19 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, return ret; } +int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, + const char *devAlias, + unsigned int trayOpened) +{ + int ret = -1; + VIR_DEBUG("mon=%p", mon); + + QEMU_MONITOR_CALLBACK(mon, ret, domainTrayMoved, mon->vm, + devAlias, trayOpened); + + return ret; +} + int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index b1c956c..18e6801 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -124,6 +124,10 @@ struct _qemuMonitorCallbacks { const char *diskAlias, int type, int status); + int (*domainTrayMoved)(qemuMonitorPtr mon, + virDomainObjPtr vm, + const char *devAlias, + unsigned int trayOpened); }; @@ -191,6 +195,9 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, const char *authScheme, const char *x509dname, const char *saslUsername); +int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, + const char *devAlias, + unsigned int trayOpened); int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c0f148b..ac6b02c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -59,6 +59,7 @@ static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data); static struct { const char *type; @@ -75,6 +76,7 @@ static struct { { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, }, + { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayMoved, }, }; @@ -725,6 +727,22 @@ out: qemuMonitorEmitBlockJob(mon, device, type, status); } +static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data) +{ + const char *devAlias = NULL; + bool trayOpened; + + if ((devAlias = virJSONValueObjectGetString(data, "device")) == NULL) { + VIR_WARN("missing device in tray moved event"); + return; + } + + if (virJSONValueObjectGetBoolean(data, "tray-open", &trayOpened) < 0) { + VIR_WARN("missing tray-open in tray moved event"); + return; + } + qemuMonitorEmitTrayMoved(mon, devAlias, (unsigned int)trayOpened); +} int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 7b99814..387811a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1021,6 +1021,37 @@ static void qemuProcessHandleMonitorDestroy(qemuMonitorPtr mon, virDomainObjUnlock(vm); } +static int +qemuProcessHandleTrayMoved(qemuMonitorPtr mon ATTRIBUTE_UNUSED, + virDomainObjPtr vm, + const char *devAlias, + unsigned int trayOpened) +{ + struct qemud_driver *driver = qemu_driver; + virDomainEventPtr event = NULL; + virDomainDiskDefPtr disk; + + virDomainObjLock(vm); + disk = qemuProcessFindDomainDiskByAlias(vm, devAlias); + + if (disk) { + event = virDomainEventTrayMovedNewFromObj(vm, + devAlias, + trayOpened); + } + + virDomainObjUnlock(vm); + + if (event) { + qemuDriverLock(driver); + qemuDomainEventQueue(driver, event); + qemuDriverUnlock(driver); + } + + return 0; +} + + static qemuMonitorCallbacks monitorCallbacks = { .destroy = qemuProcessHandleMonitorDestroy, .eofNotify = qemuProcessHandleMonitorEOF, @@ -1034,6 +1065,7 @@ static qemuMonitorCallbacks monitorCallbacks = { .domainIOError = qemuProcessHandleIOError, .domainGraphics = qemuProcessHandleGraphics, .domainBlockJob = qemuProcessHandleBlockJob, + .domainTrayMoved = qemuProcessHandleTrayMoved, }; static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 9e74cea..31d09a9 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -238,6 +238,11 @@ remoteDomainBuildEventDiskChange(virNetClientProgramPtr prog, virNetClientPtr client, void *evdata, void *opaque); +static void +remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog, + virNetClientPtr client, + void *evdata, void *opaque); + static virNetClientProgramEvent remoteDomainEvents[] = { { REMOTE_PROC_DOMAIN_EVENT_RTC_CHANGE, remoteDomainBuildEventRTCChange, @@ -279,6 +284,10 @@ static virNetClientProgramEvent remoteDomainEvents[] = { remoteDomainBuildEventDiskChange, sizeof(remote_domain_event_disk_change_msg), (xdrproc_t)xdr_remote_domain_event_disk_change_msg }, + { REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED, + remoteDomainBuildEventTrayMoved, + sizeof(remote_domain_event_tray_moved_msg), + (xdrproc_t)xdr_remote_domain_event_tray_moved_msg }, }; enum virDrvOpenRemoteFlags { @@ -3643,6 +3652,31 @@ remoteDomainBuildEventDiskChange(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, } +static void +remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, + virNetClientPtr client ATTRIBUTE_UNUSED, + void *evdata, void *opaque) +{ + virConnectPtr conn = opaque; + struct private_data *priv = conn->privateData; + remote_domain_event_tray_moved_msg *msg = evdata; + virDomainPtr dom; + virDomainEventPtr event = NULL; + + dom = get_nonnull_domain(conn, msg->dom); + if (!dom) + return; + + event = virDomainEventTrayMovedNewFromDom(dom, + msg->devAlias, + msg->trayOpened); + + virDomainFree(dom); + + remoteDomainEventQueue(priv, event); +} + + static virDrvOpenStatus ATTRIBUTE_NONNULL (1) remoteSecretOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags) diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 4d845e7..73e554c 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2178,6 +2178,12 @@ struct remote_domain_event_disk_change_msg { int reason; }; +struct remote_domain_event_tray_moved_msg { + remote_nonnull_domain dom; + remote_nonnull_string devAlias; + unsigned int trayOpened; +}; + struct remote_domain_managed_save_args { remote_nonnull_domain dom; unsigned int flags; @@ -2765,7 +2771,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_METADATA = 264, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_METADATA = 265, /* autogen autogen */ REMOTE_PROC_DOMAIN_BLOCK_REBASE = 266, /* autogen autogen */ - REMOTE_PROC_DOMAIN_PM_WAKEUP = 267 /* autogen autogen */ + REMOTE_PROC_DOMAIN_PM_WAKEUP = 267, /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED = 268 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 8f882b7..aad8654 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1650,6 +1650,11 @@ struct remote_domain_event_disk_change_msg { remote_nonnull_string devAlias; int reason; }; +struct remote_domain_event_tray_moved_msg { + remote_nonnull_domain dom; + remote_nonnull_string devAlias; + U_int trayOpened; +} struct remote_domain_managed_save_args { remote_nonnull_domain dom; u_int flags; -- 1.7.1

On Mon, Mar 05, 2012 at 06:25:39PM +0800, Osier Yang wrote:
This patch introduces a new event type for the QMP event DEVICE_TRAY_MOVED, which occurs when the tray of a removable disk is moved (i.e opened or closed):
VIR_DOMAIN_EVENT_ID_TRAY_MOVED
The event's data includes the device alias and the tray's status, which indicates whether the tray has been opened or closed. Thus the callback definition for the event is:
typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, unsigned int trayOpened, void *opaque);
Hum ... could we make that slightly more generic. Instead of just being able to report on tray opened or not (i.e. closed) Let's report TrayChangeCallback, and have an 'int reason' instead. Then for example the API would be able to cope with more set of events, one of the thing I can think of now would be the ability to emulate multiple device in one as disk changers, and also possibly be able to provide invormations about the kind of media, i.e. switch from a CD-ROM to a DVD-WR in the tray.
--- daemon/remote.c | 33 +++++++++++ examples/domain-events/events-c/event-test.c | 21 +++++++- examples/domain-events/events-python/event-test.py | 4 ++ include/libvirt/libvirt.h.in | 20 +++++++ python/libvirt-override-virConnect.py | 10 ++++ python/libvirt-override.c | 50 +++++++++++++++++ src/conf/domain_event.c | 58 ++++++++++++++++++++ src/conf/domain_event.h | 6 ++ src/libvirt_private.syms | 2 + src/qemu/qemu_monitor.c | 13 +++++ src/qemu/qemu_monitor.h | 7 +++ src/qemu/qemu_monitor_json.c | 18 ++++++ src/qemu/qemu_process.c | 32 +++++++++++ src/remote/remote_driver.c | 34 ++++++++++++ src/remote/remote_protocol.x | 9 +++- src/remote_protocol-structs | 5 ++ 16 files changed, 320 insertions(+), 2 deletions(-)
diff --git a/daemon/remote.c b/daemon/remote.c index 74a5f16..cc464fd 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -505,6 +505,38 @@ mem_error: }
+static int remoteRelayDomainEventTrayMoved(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque) { + virNetServerClientPtr client = opaque; + remote_domain_event_tray_moved_msg data; + + if (!client) + return -1; + + VIR_DEBUG("Relaying domain %s %d tray moved devAlias: %s trayOpened: %s", + dom->name, dom->id, devAlias, trayOpened ? "yes": "no"); + + /* build return data */ + memset(&data, 0, sizeof data); + + if (!(data.devAlias = strdup(devAlias))) { + virReportOOMError(); + return -1; + } + data.trayOpened = trayOpened; + + make_nonnull_domain(&data.dom, dom); + + remoteDispatchDomainEventSend(client, remoteProgram, + REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED, + (xdrproc_t)xdr_remote_domain_event_tray_moved_msg, &data); + + return 0; +} + static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventLifecycle), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventReboot), @@ -516,6 +548,7 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventControlError), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventBlockJob), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventDiskChange), + VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventTrayMoved), };
verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index f4938c4..c7bcaeb 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -313,6 +313,17 @@ static int myDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; }
+static int myDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) removable disk's tray moved devAlias: %s trayOpened: %s\n", + __func__, virDomainGetName(dom), virDomainGetID(dom), + devAlias, trayOpened ? "yes" : "no"); + return 0; +}
static void myFreeFunc(void *opaque) { @@ -349,6 +360,7 @@ int main(int argc, char **argv) int callback7ret = -1; int callback8ret = -1; int callback9ret = -1; + int callback10ret = -1; struct sigaction action_stop;
memset(&action_stop, 0, sizeof action_stop); @@ -419,6 +431,11 @@ int main(int argc, char **argv) VIR_DOMAIN_EVENT_ID_DISK_CHANGE, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventDiskChangeCallback), strdup("disk change"), myFreeFunc); + callback10ret = virConnectDomainEventRegisterAny(dconn, + NULL, + VIR_DOMAIN_EVENT_ID_TRAY_MOVED, + VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayMovedCallback), + strdup("tray moved"), myFreeFunc);
if ((callback1ret != -1) && (callback2ret != -1) && @@ -427,7 +444,8 @@ int main(int argc, char **argv) (callback5ret != -1) && (callback6ret != -1) && (callback7ret != -1) && - (callback9ret != -1)) { + (callback9ret != -1) && + (callback10ret != -1)) { if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { virErrorPtr err = virGetLastError(); fprintf(stderr, "Failed to start keepalive protocol: %s\n", @@ -452,6 +470,7 @@ int main(int argc, char **argv) virConnectDomainEventDeregisterAny(dconn, callback6ret); virConnectDomainEventDeregisterAny(dconn, callback7ret); virConnectDomainEventDeregisterAny(dconn, callback9ret); + virConnectDomainEventDeregisterAny(dconn, callback10ret); if (callback8ret != -1) virConnectDomainEventDeregisterAny(dconn, callback8ret); } diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py index 0c75091..f2f5597 100644 --- a/examples/domain-events/events-python/event-test.py +++ b/examples/domain-events/events-python/event-test.py @@ -474,6 +474,9 @@ def myDomainEventGraphicsCallback(conn, dom, phase, localAddr, remoteAddr, authS def myDomainEventDiskChangeCallback(conn, dom, oldSrcPath, newSrcPath, devAlias, reason, opaque): print "myDomainEventDiskChangeCallback: Domain %s(%s) disk change oldSrcPath: %s newSrcPath: %s devAlias: %s reason: %s" % ( dom.name(), dom.ID(), oldSrcPath, newSrcPath, devAlias, reason) +def myDomainEventTrayMovedCallback(conn, dom, devAlias, trayOpened, opaque): + print "myDomainEventTrayMovedCallback: Domain %s(%s) tray moved devAlias: %s trayOpened: %d" % ( + dom.name(), dom.ID(), devAlias, trayOpened) def usage(out=sys.stderr): print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]" print >>out, " uri will default to qemu:///system" @@ -532,6 +535,7 @@ def main(): vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WATCHDOG, myDomainEventWatchdogCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None) + vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_MOVED, myDomainEventTrayMovedCallback, None)
vc.setKeepAlive(5, 3)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 58c4366..730f2a3 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -3643,6 +3643,25 @@ typedef void (*virConnectDomainEventDiskChangeCallback)(virConnectPtr conn, const char *devAlias, int reason, void *opaque); +/** + * virConnectDomainEventTrayMovedCallback: + * @conn: connection object + * @dom: domain on which the event occurred + * @devAlias: device alias + * @trayOpened: the tray has been opened? + * @opaque: application specified data + * + * This callback occurs when the tray of a removable device is moved. + * + * The callback signature to use when registering for an event of type + * VIR_DOMAIN_EVENT_ID_TRAY_MOVED with virConnectDomainEventRegisterAny() + */ +typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque); +
/** * VIR_DOMAIN_EVENT_CALLBACK: @@ -3664,6 +3683,7 @@ typedef enum { VIR_DOMAIN_EVENT_ID_CONTROL_ERROR = 7, /* virConnectDomainEventGenericCallback */ VIR_DOMAIN_EVENT_ID_BLOCK_JOB = 8, /* virConnectDomainEventBlockJobCallback */ VIR_DOMAIN_EVENT_ID_DISK_CHANGE = 9, /* virConnectDomainEventDiskChangeCallback */ + VIR_DOMAIN_EVENT_ID_TRAY_MOVED = 10, /* virConnectDomainEventTrayMovedCallback */
#ifdef VIR_ENUM_SENTINELS /* diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py index b908b32..e93efa7 100644 --- a/python/libvirt-override-virConnect.py +++ b/python/libvirt-override-virConnect.py @@ -134,6 +134,16 @@ cb(self, virDomain(self, _obj=dom), oldSrcPath, newSrcPath, devAlias, reason, opaque) return 0;
+ def _dispatchDomainEventTrayMovedCallback(self, dom, devAlias, trayOpened, cbData): + """Dispatches event to python user domain trayMoved event callbacks + """ + cb = cbData["cb"] + opaque = cbData["opaque"] + + cb(self, virDomain(self, _obj=dom), devAlias, trayOpened, opaque) + return 0; + + def domainEventDeregisterAny(self, callbackID): """Removes a Domain Event Callback. De-registering for a domain callback will disable delivery of this event type """ diff --git a/python/libvirt-override.c b/python/libvirt-override.c index 792cfa3..976c5d8 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -4927,6 +4927,53 @@ libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNU return ret; }
+static int +libvirt_virConnectDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened, + void *opaque) +{ + PyObject *pyobj_cbData = (PyObject*)opaque; + PyObject *pyobj_dom; + PyObject *pyobj_ret; + PyObject *pyobj_conn; + PyObject *dictKey; + int ret = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + /* Create a python instance of this virDomainPtr */ + virDomainRef(dom); + + pyobj_dom = libvirt_virDomainPtrWrap(dom); + Py_INCREF(pyobj_cbData); + + dictKey = libvirt_constcharPtrWrap("conn"); + pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey); + Py_DECREF(dictKey); + + /* Call the Callback Dispatcher */ + pyobj_ret = PyObject_CallMethod(pyobj_conn, + (char*)"_dispatchDomainEventTrayMovedCallback", + (char*)"OsiO", + pyobj_dom, + devAlias, trayOpened, pyobj_cbData); + + Py_DECREF(pyobj_cbData); + Py_DECREF(pyobj_dom); + + if(!pyobj_ret) { + DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret); + PyErr_Print(); + } else { + Py_DECREF(pyobj_ret); + ret = 0; + } + + LIBVIRT_RELEASE_THREAD_STATE; + return ret; +} + static PyObject * libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) @@ -4987,6 +5034,9 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, case VIR_DOMAIN_EVENT_ID_DISK_CHANGE: cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDiskChangeCallback); break; + case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventTrayMovedCallback); + break; }
if (!cb) { diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 1d8b45d..dbd1bf1 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -117,6 +117,10 @@ struct _virDomainEvent { char *devAlias; int reason; } diskChange; + struct { + char *devAlias; + unsigned int trayOpened :1; + } trayMoved; } data; };
@@ -546,6 +550,9 @@ void virDomainEventFree(virDomainEventPtr event) VIR_FREE(event->data.diskChange.newSrcPath); VIR_FREE(event->data.diskChange.devAlias); break; + case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + VIR_FREE(event->data.trayMoved.devAlias); + break; }
VIR_FREE(event->dom.name); @@ -1043,6 +1050,50 @@ virDomainEventPtr virDomainEventDiskChangeNewFromDom(virDomainPtr dom, devAlias, reason); }
+static virDomainEventPtr +virDomainEventTrayMovedNew(int id, const char *name, + unsigned char *uuid, + const char *devAlias, + unsigned int trayOpened) +{ + virDomainEventPtr ev = + virDomainEventNewInternal(VIR_DOMAIN_EVENT_ID_TRAY_MOVED, + id, name, uuid); + + if (ev) { + if (!(ev->data.trayMoved.devAlias = strdup(devAlias))) + goto error; + + ev->data.trayMoved.trayOpened = trayOpened; + } + + return ev; + +error: + virReportOOMError(); + virDomainEventFree(ev); + return NULL; +} + +virDomainEventPtr virDomainEventTrayMovedNewFromObj(virDomainObjPtr obj, + const char *devAlias, + unsigned int trayOpened) +{ + return virDomainEventTrayMovedNew(obj->def->id, + obj->def->name, + obj->def->uuid, + devAlias, + trayOpened); +} + +virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened) +{ + return virDomainEventTrayMovedNew(dom->id, dom->name, dom->uuid, + devAlias, trayOpened); +} +
/** * virDomainEventQueuePush: @@ -1167,6 +1218,13 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, cbopaque); break;
+ case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: + ((virConnectDomainEventTrayMovedCallback)cb)(conn, dom, + event->data.trayMoved.devAlias, + event->data.trayMoved.trayOpened, + cbopaque); + break; + default: VIR_WARN("Unexpected event ID %d", event->eventID); break; diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 0e7cd75..3351be0 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -114,6 +114,12 @@ virDomainEventPtr virDomainEventDiskChangeNewFromDom(virDomainPtr dom, const char *newSrcPath, const char *devAlias, int reason); +virDomainEventPtr virDomainEventTrayMovedNewFromObj(virDomainObjPtr obj, + const char *devAlias, + unsigned int trayOpened); +virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, + const char *devAlias, + unsigned int trayOpened);
void virDomainEventFree(virDomainEventPtr event);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a104e70..27d4ad3 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -512,6 +512,8 @@ virDomainEventStateRegisterID; virDomainEventStateFree; virDomainEventStateNew; virDomainEventStateQueue; +virDomainEventTrayMovedNewFromDom; +virDomainEventTrayMovedNewFromObj; virDomainEventWatchdogNewFromDom; virDomainEventWatchdogNewFromObj;
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1da73f6..dfa2960 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1040,6 +1040,19 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, return ret; }
+int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, + const char *devAlias, + unsigned int trayOpened) +{ + int ret = -1; + VIR_DEBUG("mon=%p", mon); + + QEMU_MONITOR_CALLBACK(mon, ret, domainTrayMoved, mon->vm, + devAlias, trayOpened); + + return ret; +} + int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index b1c956c..18e6801 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -124,6 +124,10 @@ struct _qemuMonitorCallbacks { const char *diskAlias, int type, int status); + int (*domainTrayMoved)(qemuMonitorPtr mon, + virDomainObjPtr vm, + const char *devAlias, + unsigned int trayOpened); };
@@ -191,6 +195,9 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, const char *authScheme, const char *x509dname, const char *saslUsername); +int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, + const char *devAlias, + unsigned int trayOpened); int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index c0f148b..ac6b02c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -59,6 +59,7 @@ static void qemuMonitorJSONHandleVNCConnect(qemuMonitorPtr mon, virJSONValuePtr static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data);
static struct { const char *type; @@ -75,6 +76,7 @@ static struct { { "VNC_INITIALIZED", qemuMonitorJSONHandleVNCInitialize, }, { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, }, + { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayMoved, }, };
@@ -725,6 +727,22 @@ out: qemuMonitorEmitBlockJob(mon, device, type, status); }
+static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data) +{ + const char *devAlias = NULL; + bool trayOpened; + + if ((devAlias = virJSONValueObjectGetString(data, "device")) == NULL) { + VIR_WARN("missing device in tray moved event"); + return; + } + + if (virJSONValueObjectGetBoolean(data, "tray-open", &trayOpened) < 0) { + VIR_WARN("missing tray-open in tray moved event"); + return; + } + qemuMonitorEmitTrayMoved(mon, devAlias, (unsigned int)trayOpened); +}
int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 7b99814..387811a 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1021,6 +1021,37 @@ static void qemuProcessHandleMonitorDestroy(qemuMonitorPtr mon, virDomainObjUnlock(vm); }
+static int +qemuProcessHandleTrayMoved(qemuMonitorPtr mon ATTRIBUTE_UNUSED, + virDomainObjPtr vm, + const char *devAlias, + unsigned int trayOpened) +{ + struct qemud_driver *driver = qemu_driver; + virDomainEventPtr event = NULL; + virDomainDiskDefPtr disk; + + virDomainObjLock(vm); + disk = qemuProcessFindDomainDiskByAlias(vm, devAlias); + + if (disk) { + event = virDomainEventTrayMovedNewFromObj(vm, + devAlias, + trayOpened); + } + + virDomainObjUnlock(vm); + + if (event) { + qemuDriverLock(driver); + qemuDomainEventQueue(driver, event); + qemuDriverUnlock(driver); + } + + return 0; +} + + static qemuMonitorCallbacks monitorCallbacks = { .destroy = qemuProcessHandleMonitorDestroy, .eofNotify = qemuProcessHandleMonitorEOF, @@ -1034,6 +1065,7 @@ static qemuMonitorCallbacks monitorCallbacks = { .domainIOError = qemuProcessHandleIOError, .domainGraphics = qemuProcessHandleGraphics, .domainBlockJob = qemuProcessHandleBlockJob, + .domainTrayMoved = qemuProcessHandleTrayMoved, };
static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 9e74cea..31d09a9 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -238,6 +238,11 @@ remoteDomainBuildEventDiskChange(virNetClientProgramPtr prog, virNetClientPtr client, void *evdata, void *opaque);
+static void +remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog, + virNetClientPtr client, + void *evdata, void *opaque); + static virNetClientProgramEvent remoteDomainEvents[] = { { REMOTE_PROC_DOMAIN_EVENT_RTC_CHANGE, remoteDomainBuildEventRTCChange, @@ -279,6 +284,10 @@ static virNetClientProgramEvent remoteDomainEvents[] = { remoteDomainBuildEventDiskChange, sizeof(remote_domain_event_disk_change_msg), (xdrproc_t)xdr_remote_domain_event_disk_change_msg }, + { REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED, + remoteDomainBuildEventTrayMoved, + sizeof(remote_domain_event_tray_moved_msg), + (xdrproc_t)xdr_remote_domain_event_tray_moved_msg }, };
enum virDrvOpenRemoteFlags { @@ -3643,6 +3652,31 @@ remoteDomainBuildEventDiskChange(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, }
+static void +remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, + virNetClientPtr client ATTRIBUTE_UNUSED, + void *evdata, void *opaque) +{ + virConnectPtr conn = opaque; + struct private_data *priv = conn->privateData; + remote_domain_event_tray_moved_msg *msg = evdata; + virDomainPtr dom; + virDomainEventPtr event = NULL; + + dom = get_nonnull_domain(conn, msg->dom); + if (!dom) + return; + + event = virDomainEventTrayMovedNewFromDom(dom, + msg->devAlias, + msg->trayOpened); + + virDomainFree(dom); + + remoteDomainEventQueue(priv, event); +} + + static virDrvOpenStatus ATTRIBUTE_NONNULL (1) remoteSecretOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags) diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 4d845e7..73e554c 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2178,6 +2178,12 @@ struct remote_domain_event_disk_change_msg { int reason; };
+struct remote_domain_event_tray_moved_msg { + remote_nonnull_domain dom; + remote_nonnull_string devAlias; + unsigned int trayOpened; +}; + struct remote_domain_managed_save_args { remote_nonnull_domain dom; unsigned int flags; @@ -2765,7 +2771,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_SET_METADATA = 264, /* autogen autogen */ REMOTE_PROC_DOMAIN_GET_METADATA = 265, /* autogen autogen */ REMOTE_PROC_DOMAIN_BLOCK_REBASE = 266, /* autogen autogen */ - REMOTE_PROC_DOMAIN_PM_WAKEUP = 267 /* autogen autogen */ + REMOTE_PROC_DOMAIN_PM_WAKEUP = 267, /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED = 268 /* autogen autogen */
And I would name the event "TRAY_CHANGED" Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On 2012年03月09日 16:55, Daniel Veillard wrote:
On Mon, Mar 05, 2012 at 06:25:39PM +0800, Osier Yang wrote:
This patch introduces a new event type for the QMP event DEVICE_TRAY_MOVED, which occurs when the tray of a removable disk is moved (i.e opened or closed):
VIR_DOMAIN_EVENT_ID_TRAY_MOVED
The event's data includes the device alias and the tray's status, which indicates whether the tray has been opened or closed. Thus the callback definition for the event is:
typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, unsigned int trayOpened, void *opaque);
Hum ... could we make that slightly more generic. Instead of just being able to report on tray opened or not (i.e. closed) Let's report TrayChangeCallback, and have an 'int reason' instead.
Hmm, yes, 'int reason' is good idea. But for the name, TrayMoved might describe the real action more precisely. Unlike DiskChange, it says there was some medium was changed, TrayMoved only intends to report the tray status changeing event, nothing really changed, or we can rename it to TrayStatusChange to indicate the tray status is changed, but IMO it's not much difference except getting a longer name. :-)
Then for example the API would be able to cope with more set of events, one of the thing I can think of now would be the ability to emulate multiple device in one as disk changers,
What does "emulate multiple device" mean? is it "s/device/event/"? and also possibly be able to
provide invormations about the kind of media, i.e. switch from a CD-ROM to a DVD-WR in the tray.
IMHO we should seperate the events for "tray change" and "medium change", the info such as the kind of media should handled by DiskChange instead, How about defining the callback like: /** * virConnectDomainEventTrayMovedReason: * * The reason describing why the callback was called */ enum { VIR_DOMAIN_EVENT_TRAY_MOVED_OPEN = 0, VIR_DOMAIN_EVENT_TRAY_MOVED_CLOSE, /* Something else such as other driver only emits a * event for OPEN+CLOSE. */ #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_TRAY_MOVED_LAST #endif } virDomainEventTrayMovedReason; /** * virConnectDomainEventTrayMovedCallback: * @conn: connection object * @dom: domain on which the event occurred * @devAlias: device alias * @reason: reason why this callback was called, any of virDomainEventTrayMovedReason * @opaque: application specified data * * This callback occurs when the tray of a removable device is moved. * * The callback signature to use when registering for an event of type * VIR_DOMAIN_EVENT_ID_TRAY_MOVED wit virConnectDomainEventRegisterAny() */ typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, int reason, void *opaque); Thanks Osier

On Fri, Mar 09, 2012 at 06:49:20PM +0800, Osier Yang wrote:
On 2012年03月09日 16:55, Daniel Veillard wrote:
On Mon, Mar 05, 2012 at 06:25:39PM +0800, Osier Yang wrote:
This patch introduces a new event type for the QMP event DEVICE_TRAY_MOVED, which occurs when the tray of a removable disk is moved (i.e opened or closed):
VIR_DOMAIN_EVENT_ID_TRAY_MOVED
The event's data includes the device alias and the tray's status, which indicates whether the tray has been opened or closed. Thus the callback definition for the event is:
typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, unsigned int trayOpened, void *opaque);
Hum ... could we make that slightly more generic. Instead of just being able to report on tray opened or not (i.e. closed) Let's report TrayChangeCallback, and have an 'int reason' instead.
Hmm, yes, 'int reason' is good idea.
But for the name, TrayMoved might describe the real action more precisely. Unlike DiskChange, it says there was some medium was changed, TrayMoved only intends to report the tray status changeing event, nothing really changed, or we can rename it to TrayStatusChange to indicate the tray status is changed, but IMO it's not much difference except getting a longer name. :-)
Then for example the API would be able to cope with more set of events, one of the thing I can think of now would be the ability to emulate multiple device in one as disk changers,
What does "emulate multiple device" mean? is it "s/device/event/"?
Nahh, I was thinking of thinks like cdrom changers, where the enclosure can hold multiple disks and swap them. But in retrospect I dould we will have much need to emulate such hardware ever...
and also possibly be able to
provide invormations about the kind of media, i.e. switch from a CD-ROM to a DVD-WR in the tray.
IMHO we should seperate the events for "tray change" and "medium change", the info such as the kind of media should handled by DiskChange instead,
yes, reasonnable.
How about defining the callback like:
/** * virConnectDomainEventTrayMovedReason: * * The reason describing why the callback was called */ enum { VIR_DOMAIN_EVENT_TRAY_MOVED_OPEN = 0, VIR_DOMAIN_EVENT_TRAY_MOVED_CLOSE,
/* Something else such as other driver only emits a * event for OPEN+CLOSE. */
#ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_TRAY_MOVED_LAST #endif } virDomainEventTrayMovedReason;
/** * virConnectDomainEventTrayMovedCallback: * @conn: connection object * @dom: domain on which the event occurred * @devAlias: device alias * @reason: reason why this callback was called, any of virDomainEventTrayMovedReason * @opaque: application specified data * * This callback occurs when the tray of a removable device is moved. * * The callback signature to use when registering for an event of type * VIR_DOMAIN_EVENT_ID_TRAY_MOVED wit virConnectDomainEventRegisterAny() */ typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, int reason, void *opaque);
I think I would still feel a bit better with Changed rather than Moved which is more specific, but not a blocker. Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On 03/12/2012 04:31 PM, Daniel Veillard wrote:
On Fri, Mar 09, 2012 at 06:49:20PM +0800, Osier Yang wrote:
On 2012年03月09日 16:55, Daniel Veillard wrote:
On Mon, Mar 05, 2012 at 06:25:39PM +0800, Osier Yang wrote:
This patch introduces a new event type for the QMP event DEVICE_TRAY_MOVED, which occurs when the tray of a removable disk is moved (i.e opened or closed):
VIR_DOMAIN_EVENT_ID_TRAY_MOVED
The event's data includes the device alias and the tray's status, which indicates whether the tray has been opened or closed. Thus the callback definition for the event is:
typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, virDomainPtr dom, const char *devAlias, unsigned int trayOpened, void *opaque);
Hum ... could we make that slightly more generic. Instead of just being able to report on tray opened or not (i.e. closed) Let's report TrayChangeCallback, and have an 'int reason' instead.
Hmm, yes, 'int reason' is good idea.
But for the name, TrayMoved might describe the real action more precisely. Unlike DiskChange, it says there was some medium was changed, TrayMoved only intends to report the tray status changeing event, nothing really changed, or we can rename it to TrayStatusChange to indicate the tray status is changed, but IMO it's not much difference except getting a longer name. :-)
Then for example the API would be able to cope with more set of events, one of the thing I can think of now would be the ability to emulate multiple device in one as disk changers,
What does "emulate multiple device" mean? is it "s/device/event/"?
Nahh, I was thinking of thinks like cdrom changers, where the enclosure can hold multiple disks and swap them. But in retrospect I dould we will have much need to emulate such hardware ever...
I see, :-)

Example XML: <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/tmp/cdrom.img'/> <target dev='hdd' bus='ide' tray='open'/> </disk> --- docs/formatdomain.html.in | 13 +++++++++---- docs/schemas/domaincommon.rng | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index a61895f..158bafa 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1091,7 +1091,7 @@ </disk> <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='block' device='lun'> @@ -1202,10 +1202,15 @@ possible values are driver specific, with typical values being "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus type is inferred from the style of the device name. eg, a device named - 'sda' will typically be exported using a SCSI bus. + 'sda' will typically be exported using a SCSI bus. The optional + attribute <code>tray</code> indicates the tray status of the + removable disks (i.e. CDROM or Floppy disk), the value can be either + "open" or "closed", defaults to "closed". NB, the value of + <code>tray</code> could be updated while the domain is running. <span class="since">Since 0.0.3; <code>bus</code> attribute since 0.4.3; - "usb" attribute value since after 0.4.4; "sata" attribute value since - 0.9.7</span></dd> + <code>tray</code> attribute since 0.9.11; "usb" attribute value since + after 0.4.4; "sata" attribute value since 0.9.7</span> + </dd> <dt><code>iotune</code></dt> <dd>The optional <code>iotune</code> element provides the ability to provide additional per-device I/O tuning, with diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3908733..e1e1027 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -959,6 +959,14 @@ </choice> </attribute> </optional> + <optional> + <attribute name="tray"> + <choice> + <value>open</value> + <value>closed</value> + </choice> + </attribute> + </optional> </element> </define> <!-- -- 1.7.1

On Mon, Mar 05, 2012 at 06:25:40PM +0800, Osier Yang wrote:
Example XML:
<disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/tmp/cdrom.img'/> <target dev='hdd' bus='ide' tray='open'/> </disk> --- docs/formatdomain.html.in | 13 +++++++++---- docs/schemas/domaincommon.rng | 8 ++++++++ 2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index a61895f..158bafa 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1091,7 +1091,7 @@ </disk> <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='open'/> <readonly/> </disk> <disk type='block' device='lun'> @@ -1202,10 +1202,15 @@ possible values are driver specific, with typical values being "ide", "scsi", "virtio", "xen", "usb" or "sata". If omitted, the bus type is inferred from the style of the device name. eg, a device named - 'sda' will typically be exported using a SCSI bus. + 'sda' will typically be exported using a SCSI bus. The optional + attribute <code>tray</code> indicates the tray status of the + removable disks (i.e. CDROM or Floppy disk), the value can be either + "open" or "closed", defaults to "closed". NB, the value of + <code>tray</code> could be updated while the domain is running. <span class="since">Since 0.0.3; <code>bus</code> attribute since 0.4.3; - "usb" attribute value since after 0.4.4; "sata" attribute value since - 0.9.7</span></dd> + <code>tray</code> attribute since 0.9.11; "usb" attribute value since + after 0.4.4; "sata" attribute value since 0.9.7</span> + </dd> <dt><code>iotune</code></dt> <dd>The optional <code>iotune</code> element provides the ability to provide additional per-device I/O tuning, with diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 3908733..e1e1027 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -959,6 +959,14 @@ </choice> </attribute> </optional> + <optional> + <attribute name="tray"> + <choice> + <value>open</value> + <value>closed</value> + </choice> + </attribute> + </optional> </element> </define> <!--
Looks fine to me, ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

The "tray" is only allowed for removable disks, i.e. CDROM and Floppy disks. As the value for "tray" defaults to "closed", lots of tests are updated to include "tray='closed'" in the disk target XML. --- src/conf/domain_conf.c | 33 +++++++++++++++++++- src/conf/domain_conf.h | 9 +++++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 2 +- .../qemuxml2argv-boot-complex-bootindex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-complex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 +- ...uxml2argv-boot-menu-disable-drive-bootindex.xml | 2 +- .../qemuxml2argv-boot-menu-disable-drive.xml | 2 +- .../qemuxml2argv-boot-menu-disable.xml | 2 +- .../qemuxml2argv-boot-menu-enable.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 4 +- tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 2 +- .../qemuxml2argv-disk-cdrom-empty.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 +- .../qemuxml2argv-disk-copy_on_read.xml | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.xml | 2 +- .../qemuxml2argv-disk-drive-boot-disk.xml | 2 +- .../qemuxml2argv-disk-drive-cache-directsync.xml | 2 +- .../qemuxml2argv-disk-drive-cache-unsafe.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 2 +- ...muxml2argv-disk-drive-error-policy-enospace.xml | 2 +- .../qemuxml2argv-disk-drive-error-policy-stop.xml | 2 +- ...rgv-disk-drive-error-policy-wreport-rignore.xml | 2 +- .../qemuxml2argv-disk-drive-fmt-qcow.xml | 2 +- .../qemuxml2argv-disk-drive-no-boot.xml | 4 +- .../qemuxml2argv-disk-drive-readonly-disk.xml | 2 +- .../qemuxml2argv-disk-drive-readonly-no-device.xml | 2 +- .../qemuxml2argv-disk-drive-shared.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 4 +- .../qemuxml2argv-disk-ioeventfd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml | 2 +- .../qemuxml2argv-disk-snapshot.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +- .../qemuxml2argv-floppy-drive-fat.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 2 +- .../qemuxml2argv-net-bandwidth.xml | 2 +- .../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml | 8 ++-- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml | 4 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml | 2 +- 59 files changed, 109 insertions(+), 69 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f9654f1..f359f8f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -613,6 +613,10 @@ VIR_ENUM_IMPL(virDomainStartupPolicy, VIR_DOMAIN_STARTUP_POLICY_LAST, "requisite", "optional"); +VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST, + "closed", + "open"); + #define virDomainReportError(code, ...) \ virReportErrorHelper(VIR_FROM_DOMAIN, code, __FILE__, \ __FUNCTION__, __LINE__, __VA_ARGS__) @@ -2894,6 +2898,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *authUsage = NULL; char *authUUID = NULL; char *usageType = NULL; + char *tray = NULL; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -3002,6 +3007,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, (xmlStrEqual(cur->name, BAD_CAST "target"))) { target = virXMLPropString(cur, "dev"); bus = virXMLPropString(cur, "bus"); + tray = virXMLPropString(cur, "tray"); /* HACK: Work around for compat with Xen * driver in previous libvirt releases */ @@ -3271,6 +3277,25 @@ virDomainDiskDefParseXML(virCapsPtr caps, } } + if (tray) { + if ((def->tray_status = virDomainDiskTrayTypeFromString(tray)) < 0) { + virDomainReportError(VIR_ERR_XML_ERROR, + _("unknown disk tray status '%s'"), tray); + goto error; + } + + if (def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY && + def->device != VIR_DOMAIN_DISK_DEVICE_CDROM) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("tray is only valid for cdrom and floppy")); + goto error; + } + } else { + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + def->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; + } + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY && def->bus != VIR_DOMAIN_DISK_BUS_FDC) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -10228,8 +10253,14 @@ virDomainDiskDefFormat(virBufferPtr buf, } } - virBufferAsprintf(buf, " <target dev='%s' bus='%s'/>\n", + virBufferAsprintf(buf, " <target dev='%s' bus='%s'", def->dst, bus); + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + virBufferAsprintf(buf, " tray='%s'/>\n", + virDomainDiskTrayTypeToString(def->tray_status)); + else + virBufferAddLit(buf, "/>\n"); /*disk I/O throttling*/ if (def->blkdeviotune.total_bytes_sec || diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d98a551..6fa06c7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -306,6 +306,13 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_LAST }; +enum virDomainDiskTray { + VIR_DOMAIN_DISK_TRAY_CLOSED, + VIR_DOMAIN_DISK_TRAY_OPEN, + + VIR_DOMAIN_DISK_TRAY_LAST +}; + typedef struct _virDomainDiskHostDef virDomainDiskHostDef; typedef virDomainDiskHostDef *virDomainDiskHostDefPtr; struct _virDomainDiskHostDef { @@ -398,6 +405,7 @@ struct _virDomainDiskDef { char *src; virSecurityDeviceLabelDefPtr seclabel; char *dst; + int tray_status; int protocol; int nhosts; virDomainDiskHostDefPtr hosts; @@ -2016,6 +2024,7 @@ VIR_ENUM_DECL(virDomainDiskProtocol) VIR_ENUM_DECL(virDomainDiskIo) VIR_ENUM_DECL(virDomainDiskSecretType) VIR_ENUM_DECL(virDomainDiskSnapshot) +VIR_ENUM_DECL(virDomainDiskTray) VIR_ENUM_DECL(virDomainIoEventFd) VIR_ENUM_DECL(virDomainVirtioEventIdx) VIR_ENUM_DECL(virDomainDiskCopyOnRead) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 44a30de..9086528 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index f55ee2c..e1566c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml index 7847a99..2046881 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml index 85e6d91..07b7a85 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml @@ -20,7 +20,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml index 69ba3c0..e805064 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml @@ -20,7 +20,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <boot order='1'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> @@ -36,7 +36,7 @@ <disk type='file' device='floppy'> <driver name='qemu' type='raw'/> <source file='/dev/null'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <boot order='4'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml index be07426..811e801 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/xenner</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml index f1c9a42..9e6b816 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw' io='threads'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml index 8fdcb1d..85c163d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -20,7 +20,7 @@ <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml index ab09ed6..4378cf8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml index fb0bf2b..84df929 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index dda54f8..fbc0b09 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml index cff1a42..36e2166 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml index d32d569..6a58f68 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml index f2362af..fd77bac 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml index 078e2e7..d6facdb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml index 1e575ed..262be15 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml index ffa8aba..f58b352 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml index 4c33b5a..5045d70 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml index cad8257..c093f07 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml index 1af9a9f..16b77c5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml index e0182d6..bef1c7c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml index a1d55f9..77c4712 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml index b52d397..b09f01f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml index 599993c..28ed7cd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml index 2ce27a5..e6100ea 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml @@ -23,12 +23,12 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml index 674bbed..2b91830 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml @@ -25,7 +25,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml index 68e4f06..e2e85db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -21,12 +21,12 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml index 00edada..4e55804 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml index d89e57b..692290d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> </disk> <disk type='file' device='disk'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml index 0544c05..3aa201d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom' snapshot='no'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index 02d1fd3..a53899a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml index 9606a52..9d1ec22 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml index a8131b9..567f4d6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml @@ -25,7 +25,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml index 48bcdb7..29c4492 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml @@ -17,7 +17,7 @@ <disk type='dir' device='floppy'> <driver name='qemu' type='fat'/> <source dir='/var/somefiles'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml index 17fb06c..505801a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml index d42239c..d66af2f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml index 4b2e70c..ea698d0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml @@ -30,7 +30,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/home/zippy/tmp/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml index 16efb69..b2d6bfd 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml index 6cbdfe9..50712a6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml index 3bdb70b..de71ba6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml index 00fbf4e..dafd4fb 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='sda' bus='scsi'/> + <target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml index e8f2e9f..ca7ca1c 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> - <target dev='sda' bus='scsi'/> + <target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml index 2e07963..e98bb58 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml @@ -20,17 +20,17 @@ </disk> <disk type='file' device='cdrom'> <source file='[datastore] directory/Debian1-cdrom.iso'/> - <target dev='sdp' bus='scsi'/> + <target dev='sdp' bus='scsi' tray='closed'/> <address type='drive' controller='1' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <source file='/vmimages/tools-isoimages/linux.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='hdb' bus='ide'/> + <target dev='hdb' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='file' device='disk'> @@ -40,7 +40,7 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml index 0bc8eed..d35553f 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml @@ -19,12 +19,12 @@ </disk> <disk type='file' device='cdrom'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Isos/debian-testing-amd64-netinst.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Debian2/dummy.flp'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml index ee23120..98faa9b 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml @@ -26,7 +26,7 @@ </disk> <disk type='file' device='cdrom'> <source file='[4af0231d-1eff559a-6369-0024e84773b6] isos/CentOS-5.5-x86_64-bin-DVD-1of2.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml index 227308b..ec6a035 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='vmpvscsi'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-device.xml b/tests/vmx2xmldata/vmx2xml-floppy-device.xml index 8aef9c0..d6f3bab 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-device.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-file.xml b/tests/vmx2xmldata/vmx2xml-floppy-file.xml index c36e3f0..941118e 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-file.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='floppy'> <source file='[datastore] directory/floppy.flp'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml index 4c958ae..0081adf 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml index 0501a45..28753a2 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> -- 1.7.1

On Mon, Mar 05, 2012 at 06:25:41PM +0800, Osier Yang wrote:
The "tray" is only allowed for removable disks, i.e. CDROM and Floppy disks.
As the value for "tray" defaults to "closed", lots of tests are updated to include "tray='closed'" in the disk target XML.
I would take that as an indication that "tray='closed'" should just be omitted in output and assumed on input
src/conf/domain_conf.c | 33 +++++++++++++++++++- src/conf/domain_conf.h | 9 +++++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 2 +- .../qemuxml2argv-boot-complex-bootindex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-complex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 +- ...uxml2argv-boot-menu-disable-drive-bootindex.xml | 2 +- .../qemuxml2argv-boot-menu-disable-drive.xml | 2 +- .../qemuxml2argv-boot-menu-disable.xml | 2 +- .../qemuxml2argv-boot-menu-enable.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 4 +- tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 2 +- .../qemuxml2argv-disk-cdrom-empty.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 +- .../qemuxml2argv-disk-copy_on_read.xml | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.xml | 2 +- .../qemuxml2argv-disk-drive-boot-disk.xml | 2 +- .../qemuxml2argv-disk-drive-cache-directsync.xml | 2 +- .../qemuxml2argv-disk-drive-cache-unsafe.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 2 +- ...muxml2argv-disk-drive-error-policy-enospace.xml | 2 +- .../qemuxml2argv-disk-drive-error-policy-stop.xml | 2 +- ...rgv-disk-drive-error-policy-wreport-rignore.xml | 2 +- .../qemuxml2argv-disk-drive-fmt-qcow.xml | 2 +- .../qemuxml2argv-disk-drive-no-boot.xml | 4 +- .../qemuxml2argv-disk-drive-readonly-disk.xml | 2 +- .../qemuxml2argv-disk-drive-readonly-no-device.xml | 2 +- .../qemuxml2argv-disk-drive-shared.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 4 +- .../qemuxml2argv-disk-ioeventfd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml | 2 +- .../qemuxml2argv-disk-snapshot.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +- .../qemuxml2argv-floppy-drive-fat.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 2 +- .../qemuxml2argv-net-bandwidth.xml | 2 +- .../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml | 8 ++-- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml | 4 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml | 2 +- 59 files changed, 109 insertions(+), 69 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f9654f1..f359f8f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -613,6 +613,10 @@ VIR_ENUM_IMPL(virDomainStartupPolicy, VIR_DOMAIN_STARTUP_POLICY_LAST, "requisite", "optional");
+VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST, + "closed", + "open"); + #define virDomainReportError(code, ...) \ virReportErrorHelper(VIR_FROM_DOMAIN, code, __FILE__, \ __FUNCTION__, __LINE__, __VA_ARGS__) @@ -2894,6 +2898,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *authUsage = NULL; char *authUUID = NULL; char *usageType = NULL; + char *tray = NULL;
if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -3002,6 +3007,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, (xmlStrEqual(cur->name, BAD_CAST "target"))) { target = virXMLPropString(cur, "dev"); bus = virXMLPropString(cur, "bus"); + tray = virXMLPropString(cur, "tray");
/* HACK: Work around for compat with Xen * driver in previous libvirt releases */ @@ -3271,6 +3277,25 @@ virDomainDiskDefParseXML(virCapsPtr caps, } }
+ if (tray) { + if ((def->tray_status = virDomainDiskTrayTypeFromString(tray)) < 0) { + virDomainReportError(VIR_ERR_XML_ERROR, + _("unknown disk tray status '%s'"), tray); + goto error; + } + + if (def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY && + def->device != VIR_DOMAIN_DISK_DEVICE_CDROM) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("tray is only valid for cdrom and floppy")); + goto error; + } + } else { + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + def->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; + } + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY && def->bus != VIR_DOMAIN_DISK_BUS_FDC) { virDomainReportError(VIR_ERR_INTERNAL_ERROR,
I don't see tray being freed here, so that sounds like a leak
@@ -10228,8 +10253,14 @@ virDomainDiskDefFormat(virBufferPtr buf, } }
- virBufferAsprintf(buf, " <target dev='%s' bus='%s'/>\n", + virBufferAsprintf(buf, " <target dev='%s' bus='%s'", def->dst, bus); + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
I would make this conditional to if (def->tray_status != VIR_DOMAIN_DISK_TRAY_CLOSED) to avoid extra default data...
+ virBufferAsprintf(buf, " tray='%s'/>\n", + virDomainDiskTrayTypeToString(def->tray_status)); + else + virBufferAddLit(buf, "/>\n");
/*disk I/O throttling*/ if (def->blkdeviotune.total_bytes_sec || diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d98a551..6fa06c7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -306,6 +306,13 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_LAST };
+enum virDomainDiskTray { + VIR_DOMAIN_DISK_TRAY_CLOSED, + VIR_DOMAIN_DISK_TRAY_OPEN, + + VIR_DOMAIN_DISK_TRAY_LAST +}; + typedef struct _virDomainDiskHostDef virDomainDiskHostDef; typedef virDomainDiskHostDef *virDomainDiskHostDefPtr; struct _virDomainDiskHostDef { @@ -398,6 +405,7 @@ struct _virDomainDiskDef { char *src; virSecurityDeviceLabelDefPtr seclabel; char *dst; + int tray_status; int protocol; int nhosts; virDomainDiskHostDefPtr hosts; @@ -2016,6 +2024,7 @@ VIR_ENUM_DECL(virDomainDiskProtocol) VIR_ENUM_DECL(virDomainDiskIo) VIR_ENUM_DECL(virDomainDiskSecretType) VIR_ENUM_DECL(virDomainDiskSnapshot) +VIR_ENUM_DECL(virDomainDiskTray) VIR_ENUM_DECL(virDomainIoEventFd) VIR_ENUM_DECL(virDomainVirtioEventIdx) VIR_ENUM_DECL(virDomainDiskCopyOnRead) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 44a30de..9086528 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index f55ee2c..e1566c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml index 7847a99..2046881 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml index 85e6d91..07b7a85 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml @@ -20,7 +20,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml index 69ba3c0..e805064 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml @@ -20,7 +20,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <boot order='1'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> @@ -36,7 +36,7 @@ <disk type='file' device='floppy'> <driver name='qemu' type='raw'/> <source file='/dev/null'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <boot order='4'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml index be07426..811e801 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/xenner</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml index f1c9a42..9e6b816 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw' io='threads'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml index 8fdcb1d..85c163d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -20,7 +20,7 @@ <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml index ab09ed6..4378cf8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml index fb0bf2b..84df929 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index dda54f8..fbc0b09 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml index cff1a42..36e2166 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml index d32d569..6a58f68 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml index f2362af..fd77bac 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml index 078e2e7..d6facdb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml index 1e575ed..262be15 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml index ffa8aba..f58b352 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml index 4c33b5a..5045d70 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml index cad8257..c093f07 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml index 1af9a9f..16b77c5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml index e0182d6..bef1c7c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml index a1d55f9..77c4712 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml index b52d397..b09f01f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml index 599993c..28ed7cd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml index 2ce27a5..e6100ea 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml @@ -23,12 +23,12 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml index 674bbed..2b91830 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml @@ -25,7 +25,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml index 68e4f06..e2e85db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -21,12 +21,12 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml index 00edada..4e55804 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml index d89e57b..692290d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> </disk> <disk type='file' device='disk'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml index 0544c05..3aa201d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom' snapshot='no'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index 02d1fd3..a53899a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml index 9606a52..9d1ec22 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml index a8131b9..567f4d6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml @@ -25,7 +25,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml index 48bcdb7..29c4492 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml @@ -17,7 +17,7 @@ <disk type='dir' device='floppy'> <driver name='qemu' type='fat'/> <source dir='/var/somefiles'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml index 17fb06c..505801a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml index d42239c..d66af2f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml index 4b2e70c..ea698d0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml @@ -30,7 +30,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/home/zippy/tmp/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml index 16efb69..b2d6bfd 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml index 6cbdfe9..50712a6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml index 3bdb70b..de71ba6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml index 00fbf4e..dafd4fb 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='sda' bus='scsi'/> + <target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml index e8f2e9f..ca7ca1c 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> - <target dev='sda' bus='scsi'/> + <target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml index 2e07963..e98bb58 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml @@ -20,17 +20,17 @@ </disk> <disk type='file' device='cdrom'> <source file='[datastore] directory/Debian1-cdrom.iso'/> - <target dev='sdp' bus='scsi'/> + <target dev='sdp' bus='scsi' tray='closed'/> <address type='drive' controller='1' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <source file='/vmimages/tools-isoimages/linux.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> - <target dev='hdb' bus='ide'/> + <target dev='hdb' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='file' device='disk'> @@ -40,7 +40,7 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml index 0bc8eed..d35553f 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml @@ -19,12 +19,12 @@ </disk> <disk type='file' device='cdrom'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Isos/debian-testing-amd64-netinst.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Debian2/dummy.flp'/> - <target dev='fdb' bus='fdc'/> + <target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml index ee23120..98faa9b 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml @@ -26,7 +26,7 @@ </disk> <disk type='file' device='cdrom'> <source file='[4af0231d-1eff559a-6369-0024e84773b6] isos/CentOS-5.5-x86_64-bin-DVD-1of2.iso'/> - <target dev='hda' bus='ide'/> + <target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml index 227308b..ec6a035 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='vmpvscsi'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-device.xml b/tests/vmx2xmldata/vmx2xml-floppy-device.xml index 8aef9c0..d6f3bab 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-device.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-file.xml b/tests/vmx2xmldata/vmx2xml-floppy-file.xml index c36e3f0..941118e 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-file.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='floppy'> <source file='[datastore] directory/floppy.flp'/> - <target dev='fda' bus='fdc'/> + <target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml index 4c958ae..0081adf 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml index 0501a45..28753a2 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> - <target dev='hdc' bus='ide'/> + <target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/>
I'm not 100% sure what is the best approach but I would avoid putting tray='closed' systematically on output. Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On 2012年03月09日 19:01, Daniel Veillard wrote:
On Mon, Mar 05, 2012 at 06:25:41PM +0800, Osier Yang wrote:
The "tray" is only allowed for removable disks, i.e. CDROM and Floppy disks.
As the value for "tray" defaults to "closed", lots of tests are updated to include "tray='closed'" in the disk target XML.
I would take that as an indication that "tray='closed'" should just be omitted in output and assumed on input
src/conf/domain_conf.c | 33 +++++++++++++++++++- src/conf/domain_conf.h | 9 +++++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 2 +- .../qemuxml2argv-boot-complex-bootindex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-complex.xml | 6 ++-- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 +- ...uxml2argv-boot-menu-disable-drive-bootindex.xml | 2 +- .../qemuxml2argv-boot-menu-disable-drive.xml | 2 +- .../qemuxml2argv-boot-menu-disable.xml | 2 +- .../qemuxml2argv-boot-menu-enable.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 4 +- tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 2 +- .../qemuxml2argv-disk-cdrom-empty.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 +- .../qemuxml2argv-disk-copy_on_read.xml | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.xml | 2 +- .../qemuxml2argv-disk-drive-boot-disk.xml | 2 +- .../qemuxml2argv-disk-drive-cache-directsync.xml | 2 +- .../qemuxml2argv-disk-drive-cache-unsafe.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 2 +- ...muxml2argv-disk-drive-error-policy-enospace.xml | 2 +- .../qemuxml2argv-disk-drive-error-policy-stop.xml | 2 +- ...rgv-disk-drive-error-policy-wreport-rignore.xml | 2 +- .../qemuxml2argv-disk-drive-fmt-qcow.xml | 2 +- .../qemuxml2argv-disk-drive-no-boot.xml | 4 +- .../qemuxml2argv-disk-drive-readonly-disk.xml | 2 +- .../qemuxml2argv-disk-drive-readonly-no-device.xml | 2 +- .../qemuxml2argv-disk-drive-shared.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 4 +- .../qemuxml2argv-disk-ioeventfd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml | 2 +- .../qemuxml2argv-disk-snapshot.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +- .../qemuxml2argv-floppy-drive-fat.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 2 +- .../qemuxml2argv-net-bandwidth.xml | 2 +- .../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml | 8 ++-- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml | 4 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml | 2 +- 59 files changed, 109 insertions(+), 69 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index f9654f1..f359f8f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -613,6 +613,10 @@ VIR_ENUM_IMPL(virDomainStartupPolicy, VIR_DOMAIN_STARTUP_POLICY_LAST, "requisite", "optional");
+VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST, + "closed", + "open"); + #define virDomainReportError(code, ...) \ virReportErrorHelper(VIR_FROM_DOMAIN, code, __FILE__, \ __FUNCTION__, __LINE__, __VA_ARGS__) @@ -2894,6 +2898,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *authUsage = NULL; char *authUUID = NULL; char *usageType = NULL; + char *tray = NULL;
if (VIR_ALLOC(def)< 0) { virReportOOMError(); @@ -3002,6 +3007,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, (xmlStrEqual(cur->name, BAD_CAST "target"))) { target = virXMLPropString(cur, "dev"); bus = virXMLPropString(cur, "bus"); + tray = virXMLPropString(cur, "tray");
/* HACK: Work around for compat with Xen * driver in previous libvirt releases */ @@ -3271,6 +3277,25 @@ virDomainDiskDefParseXML(virCapsPtr caps, } }
+ if (tray) { + if ((def->tray_status = virDomainDiskTrayTypeFromString(tray))< 0) { + virDomainReportError(VIR_ERR_XML_ERROR, + _("unknown disk tray status '%s'"), tray); + goto error; + } + + if (def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY&& + def->device != VIR_DOMAIN_DISK_DEVICE_CDROM) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("tray is only valid for cdrom and floppy")); + goto error; + } + } else { + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + def->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; + } + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY&& def->bus != VIR_DOMAIN_DISK_BUS_FDC) { virDomainReportError(VIR_ERR_INTERNAL_ERROR,
I don't see tray being freed here, so that sounds like a leak
@@ -10228,8 +10253,14 @@ virDomainDiskDefFormat(virBufferPtr buf, } }
- virBufferAsprintf(buf, "<target dev='%s' bus='%s'/>\n", + virBufferAsprintf(buf, "<target dev='%s' bus='%s'", def->dst, bus); + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
I would make this conditional to if (def->tray_status != VIR_DOMAIN_DISK_TRAY_CLOSED) to avoid extra default data...
+ virBufferAsprintf(buf, " tray='%s'/>\n", + virDomainDiskTrayTypeToString(def->tray_status)); + else + virBufferAddLit(buf, "/>\n");
/*disk I/O throttling*/ if (def->blkdeviotune.total_bytes_sec || diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d98a551..6fa06c7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -306,6 +306,13 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_LAST };
+enum virDomainDiskTray { + VIR_DOMAIN_DISK_TRAY_CLOSED, + VIR_DOMAIN_DISK_TRAY_OPEN, + + VIR_DOMAIN_DISK_TRAY_LAST +}; + typedef struct _virDomainDiskHostDef virDomainDiskHostDef; typedef virDomainDiskHostDef *virDomainDiskHostDefPtr; struct _virDomainDiskHostDef { @@ -398,6 +405,7 @@ struct _virDomainDiskDef { char *src; virSecurityDeviceLabelDefPtr seclabel; char *dst; + int tray_status; int protocol; int nhosts; virDomainDiskHostDefPtr hosts; @@ -2016,6 +2024,7 @@ VIR_ENUM_DECL(virDomainDiskProtocol) VIR_ENUM_DECL(virDomainDiskIo) VIR_ENUM_DECL(virDomainDiskSecretType) VIR_ENUM_DECL(virDomainDiskSnapshot) +VIR_ENUM_DECL(virDomainDiskTray) VIR_ENUM_DECL(virDomainIoEventFd) VIR_ENUM_DECL(virDomainVirtioEventIdx) VIR_ENUM_DECL(virDomainDiskCopyOnRead) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml index 44a30de..9086528 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex-bootindex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> -<target dev='fdb' bus='fdc'/> +<target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml index 8ee42e7..646aa4c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-complex.xml @@ -37,17 +37,17 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/hdc'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd1'/> -<target dev='fdb' bus='fdc'/> +<target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml index f55ee2c..e1566c3 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-floppy.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive-bootindex.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable-drive.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml index 28b1b68..82a04c8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-disable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml index 7847a99..2046881 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-menu-enable.xml @@ -17,7 +17,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml index 85e6d91..07b7a85 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml @@ -20,7 +20,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml index 69ba3c0..e805064 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml @@ -20,7 +20,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <boot order='1'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> @@ -36,7 +36,7 @@ <disk type='file' device='floppy'> <driver name='qemu' type='raw'/> <source file='/dev/null'/> -<target dev='fdb' bus='fdc'/> +<target dev='fdb' bus='fdc' tray='closed'/> <boot order='4'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml index be07426..811e801 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/xenner</emulator> <disk type='block' device='cdrom'> <source dev='/dev/cdrom'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml index f1c9a42..9e6b816 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw' io='threads'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml index 8fdcb1d..85c163d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-empty.xml @@ -20,7 +20,7 @@ <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml index ab09ed6..4378cf8 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml index fb0bf2b..84df929 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-copy_on_read.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml index dda54f8..fbc0b09 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-cdrom.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml index cff1a42..36e2166 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-boot-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml index d32d569..6a58f68 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-directsync.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml index f2362af..fd77bac 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-unsafe.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml index 078e2e7..d6facdb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml index 1e575ed..262be15 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml index ffa8aba..f58b352 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v1-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml index 4c33b5a..5045d70 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-none.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml index cad8257..c093f07 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wb.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml index 1af9a9f..16b77c5 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-cache-v2-wt.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml index e0182d6..bef1c7c 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-enospace.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml index a1d55f9..77c4712 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-stop.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml index b52d397..b09f01f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-error-policy-wreport-rignore.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml index 599993c..28ed7cd 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-fmt-qcow.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml index 2ce27a5..e6100ea 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-no-boot.xml @@ -23,12 +23,12 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-disk.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml index a3ecd9c..9c7515f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-readonly-no-device.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/sr0'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml index 674bbed..2b91830 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-drive-shared.xml @@ -25,7 +25,7 @@ <disk type='block' device='cdrom'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml index 68e4f06..e2e85db 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy.xml @@ -21,12 +21,12 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='/tmp/firmware.img'/> -<target dev='fdb' bus='fdc'/> +<target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='usb' index='0'/> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml index 00edada..4e55804 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-ioeventfd.xml @@ -23,7 +23,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml index d89e57b..692290d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml @@ -16,7 +16,7 @@ <emulator>/usr/bin/qemu</emulator> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> </disk> <disk type='file' device='disk'> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml index 0544c05..3aa201d 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-snapshot.xml @@ -23,7 +23,7 @@ <disk type='block' device='cdrom' snapshot='no'> <driver name='qemu' type='raw'/> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index 02d1fd3..a53899a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml index 9606a52..9d1ec22 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml @@ -21,7 +21,7 @@ </disk> <disk type='block' device='cdrom'> <source dev='/dev/HostVG/QEMUGuest2'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml index a8131b9..567f4d6 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml @@ -25,7 +25,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml index 48bcdb7..29c4492 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-floppy-drive-fat.xml @@ -17,7 +17,7 @@ <disk type='dir' device='floppy'> <driver name='qemu' type='fat'/> <source dir='/var/somefiles'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml index 17fb06c..505801a 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml index d42239c..d66af2f 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-lease.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-lease.xml @@ -21,7 +21,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/root/boot.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml index 4b2e70c..ea698d0 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-bandwidth.xml @@ -30,7 +30,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/home/zippy/tmp/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml index 16efb69..b2d6bfd 100644 --- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml +++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-graphics-spice-timeout.xml @@ -48,7 +48,7 @@ <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml index 6cbdfe9..50712a6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> -<target dev='hda' bus='ide'/> +<target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml index 3bdb70b..de71ba6 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> -<target dev='hda' bus='ide'/> +<target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml index 00fbf4e..dafd4fb 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> -<target dev='sda' bus='scsi'/> +<target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml index e8f2e9f..ca7ca1c 100644 --- a/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml +++ b/tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='cdrom'> <source file='[datastore] directory/cdrom.iso'/> -<target dev='sda' bus='scsi'/> +<target dev='sda' bus='scsi' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml index 2e07963..e98bb58 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml @@ -20,17 +20,17 @@ </disk> <disk type='file' device='cdrom'> <source file='[datastore] directory/Debian1-cdrom.iso'/> -<target dev='sdp' bus='scsi'/> +<target dev='sdp' bus='scsi' tray='closed'/> <address type='drive' controller='1' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <source file='/vmimages/tools-isoimages/linux.iso'/> -<target dev='hda' bus='ide'/> +<target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='block' device='cdrom'> <source dev='/dev/scd0'/> -<target dev='hdb' bus='ide'/> +<target dev='hdb' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <disk type='file' device='disk'> @@ -40,7 +40,7 @@ </disk> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml index 0bc8eed..d35553f 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml @@ -19,12 +19,12 @@ </disk> <disk type='file' device='cdrom'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Isos/debian-testing-amd64-netinst.iso'/> -<target dev='hda' bus='ide'/> +<target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='floppy'> <source file='[498076b2-02796c1a-ef5b-000ae484a6a3] Debian2/dummy.flp'/> -<target dev='fdb' bus='fdc'/> +<target dev='fdb' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='1'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml index ee23120..98faa9b 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml @@ -26,7 +26,7 @@ </disk> <disk type='file' device='cdrom'> <source file='[4af0231d-1eff559a-6369-0024e84773b6] isos/CentOS-5.5-x86_64-bin-DVD-1of2.iso'/> -<target dev='hda' bus='ide'/> +<target dev='hda' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml index 227308b..ec6a035 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='vmpvscsi'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-device.xml b/tests/vmx2xmldata/vmx2xml-floppy-device.xml index 8aef9c0..d6f3bab 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-device.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-device.xml @@ -13,7 +13,7 @@ <devices> <disk type='block' device='floppy'> <source dev='/dev/fd0'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-floppy-file.xml b/tests/vmx2xmldata/vmx2xml-floppy-file.xml index c36e3f0..941118e 100644 --- a/tests/vmx2xmldata/vmx2xml-floppy-file.xml +++ b/tests/vmx2xmldata/vmx2xml-floppy-file.xml @@ -13,7 +13,7 @@ <devices> <disk type='file' device='floppy'> <source file='[datastore] directory/floppy.flp'/> -<target dev='fda' bus='fdc'/> +<target dev='fda' bus='fdc' tray='closed'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='fdc' index='0'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml index 4c958ae..0081adf 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/> diff --git a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml index 0501a45..28753a2 100644 --- a/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml +++ b/tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml @@ -19,7 +19,7 @@ </disk> <disk type='file' device='cdrom'> <source file='/usr/lib/vmware/isoimages/linux.iso'/> -<target dev='hdc' bus='ide'/> +<target dev='hdc' bus='ide' tray='closed'/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='scsi' index='0' model='lsilogic'/>
I'm not 100% sure what is the best approach but I would avoid putting tray='closed' systematically on output.
Per 5/9 will update the domain def on the fly if tray status is changed, so IMHO it's better to print it out always, it's more explicit for user's eyes to make sure that the tray status is changed indeed. Osier

This is similiar with physical world, one will be surprised if the box starts with medium exists while the tray is open. New tests are added, tests disk-{cdrom,floppy}-tray are for the qemu supports "-device" flag, and disk-{cdrom,floppy}-no-device-cap are for old qemu, i.e. which doesn't support "-device" flag. --- src/qemu/qemu_command.c | 16 ++++++- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 4 ++ .../qemuxml2argv-disk-cdrom-tray-no-device-cap.xml | 32 +++++++++++++++ .../qemuxml2argv-disk-cdrom-tray.args | 10 +++++ .../qemuxml2argv-disk-cdrom-tray.xml | 43 ++++++++++++++++++++ ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 4 ++ ...qemuxml2argv-disk-floppy-tray-no-device-cap.xml | 37 +++++++++++++++++ .../qemuxml2argv-disk-floppy-tray.args | 10 +++++ .../qemuxml2argv-disk-floppy-tray.xml | 37 +++++++++++++++++ tests/qemuxml2argvtest.c | 6 +++ 10 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cddd6aa..60c3d16 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1885,8 +1885,12 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, } /* disk->src is NULL when we use nbd disks */ - if (disk->src || (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK && - disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) { + if ((disk->src || + (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK && + disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) && + !((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) && + disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) { if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) { /* QEMU only supports magic FAT format for now */ if (disk->driverType && @@ -4694,7 +4698,13 @@ qemuBuildCommandLine(virConnectPtr conn, } } - virCommandAddArgList(cmd, dev, file, NULL); + /* Don't start with source if the tray is open for + * CDROM and Floppy device. + */ + if (!((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) && + disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) + virCommandAddArgList(cmd, dev, file, NULL); VIR_FREE(file); } } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args new file mode 100644 index 0000000..5cd000e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none \ +-serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml new file mode 100644 index 0000000..9f891c7 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml @@ -0,0 +1,32 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <currentMemory>219100</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide' tray='open'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args new file mode 100644 index 0000000..dfa0006 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc-0.13 -m 1024 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot dc \ +-drive file=/var/lib/libvirt/images/f14.img,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 \ +-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,if=none,media=cdrom,id=drive-ide0-1-0 \ +-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-drive if=none,media=cdrom,id=drive-ide0-1-1 \ +-device ide-drive,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml new file mode 100644 index 0000000..419f8f6 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml @@ -0,0 +1,43 @@ +<domain type='qemu'> + <name>test</name> + <uuid>3fa02811-7832-34bd-004d-1ff56a9286ff</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='x86_64' machine='pc-0.13'>hvm</type> + <boot dev='cdrom'/> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/f14.img'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> + <target dev='hdc' bus='ide' tray='closed'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/tmp/cdrom.img'/> + <target dev='hdd' bus='ide' tray='open'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args new file mode 100644 index 0000000..a0aed99 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -fda /dev/fd0 \ +-net none -serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml new file mode 100644 index 0000000..1f4dd7f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219136</memory> + <currentMemory>219136</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='block' device='floppy'> + <source dev='/dev/fd0'/> + <target dev='fda' bus='fdc' tray='closed'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='floppy'> + <source file='/tmp/firmware.img'/> + <target dev='fdb' bus='fdc' tray='open'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='fdc' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args new file mode 100644 index 0000000..1a61ea5 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-0 \ +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +-drive file=/dev/fd0,if=none,id=drive-fdc0-0-0 \ +-global isa-fdc.driveA=drive-fdc0-0-0 \ +-drive if=none,id=drive-fdc0-0-1 \ +-global isa-fdc.driveB=drive-fdc0-0-1 \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml new file mode 100644 index 0000000..1f4dd7f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219136</memory> + <currentMemory>219136</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='block' device='floppy'> + <source dev='/dev/fd0'/> + <target dev='fda' bus='fdc' tray='closed'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='floppy'> + <source file='/tmp/firmware.img'/> + <target dev='fdb' bus='fdc' tray='open'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='fdc' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index fcffc27..e304318 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -392,7 +392,13 @@ mymain(void) DO_TEST("hugepages", false, QEMU_CAPS_MEM_PATH); DO_TEST("disk-cdrom", false, NONE); DO_TEST("disk-cdrom-empty", false, QEMU_CAPS_DRIVE); + DO_TEST("disk-cdrom-tray", false, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_TX_ALG); + DO_TEST("disk-cdrom-tray-no-device-cap", false, NONE); DO_TEST("disk-floppy", false, NONE); + DO_TEST("disk-floppy-tray-no-device-cap", false, NONE); + DO_TEST("disk-floppy-tray", false, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE); DO_TEST("disk-many", false, NONE); DO_TEST("disk-virtio", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); DO_TEST("disk-order", false, -- 1.7.1

On Mon, Mar 05, 2012 at 06:25:42PM +0800, Osier Yang wrote:
This is similiar with physical world, one will be surprised if the box starts with medium exists while the tray is open.
New tests are added, tests disk-{cdrom,floppy}-tray are for the qemu supports "-device" flag, and disk-{cdrom,floppy}-no-device-cap are for old qemu, i.e. which doesn't support "-device" flag. --- src/qemu/qemu_command.c | 16 ++++++- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 4 ++ .../qemuxml2argv-disk-cdrom-tray-no-device-cap.xml | 32 +++++++++++++++ .../qemuxml2argv-disk-cdrom-tray.args | 10 +++++ .../qemuxml2argv-disk-cdrom-tray.xml | 43 ++++++++++++++++++++ ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 4 ++ ...qemuxml2argv-disk-floppy-tray-no-device-cap.xml | 37 +++++++++++++++++ .../qemuxml2argv-disk-floppy-tray.args | 10 +++++ .../qemuxml2argv-disk-floppy-tray.xml | 37 +++++++++++++++++ tests/qemuxml2argvtest.c | 6 +++ 10 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cddd6aa..60c3d16 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1885,8 +1885,12 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, }
/* disk->src is NULL when we use nbd disks */ - if (disk->src || (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK && - disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) { + if ((disk->src || + (disk->type == VIR_DOMAIN_DISK_TYPE_NETWORK && + disk->protocol == VIR_DOMAIN_DISK_PROTOCOL_NBD)) && + !((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) && + disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) { if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) { /* QEMU only supports magic FAT format for now */ if (disk->driverType && @@ -4694,7 +4698,13 @@ qemuBuildCommandLine(virConnectPtr conn, } }
- virCommandAddArgList(cmd, dev, file, NULL); + /* Don't start with source if the tray is open for + * CDROM and Floppy device. + */ + if (!((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) && + disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) + virCommandAddArgList(cmd, dev, file, NULL); VIR_FREE(file); } } diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args new file mode 100644 index 0000000..5cd000e --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none \ +-serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml new file mode 100644 index 0000000..9f891c7 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray-no-device-cap.xml @@ -0,0 +1,32 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219100</memory> + <currentMemory>219100</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <source file='/root/boot.iso'/> + <target dev='hdc' bus='ide' tray='open'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args new file mode 100644 index 0000000..dfa0006 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc-0.13 -m 1024 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot dc \ +-drive file=/var/lib/libvirt/images/f14.img,if=none,id=drive-virtio-disk0 \ +-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0 \ +-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,if=none,media=cdrom,id=drive-ide0-1-0 \ +-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ +-drive if=none,media=cdrom,id=drive-ide0-1-1 \ +-device ide-drive,bus=ide.1,unit=1,drive=drive-ide0-1-1,id=ide0-1-1 \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml new file mode 100644 index 0000000..419f8f6 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom-tray.xml @@ -0,0 +1,43 @@ +<domain type='qemu'> + <name>test</name> + <uuid>3fa02811-7832-34bd-004d-1ff56a9286ff</uuid> + <memory>1048576</memory> + <currentMemory>1048576</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='x86_64' machine='pc-0.13'>hvm</type> + <boot dev='cdrom'/> + <boot dev='hd'/> + <bootmenu enable='yes'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>restart</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='file' device='disk'> + <driver name='qemu' type='qcow2'/> + <source file='/var/lib/libvirt/images/f14.img'/> + <target dev='vda' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/> + <target dev='hdc' bus='ide' tray='closed'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='0'/> + </disk> + <disk type='file' device='cdrom'> + <driver name='qemu' type='raw'/> + <source file='/tmp/cdrom.img'/> + <target dev='hdd' bus='ide' tray='open'/> + <readonly/> + <address type='drive' controller='0' bus='1' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args new file mode 100644 index 0000000..a0aed99 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.args @@ -0,0 +1,4 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M \ +pc -m 214 -smp 1 -nographic -monitor unix:/tmp/test-monitor,server,nowait \ +-no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -fda /dev/fd0 \ +-net none -serial none -parallel none -usb diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml new file mode 100644 index 0000000..1f4dd7f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray-no-device-cap.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219136</memory> + <currentMemory>219136</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='block' device='floppy'> + <source dev='/dev/fd0'/> + <target dev='fda' bus='fdc' tray='closed'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='floppy'> + <source file='/tmp/firmware.img'/> + <target dev='fdb' bus='fdc' tray='open'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='fdc' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args new file mode 100644 index 0000000..1a61ea5 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.args @@ -0,0 +1,10 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \ +/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \ +-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-0 \ +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +-drive file=/dev/fd0,if=none,id=drive-fdc0-0-0 \ +-global isa-fdc.driveA=drive-fdc0-0-0 \ +-drive if=none,id=drive-fdc0-0-1 \ +-global isa-fdc.driveB=drive-fdc0-0-1 \ +-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml new file mode 100644 index 0000000..1f4dd7f --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-floppy-tray.xml @@ -0,0 +1,37 @@ +<domain type='qemu'> + <name>QEMUGuest1</name> + <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid> + <memory>219136</memory> + <currentMemory>219136</currentMemory> + <vcpu>1</vcpu> + <os> + <type arch='i686' machine='pc'>hvm</type> + <boot dev='hd'/> + </os> + <clock offset='utc'/> + <on_poweroff>destroy</on_poweroff> + <on_reboot>restart</on_reboot> + <on_crash>destroy</on_crash> + <devices> + <emulator>/usr/bin/qemu</emulator> + <disk type='block' device='disk'> + <source dev='/dev/HostVG/QEMUGuest1'/> + <target dev='hda' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='block' device='floppy'> + <source dev='/dev/fd0'/> + <target dev='fda' bus='fdc' tray='closed'/> + <address type='drive' controller='0' bus='0' target='0' unit='0'/> + </disk> + <disk type='file' device='floppy'> + <source file='/tmp/firmware.img'/> + <target dev='fdb' bus='fdc' tray='open'/> + <address type='drive' controller='0' bus='0' target='0' unit='1'/> + </disk> + <controller type='usb' index='0'/> + <controller type='fdc' index='0'/> + <controller type='ide' index='0'/> + <memballoon model='virtio'/> + </devices> +</domain> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index fcffc27..e304318 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -392,7 +392,13 @@ mymain(void) DO_TEST("hugepages", false, QEMU_CAPS_MEM_PATH); DO_TEST("disk-cdrom", false, NONE); DO_TEST("disk-cdrom-empty", false, QEMU_CAPS_DRIVE); + DO_TEST("disk-cdrom-tray", false, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_VIRTIO_TX_ALG); + DO_TEST("disk-cdrom-tray-no-device-cap", false, NONE); DO_TEST("disk-floppy", false, NONE); + DO_TEST("disk-floppy-tray-no-device-cap", false, NONE); + DO_TEST("disk-floppy-tray", false, + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE); DO_TEST("disk-many", false, NONE); DO_TEST("disk-virtio", false, QEMU_CAPS_DRIVE, QEMU_CAPS_DRIVE_BOOT); DO_TEST("disk-order", false,
ACK Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

Il 05/03/2012 11:25, Osier Yang ha scritto:
This is similiar with physical world, one will be surprised if the box starts with medium exists while the tray is open.
New tests are added, tests disk-{cdrom,floppy}-tray are for the qemu supports "-device" flag, and disk-{cdrom,floppy}-no-device-cap are for old qemu, i.e. which doesn't support "-device" flag.
If the disk type is "block", and the source drive is a CD-ROM, the virtual tray state should be tied to the physical tray, even though this isn't always the case due to QEMU bugs. Perhaps you should fail creation if the tray attribute is "open" in the above circumstances. Another possibility is to forbid specifying the tray attribute completely. Or you can just drop this patch, and only print the tray state in the virsh dumpxml output. There are other attributes that already handled this way. Paolo

On 03/11/2012 10:44 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This is similiar with physical world, one will be surprised if the box starts with medium exists while the tray is open.
New tests are added, tests disk-{cdrom,floppy}-tray are for the qemu supports "-device" flag, and disk-{cdrom,floppy}-no-device-cap are for old qemu, i.e. which doesn't support "-device" flag.
If the disk type is "block", and the source drive is a CD-ROM, the virtual tray state should be tied to the physical tray, even though this isn't always the case due to QEMU bugs.
Perhaps you should fail creation if the tray attribute is "open" in the above circumstances. Another possibility is to forbid specifying the tray attribute completely.
What will be the problem in such case if the tray is "open" and we don't start with the physical CD-ROM in QEMU command line?
Or you can just drop this patch, and only print the tray state in the virsh dumpxml output. There are other attributes that already handled this way.
No, Print the tray status as internal XML is opposite with the purpose of these patches, we don't want the domain migrated or (saved + restored) see the medium still exists in guest while it's ejected before. Thus we want the tray status could be persistent XML, which we could looked up while domain starting. So neither "forbid specifying the tray status" nor "only print the XML internally" work. The only choice for use is to "fail creation if the tray status is open", that's the normal logic, and we can do in this way, but I have to understand why we have to do so, :-) Thanks for the input, Paolo. Osier

Il 12/03/2012 05:55, Osier Yang ha scritto:
What will be the problem in such case if the tray is "open" and we don't start with the physical CD-ROM in QEMU command line?
Closing the drive tray will not automatically close the guest tray. (It doesn't now because of QEMU limitations---but if you open with no physical CD-ROM, there's no hope of fixing it :)).
Or you can just drop this patch, and only print the tray state in the virsh dumpxml output. There are other attributes that already handled this way.
No, Print the tray status as internal XML is opposite with the purpose of these patches, we don't want the domain migrated or (saved + restored) see the medium still exists in guest while it's ejected before.
Ah, understood. Was it stated in commit messages? VMs with physical CD-ROMs in general should not be migrated, so I think migration is not a problem in this case. Paolo

On 03/12/2012 04:26 PM, Paolo Bonzini wrote:
Il 12/03/2012 05:55, Osier Yang ha scritto:
What will be the problem in such case if the tray is "open" and we don't start with the physical CD-ROM in QEMU command line?
Closing the drive tray will not automatically close the guest tray. (It doesn't now because of QEMU limitations---but if you open with no physical CD-ROM, there's no hope of fixing it :)).
lol, okay
Or you can just drop this patch, and only print the tray state in the virsh dumpxml output. There are other attributes that already handled this way.
No, Print the tray status as internal XML is opposite with the purpose of these patches, we don't want the domain migrated or (saved + restored) see the medium still exists in guest while it's ejected before.
Ah, understood. Was it stated in commit messages?
Yes, <snip> [2/9] ~ [5/9]: New attribute "tray" is added to disk target, it indicates the tray status of removable disk, i.e. CDROM and Floppy disks, its value could be either of "open" or "closed", defaults to "closed", and a removable disk with tray == "open" won't have the source when domain is started. The value of "tray" will be updated while tray moved event is emitted from guest. Prior to these patches, if the user ejected the medium of removable disk from guest side, and then do migration or save/restoring, the guest will still starts the medium source ,and thus the medium will still exists in guest, which is strange. These patches fix it. </snip> A bit long though, :-)
VMs with physical CD-ROMs in general should not be migrated, so I think migration is not a problem in this case.
QEMU will prohibit that, right? if so, we have no problem here. Either migrate or (save + restore). Osier

Il 12/03/2012 10:28, Osier Yang ha scritto:
VMs with physical CD-ROMs in general should not be migrated, so I think migration is not a problem in this case.
QEMU will prohibit that, right? if so, we have no problem here. Either migrate or (save + restore).
Again, it will not but it should, so for migration it's ok. When you start the domain, we could just say tray="open" is invalid for <disk type="block">. Paolo

On 03/12/2012 05:10 PM, Paolo Bonzini wrote:
Il 12/03/2012 10:28, Osier Yang ha scritto:
VMs with physical CD-ROMs in general should not be migrated, so I think migration is not a problem in this case.
QEMU will prohibit that, right? if so, we have no problem here. Either migrate or (save + restore).
Again, it will not but it should, so for migration it's ok. When you start the domain, we could just say tray="open" is invalid for<disk type="block">.
We shouldn't do that while conf parsing, the only place which might be proper is while building the qemu command line, but I'm not quite sure if it's good to do that in libvirt, it's more like a protection for the qemu problem. Anyway, I created the patch, which will be posted along with the v2 series together later, let's evaluate there then. :-) Osier

On 03/11/2012 08:44 AM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This is similiar with physical world, one will be surprised if the box starts with medium exists while the tray is open.
New tests are added, tests disk-{cdrom,floppy}-tray are for the qemu supports "-device" flag, and disk-{cdrom,floppy}-no-device-cap are for old qemu, i.e. which doesn't support "-device" flag.
If the disk type is "block", and the source drive is a CD-ROM, the virtual tray state should be tied to the physical tray, even though this isn't always the case due to QEMU bugs.
Perhaps you should fail creation if the tray attribute is "open" in the above circumstances. Another possibility is to forbid specifying the tray attribute completely.
Or you can just drop this patch, and only print the tray state in the virsh dumpxml output. There are other attributes that already handled this way.
Are we trying to map the tray='open' to what the guest sees (in which case, we should reject it for non-cdrom guest views), what the host sees (even if the guest is viewing the storage as a non-cdrom IDE disk, but the host storage backing that disk is a cdrom), or both? I would argue that <target tray='open'/> should describe _only_ the guest's view, regardless of host state (if host is even tying a physical cdrom to the guest), and that if we _need_ the host state, that it should be an optional element in <source>. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Il 13/03/2012 20:15, Eric Blake ha scritto:
If the disk type is "block", and the source drive is a CD-ROM, the virtual tray state should be tied to the physical tray, even though this isn't always the case due to QEMU bugs.
Are we trying to map the tray='open' to what the guest sees (in which case, we should reject it for non-cdrom guest views), what the host sees (even if the guest is viewing the storage as a non-cdrom IDE disk, but the host storage backing that disk is a cdrom), or both?
I would argue that <target tray='open'/> should describe _only_ the guest's view, regardless of host state (if host is even tying a physical cdrom to the guest), and that if we _need_ the host state, that it should be an optional element in <source>.
I'm only concerned of the passthrough case, in which: 1) the host tray state and guest tray state are the same (or should be); 2) the guest tray state is not controlled by an empty source; 3) the host tray state cannot really be controlled by either libvirt or QEMU. Think of laptops whose tray can only open, not close. Paolo

With this patch, libvirt won't start the guest with the medium source which already ejected by guest when doing migration, or saving/restoring. --- src/qemu/qemu_process.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 387811a..a75209d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1038,6 +1038,13 @@ qemuProcessHandleTrayMoved(qemuMonitorPtr mon ATTRIBUTE_UNUSED, event = virDomainEventTrayMovedNewFromObj(vm, devAlias, trayOpened); + + /* Update disk tray status */ + disk->tray_status = trayOpened; + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + VIR_WARN("Unable to save status on vm %s after tray moved event", + vm->def->name); + } } virDomainObjUnlock(vm); -- 1.7.1

On Mon, Mar 05, 2012 at 06:25:43PM +0800, Osier Yang wrote:
With this patch, libvirt won't start the guest with the medium source which already ejected by guest when doing migration, or saving/restoring. --- src/qemu/qemu_process.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 387811a..a75209d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1038,6 +1038,13 @@ qemuProcessHandleTrayMoved(qemuMonitorPtr mon ATTRIBUTE_UNUSED, event = virDomainEventTrayMovedNewFromObj(vm, devAlias, trayOpened); + + /* Update disk tray status */ + disk->tray_status = trayOpened; + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + VIR_WARN("Unable to save status on vm %s after tray moved event", + vm->def->name); + } }
virDomainObjUnlock(vm);
ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

This patch introduces a new event type for the QMP event WAKEUP: VIR_DOMAIN_EVENT_ID_WAKEUP The event doesn't take any data. Thus the callback definition is: typedef void (*virConnectDomainEventWakeupCallback)(virConnectPtr conn, virDomainPtr dom, void *opaque); --- daemon/remote.c | 24 ++++++++++ examples/domain-events/events-c/event-test.c | 19 +++++++- examples/domain-events/events-python/event-test.py | 4 ++ include/libvirt/libvirt.h.in | 16 +++++++ python/libvirt-override-virConnect.py | 8 +++ python/libvirt-override.c | 48 ++++++++++++++++++++ src/conf/domain_event.c | 31 +++++++++++++ src/conf/domain_event.h | 2 + src/libvirt_private.syms | 2 + src/qemu/qemu_monitor.c | 12 +++++ src/qemu/qemu_monitor.h | 4 ++ src/qemu/qemu_monitor_json.c | 10 ++++- src/qemu/qemu_process.c | 21 +++++++++ src/remote/remote_driver.c | 32 +++++++++++++ src/remote/remote_protocol.x | 7 +++- src/remote_protocol-structs | 7 ++- 16 files changed, 242 insertions(+), 5 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index cc464fd..548faab 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -537,6 +537,29 @@ static int remoteRelayDomainEventTrayMoved(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int remoteRelayDomainEventWakeup(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque) { + virNetServerClientPtr client = opaque; + remote_domain_event_wakeup_msg data; + + if (!client) + return -1; + + VIR_DEBUG("Relaying domain %s %d system wakeup", dom->name, dom->id); + + /* build return data */ + memset(&data, 0, sizeof data); + make_nonnull_domain(&data.dom, dom); + + remoteDispatchDomainEventSend(client, remoteProgram, + REMOTE_PROC_DOMAIN_EVENT_WAKEUP, + (xdrproc_t)xdr_remote_domain_event_wakeup_msg, &data); + + return 0; +} + + static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventLifecycle), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventReboot), @@ -549,6 +572,7 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventBlockJob), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventDiskChange), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventTrayMoved), + VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventWakeup), }; verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index c7bcaeb..15cf5b3 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -325,6 +325,15 @@ static int myDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int myDomainEventWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) system wakeup", + __func__, virDomainGetName(dom), virDomainGetID(dom)); + return 0; +} + static void myFreeFunc(void *opaque) { char *str = opaque; @@ -361,6 +370,7 @@ int main(int argc, char **argv) int callback8ret = -1; int callback9ret = -1; int callback10ret = -1; + int callback11ret = -1; struct sigaction action_stop; memset(&action_stop, 0, sizeof action_stop); @@ -436,6 +446,11 @@ int main(int argc, char **argv) VIR_DOMAIN_EVENT_ID_TRAY_MOVED, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventTrayMovedCallback), strdup("tray moved"), myFreeFunc); + callback11ret = virConnectDomainEventRegisterAny(dconn, + NULL, + VIR_DOMAIN_EVENT_ID_WAKEUP, + VIR_DOMAIN_EVENT_CALLBACK(myDomainEventWakeupCallback), + strdup("system wakeup"), myFreeFunc); if ((callback1ret != -1) && (callback2ret != -1) && @@ -445,7 +460,8 @@ int main(int argc, char **argv) (callback6ret != -1) && (callback7ret != -1) && (callback9ret != -1) && - (callback10ret != -1)) { + (callback10ret != -1) && + (callback11ret != -1)) { if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { virErrorPtr err = virGetLastError(); fprintf(stderr, "Failed to start keepalive protocol: %s\n", @@ -471,6 +487,7 @@ int main(int argc, char **argv) virConnectDomainEventDeregisterAny(dconn, callback7ret); virConnectDomainEventDeregisterAny(dconn, callback9ret); virConnectDomainEventDeregisterAny(dconn, callback10ret); + virConnectDomainEventDeregisterAny(dconn, callback11ret); if (callback8ret != -1) virConnectDomainEventDeregisterAny(dconn, callback8ret); } diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py index f2f5597..d70ab0a 100644 --- a/examples/domain-events/events-python/event-test.py +++ b/examples/domain-events/events-python/event-test.py @@ -477,6 +477,9 @@ def myDomainEventDiskChangeCallback(conn, dom, oldSrcPath, newSrcPath, devAlias, def myDomainEventTrayMovedCallback(conn, dom, devAlias, trayOpened, opaque): print "myDomainEventTrayMovedCallback: Domain %s(%s) tray moved devAlias: %s trayOpened: %d" % ( dom.name(), dom.ID(), devAlias, trayOpened) +def myDomainEventWakeupCallback(conn, dom, opaque): + print "myDomainEventWakeupCallback: Domain %s(%s) system wakeup" % ( + dom.name(), dom.ID()) def usage(out=sys.stderr): print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]" print >>out, " uri will default to qemu:///system" @@ -536,6 +539,7 @@ def main(): vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_GRAPHICS, myDomainEventGraphicsCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_MOVED, myDomainEventTrayMovedCallback, None) + vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WAKEUP, myDomainEventWakeupCallback, None) vc.setKeepAlive(5, 3) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 730f2a3..775a0c7 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -3662,6 +3662,21 @@ typedef void (*virConnectDomainEventTrayMovedCallback)(virConnectPtr conn, unsigned int trayOpened, void *opaque); +/** + * virConnectDomainEventWakeupCallback: + * @conn: connection object + * @dom: domain on which the event occurred + * @opaque: application specified data + * + * This callback occurs when the guest is waken up. + * + * The callback signature to use when registering for an event of type + * VIR_DOMAIN_EVENT_ID_WAKEUP with virConnectDomainEventRegisterAny() + */ +typedef void (*virConnectDomainEventWakeupCallback)(virConnectPtr conn, + virDomainPtr dom, + void *opaque); + /** * VIR_DOMAIN_EVENT_CALLBACK: @@ -3684,6 +3699,7 @@ typedef enum { VIR_DOMAIN_EVENT_ID_BLOCK_JOB = 8, /* virConnectDomainEventBlockJobCallback */ VIR_DOMAIN_EVENT_ID_DISK_CHANGE = 9, /* virConnectDomainEventDiskChangeCallback */ VIR_DOMAIN_EVENT_ID_TRAY_MOVED = 10, /* virConnectDomainEventTrayMovedCallback */ + VIR_DOMAIN_EVENT_ID_WAKEUP = 11, /* virConnectDomainEventWakeupCallback */ #ifdef VIR_ENUM_SENTINELS /* diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py index e93efa7..323bb18 100644 --- a/python/libvirt-override-virConnect.py +++ b/python/libvirt-override-virConnect.py @@ -143,6 +143,14 @@ cb(self, virDomain(self, _obj=dom), devAlias, trayOpened, opaque) return 0; + def _dispatchDomainEventWakeupCallback(self, dom, cbData): + """Dispatches event to python user domain wakeup event callbacks + """ + cb = cbData["cb"] + opaque = cbData["opaque"] + + cb(self, virDomain(self, _obj=dom), opaque) + return 0; def domainEventDeregisterAny(self, callbackID): """Removes a Domain Event Callback. De-registering for a diff --git a/python/libvirt-override.c b/python/libvirt-override.c index 976c5d8..3b439a4 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -4974,6 +4974,51 @@ libvirt_virConnectDomainEventTrayMovedCallback(virConnectPtr conn ATTRIBUTE_UNUS return ret; } +static int +libvirt_virConnectDomainEventWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque) +{ + PyObject *pyobj_cbData = (PyObject*)opaque; + PyObject *pyobj_dom; + PyObject *pyobj_ret; + PyObject *pyobj_conn; + PyObject *dictKey; + int ret = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + /* Create a python instance of this virDomainPtr */ + virDomainRef(dom); + + pyobj_dom = libvirt_virDomainPtrWrap(dom); + Py_INCREF(pyobj_cbData); + + dictKey = libvirt_constcharPtrWrap("conn"); + pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey); + Py_DECREF(dictKey); + + /* Call the Callback Dispatcher */ + pyobj_ret = PyObject_CallMethod(pyobj_conn, + (char*)"_dispatchDomainEventWakeupCallback", + (char*)"OO", + pyobj_dom, + pyobj_cbData); + + Py_DECREF(pyobj_cbData); + Py_DECREF(pyobj_dom); + + if(!pyobj_ret) { + DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret); + PyErr_Print(); + } else { + Py_DECREF(pyobj_ret); + ret = 0; + } + + LIBVIRT_RELEASE_THREAD_STATE; + return ret; +} + static PyObject * libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) @@ -5037,6 +5082,9 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, case VIR_DOMAIN_EVENT_ID_TRAY_MOVED: cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventTrayMovedCallback); break; + case VIR_DOMAIN_EVENT_ID_WAKEUP: + cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventWakeupCallback); + break; } if (!cb) { diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index dbd1bf1..956d3c2 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -121,6 +121,9 @@ struct _virDomainEvent { char *devAlias; unsigned int trayOpened :1; } trayMoved; + struct { + int reason; + } wakeup; } data; }; @@ -1094,6 +1097,30 @@ virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, devAlias, trayOpened); } +static virDomainEventPtr +virDomainEventWakeupNew(int id, const char *name, + unsigned char *uuid) +{ + virDomainEventPtr ev = + virDomainEventNewInternal(VIR_DOMAIN_EVENT_ID_WAKEUP, + id, name, uuid); + return ev; +} + +virDomainEventPtr +virDomainEventWakeupNewFromObj(virDomainObjPtr obj) +{ + return virDomainEventWakeupNew(obj->def->id, + obj->def->name, + obj->def->uuid); +} + +virDomainEventPtr +virDomainEventWakeupNewFromDom(virDomainPtr dom) +{ + return virDomainEventWakeupNew(dom->id, dom->name, dom->uuid); +} + /** * virDomainEventQueuePush: @@ -1225,6 +1252,10 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, cbopaque); break; + case VIR_DOMAIN_EVENT_ID_WAKEUP: + (cb)(conn, dom, cbopaque); + break; + default: VIR_WARN("Unexpected event ID %d", event->eventID); break; diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 3351be0..51b6570 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -120,6 +120,8 @@ virDomainEventPtr virDomainEventTrayMovedNewFromObj(virDomainObjPtr obj, virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, const char *devAlias, unsigned int trayOpened); +virDomainEventPtr virDomainEventWakeupNewFromObj(virDomainObjPtr obj); +virDomainEventPtr virDomainEventWakeupNewFromDom(virDomainPtr dom); void virDomainEventFree(virDomainEventPtr event); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 27d4ad3..e2e34ca 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -512,6 +512,8 @@ virDomainEventStateRegisterID; virDomainEventStateFree; virDomainEventStateNew; virDomainEventStateQueue; +virDomainEventWakeupNewFromDom; +virDomainEventWakeupNewFromObj; virDomainEventTrayMovedNewFromDom; virDomainEventTrayMovedNewFromObj; virDomainEventWatchdogNewFromDom; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index dfa2960..bf51bdd 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1053,6 +1053,18 @@ int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, return ret; } +int +qemuMonitorEmitWakeup(qemuMonitorPtr mon) + +{ + int ret = -1; + VIR_DEBUG("mon=%p", mon); + + QEMU_MONITOR_CALLBACK(mon, ret, domainWakeup, mon->vm); + + return ret; +} + int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 18e6801..08f1d7a 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -128,6 +128,9 @@ struct _qemuMonitorCallbacks { virDomainObjPtr vm, const char *devAlias, unsigned int trayOpened); + int (*domainWakeup)(qemuMonitorPtr mon, + virDomainObjPtr vm); + }; @@ -198,6 +201,7 @@ int qemuMonitorEmitGraphics(qemuMonitorPtr mon, int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, const char *devAlias, unsigned int trayOpened); +int qemuMonitorEmitWakeup(qemuMonitorPtr mon); int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index ac6b02c..19cda44 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -60,6 +60,7 @@ static void qemuMonitorJSONHandleVNCInitialize(qemuMonitorPtr mon, virJSONValueP static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleWakeup(qemuMonitorPtr mon, virJSONValuePtr data); static struct { const char *type; @@ -77,6 +78,7 @@ static struct { { "VNC_DISCONNECTED", qemuMonitorJSONHandleVNCDisconnect, }, { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, }, { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayMoved, }, + { "WAKEUP", qemuMonitorJSONHandleWakeup, }, }; @@ -582,7 +584,6 @@ VIR_ENUM_DECL(qemuMonitorIOErrorAction) VIR_ENUM_IMPL(qemuMonitorIOErrorAction, VIR_DOMAIN_EVENT_IO_ERROR_LAST, "ignore", "stop", "report"); - static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data) { const char *device; @@ -744,6 +745,13 @@ static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr d qemuMonitorEmitTrayMoved(mon, devAlias, (unsigned int)trayOpened); } +static void +qemuMonitorJSONHandleWakeup(qemuMonitorPtr mon, + virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitWakeup(mon); +} + int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, const char *cmd_str, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index a75209d..de173bd 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1058,6 +1058,26 @@ qemuProcessHandleTrayMoved(qemuMonitorPtr mon ATTRIBUTE_UNUSED, return 0; } +static int +qemuProcessHandleWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, + virDomainObjPtr vm) +{ + struct qemud_driver *driver = qemu_driver; + virDomainEventPtr event = NULL; + + virDomainObjLock(vm); + event = virDomainEventWakeupNewFromObj(vm); + + virDomainObjUnlock(vm); + + if (event) { + qemuDriverLock(driver); + qemuDomainEventQueue(driver, event); + qemuDriverUnlock(driver); + } + + return 0; +} static qemuMonitorCallbacks monitorCallbacks = { .destroy = qemuProcessHandleMonitorDestroy, @@ -1073,6 +1093,7 @@ static qemuMonitorCallbacks monitorCallbacks = { .domainGraphics = qemuProcessHandleGraphics, .domainBlockJob = qemuProcessHandleBlockJob, .domainTrayMoved = qemuProcessHandleTrayMoved, + .domainWakeup = qemuProcessHandleWakeup, }; static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 31d09a9..dd68738 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -243,6 +243,11 @@ remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog, virNetClientPtr client, void *evdata, void *opaque); +static void +remoteDomainBuildEventWakeup(virNetClientProgramPtr prog, + virNetClientPtr client, + void *evdata, void *opaque); + static virNetClientProgramEvent remoteDomainEvents[] = { { REMOTE_PROC_DOMAIN_EVENT_RTC_CHANGE, remoteDomainBuildEventRTCChange, @@ -288,6 +293,10 @@ static virNetClientProgramEvent remoteDomainEvents[] = { remoteDomainBuildEventTrayMoved, sizeof(remote_domain_event_tray_moved_msg), (xdrproc_t)xdr_remote_domain_event_tray_moved_msg }, + { REMOTE_PROC_DOMAIN_EVENT_WAKEUP, + remoteDomainBuildEventWakeup, + sizeof(remote_domain_event_wakeup_msg), + (xdrproc_t)xdr_remote_domain_event_wakeup_msg }, }; enum virDrvOpenRemoteFlags { @@ -3677,6 +3686,29 @@ remoteDomainBuildEventTrayMoved(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, } +static void +remoteDomainBuildEventWakeup(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, + virNetClientPtr client ATTRIBUTE_UNUSED, + void *evdata, void *opaque) +{ + virConnectPtr conn = opaque; + struct private_data *priv = conn->privateData; + remote_domain_event_wakeup_msg *msg = evdata; + virDomainPtr dom; + virDomainEventPtr event = NULL; + + dom = get_nonnull_domain(conn, msg->dom); + if (!dom) + return; + + event = virDomainEventWakeupNewFromDom(dom); + + virDomainFree(dom); + + remoteDomainEventQueue(priv, event); +} + + static virDrvOpenStatus ATTRIBUTE_NONNULL (1) remoteSecretOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags) diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 73e554c..5695fa2 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2184,6 +2184,10 @@ struct remote_domain_event_tray_moved_msg { unsigned int trayOpened; }; +struct remote_domain_event_wakeup_msg { + remote_nonnull_domain dom; +}; + struct remote_domain_managed_save_args { remote_nonnull_domain dom; unsigned int flags; @@ -2772,7 +2776,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_GET_METADATA = 265, /* autogen autogen */ REMOTE_PROC_DOMAIN_BLOCK_REBASE = 266, /* autogen autogen */ REMOTE_PROC_DOMAIN_PM_WAKEUP = 267, /* autogen autogen */ - REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED = 268 /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED = 268, /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_WAKEUP = 269 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index aad8654..2911610 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1653,8 +1653,11 @@ struct remote_domain_event_disk_change_msg { struct remote_domain_event_tray_moved_msg { remote_nonnull_domain dom; remote_nonnull_string devAlias; - U_int trayOpened; -} + u_int trayOpened; +}; +struct remote_domain_event_wakeup_msg { + remote_nonnull_domain dom; +}; struct remote_domain_managed_save_args { remote_nonnull_domain dom; u_int flags; -- 1.7.1

This patch introduces a new event type for the QMP event SUSPEND: VIR_DOMAIN_EVENT_ID_SUSPEND The event doesn't take any data. Thus the callback definition is: typedef void (*virConnectDomainEventSuspendCallback)(virConnectPtr conn, virDomainPtr dom, void *opaque); --- daemon/remote.c | 23 +++++++++ examples/domain-events/events-c/event-test.c | 21 ++++++++- examples/domain-events/events-python/event-test.py | 4 ++ include/libvirt/libvirt.h.in | 16 +++++++ python/libvirt-override-virConnect.py | 9 ++++ python/libvirt-override.c | 48 ++++++++++++++++++++ src/conf/domain_event.c | 28 +++++++++++ src/conf/domain_event.h | 2 + src/libvirt_private.syms | 6 ++- src/qemu/qemu_monitor.c | 12 +++++ src/qemu/qemu_monitor.h | 3 + src/qemu/qemu_monitor_json.c | 9 ++++ src/qemu/qemu_process.c | 22 +++++++++ src/remote/remote_driver.c | 32 +++++++++++++ src/remote/remote_protocol.x | 7 +++- src/remote_protocol-structs | 3 + 16 files changed, 240 insertions(+), 5 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 548faab..6a48456 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -559,6 +559,28 @@ static int remoteRelayDomainEventWakeup(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int remoteRelayDomainEventSuspend(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque) { + virNetServerClientPtr client = opaque; + remote_domain_event_suspend_msg data; + + if (!client) + return -1; + + VIR_DEBUG("Relaying domain %s %d system suspend", dom->name, dom->id); + + /* build return data */ + memset(&data, 0, sizeof data); + make_nonnull_domain(&data.dom, dom); + + remoteDispatchDomainEventSend(client, remoteProgram, + REMOTE_PROC_DOMAIN_EVENT_SUSPEND, + (xdrproc_t)xdr_remote_domain_event_suspend_msg, &data); + + return 0; +} + static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventLifecycle), @@ -573,6 +595,7 @@ static virConnectDomainEventGenericCallback domainEventCallbacks[] = { VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventDiskChange), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventTrayMoved), VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventWakeup), + VIR_DOMAIN_EVENT_CALLBACK(remoteRelayDomainEventSuspend), }; verify(ARRAY_CARDINALITY(domainEventCallbacks) == VIR_DOMAIN_EVENT_ID_LAST); diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index 15cf5b3..1629358 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -334,6 +334,15 @@ static int myDomainEventWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return 0; } +static int myDomainEventSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque ATTRIBUTE_UNUSED) +{ + printf("%s EVENT: Domain %s(%d) system suspend", + __func__, virDomainGetName(dom), virDomainGetID(dom)); + return 0; +} + static void myFreeFunc(void *opaque) { char *str = opaque; @@ -371,6 +380,7 @@ int main(int argc, char **argv) int callback9ret = -1; int callback10ret = -1; int callback11ret = -1; + int callback12ret = -1; struct sigaction action_stop; memset(&action_stop, 0, sizeof action_stop); @@ -450,7 +460,12 @@ int main(int argc, char **argv) NULL, VIR_DOMAIN_EVENT_ID_WAKEUP, VIR_DOMAIN_EVENT_CALLBACK(myDomainEventWakeupCallback), - strdup("system wakeup"), myFreeFunc); + strdup("wakeup"), myFreeFunc); + callback12ret = virConnectDomainEventRegisterAny(dconn, + NULL, + VIR_DOMAIN_EVENT_ID_SUSPEND, + VIR_DOMAIN_EVENT_CALLBACK(myDomainEventSuspendCallback), + strdup("suspend"), myFreeFunc); if ((callback1ret != -1) && (callback2ret != -1) && @@ -461,7 +476,8 @@ int main(int argc, char **argv) (callback7ret != -1) && (callback9ret != -1) && (callback10ret != -1) && - (callback11ret != -1)) { + (callback11ret != -1) && + (callback12ret != -1)) { if (virConnectSetKeepAlive(dconn, 5, 3) < 0) { virErrorPtr err = virGetLastError(); fprintf(stderr, "Failed to start keepalive protocol: %s\n", @@ -488,6 +504,7 @@ int main(int argc, char **argv) virConnectDomainEventDeregisterAny(dconn, callback9ret); virConnectDomainEventDeregisterAny(dconn, callback10ret); virConnectDomainEventDeregisterAny(dconn, callback11ret); + virConnectDomainEventDeregisterAny(dconn, callback12ret); if (callback8ret != -1) virConnectDomainEventDeregisterAny(dconn, callback8ret); } diff --git a/examples/domain-events/events-python/event-test.py b/examples/domain-events/events-python/event-test.py index d70ab0a..7698541 100644 --- a/examples/domain-events/events-python/event-test.py +++ b/examples/domain-events/events-python/event-test.py @@ -480,6 +480,9 @@ def myDomainEventTrayMovedCallback(conn, dom, devAlias, trayOpened, opaque): def myDomainEventWakeupCallback(conn, dom, opaque): print "myDomainEventWakeupCallback: Domain %s(%s) system wakeup" % ( dom.name(), dom.ID()) +def myDomainEventSystemCallback(conn, dom, opaque): + print "myDomainEventSuspendCallback: Domain %s(%s) system suspend" % ( + dom.name(), dom.ID()) def usage(out=sys.stderr): print >>out, "usage: "+os.path.basename(sys.argv[0])+" [-hdl] [uri]" print >>out, " uri will default to qemu:///system" @@ -540,6 +543,7 @@ def main(): vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_DISK_CHANGE, myDomainEventDiskChangeCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_TRAY_MOVED, myDomainEventTrayMovedCallback, None) vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_WAKEUP, myDomainEventWakeupCallback, None) + vc.domainEventRegisterAny(None, libvirt.VIR_DOMAIN_EVENT_ID_SUSPEND, myDomainEventSuspendCallback, None) vc.setKeepAlive(5, 3) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 775a0c7..aa02bcb 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -3677,6 +3677,21 @@ typedef void (*virConnectDomainEventWakeupCallback)(virConnectPtr conn, virDomainPtr dom, void *opaque); +/** + * virConnectDomainEventSuspendCallback: + * @conn: connection object + * @dom: domain on which the event occurred + * @opaque: application specified data + * + * This callback occurs when the guest is waken up. + * + * The callback signature to use when registering for an event of type + * VIR_DOMAIN_EVENT_ID_SUSPEND with virConnectDomainEventRegisterAny() + */ +typedef void (*virConnectDomainEventSuspendCallback)(virConnectPtr conn, + virDomainPtr dom, + void *opaque); + /** * VIR_DOMAIN_EVENT_CALLBACK: @@ -3700,6 +3715,7 @@ typedef enum { VIR_DOMAIN_EVENT_ID_DISK_CHANGE = 9, /* virConnectDomainEventDiskChangeCallback */ VIR_DOMAIN_EVENT_ID_TRAY_MOVED = 10, /* virConnectDomainEventTrayMovedCallback */ VIR_DOMAIN_EVENT_ID_WAKEUP = 11, /* virConnectDomainEventWakeupCallback */ + VIR_DOMAIN_EVENT_ID_SUSPEND = 12, /* virConnectDomainEventSuspendCallback */ #ifdef VIR_ENUM_SENTINELS /* diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py index 323bb18..d8d195f 100644 --- a/python/libvirt-override-virConnect.py +++ b/python/libvirt-override-virConnect.py @@ -152,6 +152,15 @@ cb(self, virDomain(self, _obj=dom), opaque) return 0; + def _dispatchDomainEventSuspendCallback(self, dom, cbData): + """Dispatches event to python user domain suspend event callbacks + """ + cb = cbData["cb"] + opaque = cbData["opaque"] + + cb(self, virDomain(self, _obj=dom), opaque) + return 0; + def domainEventDeregisterAny(self, callbackID): """Removes a Domain Event Callback. De-registering for a domain callback will disable delivery of this event type """ diff --git a/python/libvirt-override.c b/python/libvirt-override.c index 3b439a4..d76bc81 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -5019,6 +5019,51 @@ libvirt_virConnectDomainEventWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED, return ret; } +static int +libvirt_virConnectDomainEventSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + void *opaque) +{ + PyObject *pyobj_cbData = (PyObject*)opaque; + PyObject *pyobj_dom; + PyObject *pyobj_ret; + PyObject *pyobj_conn; + PyObject *dictKey; + int ret = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + /* Create a python instance of this virDomainPtr */ + virDomainRef(dom); + + pyobj_dom = libvirt_virDomainPtrWrap(dom); + Py_INCREF(pyobj_cbData); + + dictKey = libvirt_constcharPtrWrap("conn"); + pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey); + Py_DECREF(dictKey); + + /* Call the Callback Dispatcher */ + pyobj_ret = PyObject_CallMethod(pyobj_conn, + (char*)"_dispatchDomainEventSuspendCallback", + (char*)"OO", + pyobj_dom, + pyobj_cbData); + + Py_DECREF(pyobj_cbData); + Py_DECREF(pyobj_dom); + + if(!pyobj_ret) { + DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret); + PyErr_Print(); + } else { + Py_DECREF(pyobj_ret); + ret = 0; + } + + LIBVIRT_RELEASE_THREAD_STATE; + return ret; +} + static PyObject * libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) @@ -5085,6 +5130,9 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self, case VIR_DOMAIN_EVENT_ID_WAKEUP: cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventWakeupCallback); break; + case VIR_DOMAIN_EVENT_ID_SUSPEND: + cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventSuspendCallback); + break; } if (!cb) { diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 956d3c2..3bf6088 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -1121,6 +1121,30 @@ virDomainEventWakeupNewFromDom(virDomainPtr dom) return virDomainEventWakeupNew(dom->id, dom->name, dom->uuid); } +static virDomainEventPtr +virDomainEventSuspendNew(int id, const char *name, + unsigned char *uuid) +{ + virDomainEventPtr ev = + virDomainEventNewInternal(VIR_DOMAIN_EVENT_ID_SUSPEND, + id, name, uuid); + return ev; +} + +virDomainEventPtr +virDomainEventSuspendNewFromObj(virDomainObjPtr obj) +{ + return virDomainEventSuspendNew(obj->def->id, + obj->def->name, + obj->def->uuid); +} + +virDomainEventPtr +virDomainEventSuspendNewFromDom(virDomainPtr dom) +{ + return virDomainEventSuspendNew(dom->id, dom->name, dom->uuid); +} + /** * virDomainEventQueuePush: @@ -1256,6 +1280,10 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, (cb)(conn, dom, cbopaque); break; + case VIR_DOMAIN_EVENT_ID_SUSPEND: + (cb)(conn, dom, cbopaque); + break; + default: VIR_WARN("Unexpected event ID %d", event->eventID); break; diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h index 51b6570..d4155ac 100644 --- a/src/conf/domain_event.h +++ b/src/conf/domain_event.h @@ -122,6 +122,8 @@ virDomainEventPtr virDomainEventTrayMovedNewFromDom(virDomainPtr dom, unsigned int trayOpened); virDomainEventPtr virDomainEventWakeupNewFromObj(virDomainObjPtr obj); virDomainEventPtr virDomainEventWakeupNewFromDom(virDomainPtr dom); +virDomainEventPtr virDomainEventSuspendNewFromObj(virDomainObjPtr obj); +virDomainEventPtr virDomainEventSuspendNewFromDom(virDomainPtr dom); void virDomainEventFree(virDomainEventPtr event); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index e2e34ca..143e367 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -512,10 +512,12 @@ virDomainEventStateRegisterID; virDomainEventStateFree; virDomainEventStateNew; virDomainEventStateQueue; -virDomainEventWakeupNewFromDom; -virDomainEventWakeupNewFromObj; +virDomainEventSuspendNewFromDom; +virDomainEventSuspendNewFromObj; virDomainEventTrayMovedNewFromDom; virDomainEventTrayMovedNewFromObj; +virDomainEventWakeupNewFromDom; +virDomainEventWakeupNewFromObj; virDomainEventWatchdogNewFromDom; virDomainEventWatchdogNewFromObj; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index bf51bdd..564a6c0 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1065,6 +1065,18 @@ qemuMonitorEmitWakeup(qemuMonitorPtr mon) return ret; } +int +qemuMonitorEmitSuspend(qemuMonitorPtr mon) + +{ + int ret = -1; + VIR_DEBUG("mon=%p", mon); + + QEMU_MONITOR_CALLBACK(mon, ret, domainSuspend, mon->vm); + + return ret; +} + int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 08f1d7a..5d2ed7b 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -130,6 +130,8 @@ struct _qemuMonitorCallbacks { unsigned int trayOpened); int (*domainWakeup)(qemuMonitorPtr mon, virDomainObjPtr vm); + int (*domainSuspend)(qemuMonitorPtr mon, + virDomainObjPtr vm); }; @@ -202,6 +204,7 @@ int qemuMonitorEmitTrayMoved(qemuMonitorPtr mon, const char *devAlias, unsigned int trayOpened); int qemuMonitorEmitWakeup(qemuMonitorPtr mon); +int qemuMonitorEmitSuspend(qemuMonitorPtr mon); int qemuMonitorEmitBlockJob(qemuMonitorPtr mon, const char *diskAlias, int type, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 19cda44..d41818b 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -61,6 +61,7 @@ static void qemuMonitorJSONHandleVNCDisconnect(qemuMonitorPtr mon, virJSONValueP static void qemuMonitorJSONHandleBlockJob(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleTrayMoved(qemuMonitorPtr mon, virJSONValuePtr data); static void qemuMonitorJSONHandleWakeup(qemuMonitorPtr mon, virJSONValuePtr data); +static void qemuMonitorJSONHandleSuspend(qemuMonitorPtr mon, virJSONValuePtr data); static struct { const char *type; @@ -79,6 +80,7 @@ static struct { { "BLOCK_JOB_COMPLETED", qemuMonitorJSONHandleBlockJob, }, { "DEVICE_TRAY_MOVED", qemuMonitorJSONHandleTrayMoved, }, { "WAKEUP", qemuMonitorJSONHandleWakeup, }, + { "SUSPEND", qemuMonitorJSONHandleSuspend, }, }; @@ -752,6 +754,13 @@ qemuMonitorJSONHandleWakeup(qemuMonitorPtr mon, qemuMonitorEmitWakeup(mon); } +static void +qemuMonitorJSONHandleSuspend(qemuMonitorPtr mon, + virJSONValuePtr data ATTRIBUTE_UNUSED) +{ + qemuMonitorEmitSuspend(mon); +} + int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon, const char *cmd_str, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index de173bd..2cff63e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1079,6 +1079,27 @@ qemuProcessHandleWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, return 0; } +static int +qemuProcessHandleSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, + virDomainObjPtr vm) +{ + struct qemud_driver *driver = qemu_driver; + virDomainEventPtr event = NULL; + + virDomainObjLock(vm); + event = virDomainEventSuspendNewFromObj(vm); + + virDomainObjUnlock(vm); + + if (event) { + qemuDriverLock(driver); + qemuDomainEventQueue(driver, event); + qemuDriverUnlock(driver); + } + + return 0; +} + static qemuMonitorCallbacks monitorCallbacks = { .destroy = qemuProcessHandleMonitorDestroy, .eofNotify = qemuProcessHandleMonitorEOF, @@ -1094,6 +1115,7 @@ static qemuMonitorCallbacks monitorCallbacks = { .domainBlockJob = qemuProcessHandleBlockJob, .domainTrayMoved = qemuProcessHandleTrayMoved, .domainWakeup = qemuProcessHandleWakeup, + .domainSuspend = qemuProcessHandleSuspend, }; static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index dd68738..ace841f 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -248,6 +248,11 @@ remoteDomainBuildEventWakeup(virNetClientProgramPtr prog, virNetClientPtr client, void *evdata, void *opaque); +static void +remoteDomainBuildEventSuspend(virNetClientProgramPtr prog, + virNetClientPtr client, + void *evdata, void *opaque); + static virNetClientProgramEvent remoteDomainEvents[] = { { REMOTE_PROC_DOMAIN_EVENT_RTC_CHANGE, remoteDomainBuildEventRTCChange, @@ -297,6 +302,10 @@ static virNetClientProgramEvent remoteDomainEvents[] = { remoteDomainBuildEventWakeup, sizeof(remote_domain_event_wakeup_msg), (xdrproc_t)xdr_remote_domain_event_wakeup_msg }, + { REMOTE_PROC_DOMAIN_EVENT_SUSPEND, + remoteDomainBuildEventSuspend, + sizeof(remote_domain_event_suspend_msg), + (xdrproc_t)xdr_remote_domain_event_suspend_msg }, }; enum virDrvOpenRemoteFlags { @@ -3709,6 +3718,29 @@ remoteDomainBuildEventWakeup(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, } +static void +remoteDomainBuildEventSuspend(virNetClientProgramPtr prog ATTRIBUTE_UNUSED, + virNetClientPtr client ATTRIBUTE_UNUSED, + void *evdata, void *opaque) +{ + virConnectPtr conn = opaque; + struct private_data *priv = conn->privateData; + remote_domain_event_suspend_msg *msg = evdata; + virDomainPtr dom; + virDomainEventPtr event = NULL; + + dom = get_nonnull_domain(conn, msg->dom); + if (!dom) + return; + + event = virDomainEventSuspendNewFromDom(dom); + + virDomainFree(dom); + + remoteDomainEventQueue(priv, event); +} + + static virDrvOpenStatus ATTRIBUTE_NONNULL (1) remoteSecretOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int flags) diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 5695fa2..cd3e1d5 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -2188,6 +2188,10 @@ struct remote_domain_event_wakeup_msg { remote_nonnull_domain dom; }; +struct remote_domain_event_suspend_msg { + remote_nonnull_domain dom; +}; + struct remote_domain_managed_save_args { remote_nonnull_domain dom; unsigned int flags; @@ -2777,7 +2781,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_BLOCK_REBASE = 266, /* autogen autogen */ REMOTE_PROC_DOMAIN_PM_WAKEUP = 267, /* autogen autogen */ REMOTE_PROC_DOMAIN_EVENT_TRAY_MOVED = 268, /* autogen autogen */ - REMOTE_PROC_DOMAIN_EVENT_WAKEUP = 269 /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_WAKEUP = 269, /* autogen autogen */ + REMOTE_PROC_DOMAIN_EVENT_SUSPEND = 270 /* autogen autogen */ /* * Notice how the entries are grouped in sets of 10 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 2911610..6918397 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -1658,6 +1658,9 @@ struct remote_domain_event_tray_moved_msg { struct remote_domain_event_wakeup_msg { remote_nonnull_domain dom; }; +struct remote_domain_event_suspend_msg { + remote_nonnull_domain dom; +}; struct remote_domain_managed_save_args { remote_nonnull_domain dom; u_int flags; -- 1.7.1

This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. --- examples/domain-events/events-c/event-test.c | 3 +++ include/libvirt/libvirt.h.in | 2 ++ src/qemu/qemu_process.c | 23 +++++++++++++++++++++++ tools/virsh.c | 2 ++ 4 files changed, 30 insertions(+), 0 deletions(-) diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index 1629358..9231604 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -115,6 +115,9 @@ static const char *eventDetailToString(int event, int detail) { case VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT: ret = "Snapshot"; break; + case VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND: + ret = "Event suspend"; + break; } break; case VIR_DOMAIN_EVENT_RESUMED: diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index aa02bcb..11b7388 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -145,6 +145,7 @@ typedef enum { VIR_DOMAIN_PAUSED_WATCHDOG = 6, /* paused due to a watchdog event */ VIR_DOMAIN_PAUSED_FROM_SNAPSHOT = 7, /* paused after restoring from snapshot */ VIR_DOMAIN_PAUSED_SHUTTING_DOWN = 8, /* paused during shutdown process */ + VIR_DOMAIN_PAUSED_SUSPEND = 9, /* paused due to a suspend event */ #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_PAUSED_LAST @@ -2682,6 +2683,7 @@ typedef enum { VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG = 3, /* Suspended due to a watchdog firing */ VIR_DOMAIN_EVENT_SUSPENDED_RESTORED = 4, /* Restored from paused state file */ VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT = 5, /* Restored from paused snapshot */ + VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND = 6, /* Suspended due to a suspend event */ #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_SUSPENDED_LAST diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 2cff63e..19e6e03 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1085,10 +1085,33 @@ qemuProcessHandleSuspend(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { struct qemud_driver *driver = qemu_driver; virDomainEventPtr event = NULL; + virDomainEventPtr lifecycleEvent = NULL; virDomainObjLock(vm); event = virDomainEventSuspendNewFromObj(vm); + if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { + qemuDomainObjPrivatePtr priv = vm->privateData; + VIR_DEBUG("Transitioned guest %s to paused state due to " + "QMP suspend event", vm->def->name); + + virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, + VIR_DOMAIN_PAUSED_SUSPEND); + lifecycleEvent = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_SUSPENDED, + VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND); + + VIR_FREE(priv->lockState); + if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0) + VIR_WARN("Unable to release lease on %s", vm->def->name); + VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState)); + + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + VIR_WARN("Unable to save status on vm %s after suspend event", + vm->def->name); + } + } + virDomainObjUnlock(vm); if (event) { diff --git a/tools/virsh.c b/tools/virsh.c index aef050f..9063131 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -18628,6 +18628,8 @@ vshDomainStateReasonToString(int state, int reason) return N_("from snapshot"); case VIR_DOMAIN_PAUSED_SHUTTING_DOWN: return N_("shutting down"); + case VIR_DOMAIN_PAUSED_SUSPEND: + return N_("Event suspend"); case VIR_DOMAIN_PAUSED_UNKNOWN: case VIR_DOMAIN_PAUSED_LAST: ; -- 1.7.1

Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain? If not, perhaps a different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug). Paolo

On 03/11/2012 10:37 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain?
Ah, yes, I prohibited the situation waking up a domain which wasn't paused by SUSPEND event. But here I forgot it. If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment. But I'm interested in trying if "virsh resume" wakeup a domain pasued by SUSPEND event. Osier

Il 12/03/2012 06:13, Osier Yang ha scritto:
On 03/11/2012 10:37 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain?
Ah, yes, I prohibited the situation waking up a domain which wasn't paused by SUSPEND event. But here I forgot it.
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
From the patch:
+ qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("domain paused from guest side can't be resumed, " + "you might want to wakeup it")); goto endjob;
This is not an internal error. It should have a precise error code so that for example virsh can refer the user to dompmwakeup. Personally I think that using just "virsh suspend"/"virsh resume" would have been a fine user interface if you use the PAUSED state (with "virsh suspend --pm" for example). Then there would have been no need for "virsh dompmwakeup" at all. There is still time to change it, but it needs to be done quite soon. BTW, another thing to test is what happens if you send "virsh suspend" after putting the guest into S3. Paolo

On 03/12/2012 04:35 PM, Paolo Bonzini wrote:
Il 12/03/2012 06:13, Osier Yang ha scritto:
On 03/11/2012 10:37 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain?
Ah, yes, I prohibited the situation waking up a domain which wasn't paused by SUSPEND event. But here I forgot it.
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
From the patch:
+ qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("domain paused from guest side can't be resumed, " + "you might want to wakeup it")); goto endjob;
This is not an internal error. It should have a precise error code so that for example virsh can refer the user to dompmwakeup.
Yes, it was just a demo, I won't put it in the real code in the end, :-)
Personally I think that using just "virsh suspend"/"virsh resume" would have been a fine user interface if you use the PAUSED state (with "virsh suspend --pm" for example). Then there would have been no need for "virsh dompmwakeup" at all.
There is still time to change it, but it needs to be done quite soon.
No luck, the patches for dompmsuspend were submitted Jan 26 (7c74176), we already have a realease with it (0.9.10: Feb 13 2012).
BTW, another thing to test is what happens if you send "virsh suspend" after putting the guest into S3.
The guest behaves no difference in this case, but I'm thinking if we should prohibit a guest which was already put into s3 from guest side too, in case of the confusion. Yeah, I think we need to do that. Osier

Il 12/03/2012 10:46, Osier Yang ha scritto:
Then there would have been no need for "virsh dompmwakeup" at all.
There is still time to change it, but it needs to be done quite soon.
No luck, the patches for dompmsuspend were submitted Jan 26 (7c74176), we already have a realease with it (0.9.10: Feb 13 2012).
Yeah, but not for dompmwakeup right? Paolo

On 03/12/2012 01:13 PM, Osier Yang wrote:
On 03/11/2012 10:37 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain?
Ah, yes, I prohibited the situation waking up a domain which wasn't paused by SUSPEND event. But here I forgot it.
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
But I'm interested in trying if "virsh resume" wakeup a domain pasued by SUSPEND event.
Tried, and the guest paused by "pm-suspend" inside guest can't be waken up successfully using "virsh resume". (the guest actually is still paused, but "virsh resume" will change the domain status into "running"). That's not what we want. Osier

On 03/11/2012 11:13 PM, Osier Yang wrote:
On 03/11/2012 10:37 PM, Paolo Bonzini wrote:
Il 05/03/2012 11:25, Osier Yang ha scritto:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND. ---
Does "virsh resume" correctly wakeup such a domain?
Ah, yes, I prohibited the situation waking up a domain which wasn't paused by SUSPEND event. But here I forgot it.
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
But I'm interested in trying if "virsh resume" wakeup a domain pasued by SUSPEND event.
It won't. To wake up a guest in S3 suspension, you need the pmwakeup command, or else a timer or input device wakeup trigger. 'virsh resume' only wakes up a paused guest, not a power-management suspended guest. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

Il 12/03/2012 14:58, Eric Blake ha scritto:
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
But I'm interested in trying if "virsh resume" wakeup a domain pasued by SUSPEND event. It won't. To wake up a guest in S3 suspension, you need the pmwakeup command, or else a timer or input device wakeup trigger. 'virsh resume' only wakes up a paused guest, not a power-management suspended guest.
Also considering the autowakeup, I think PAUSED is the wrong state for a pm-suspended domain. It should just stay RUNNING. Paolo

On 03/12/2012 08:07 AM, Paolo Bonzini wrote:
Il 12/03/2012 14:58, Eric Blake ha scritto:
If not, perhaps a
different state should be added so that "virsh resume" can look at the state and issue the appropriate monitor command (or alternatively, it could be considered a QEMU bug).
We have the paused reason. And the patch which should be squashed in in the attachment.
But I'm interested in trying if "virsh resume" wakeup a domain pasued by SUSPEND event. It won't. To wake up a guest in S3 suspension, you need the pmwakeup command, or else a timer or input device wakeup trigger. 'virsh resume' only wakes up a paused guest, not a power-management suspended guest.
Also considering the autowakeup, I think PAUSED is the wrong state for a pm-suspended domain. It should just stay RUNNING.
Either it stays RUNNING (because we add no new states), or we add a new state (perhaps PMSUSPEND), and leave the new state when we receive the event telling us that an autowakeup occurred. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

On 03/05/2012 03:25 AM, Osier Yang wrote:
This introduces a new paused reason VIR_DOMAIN_PAUSED_SUSPEND, and new suspend event type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
While a SUSPEND event occurs, the running domain status will be transferred to "paused" with reason "VIR_DOMAIN_PAUSED_SUSPEND", and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_SUSPENDED_SUSPEND.
NACK. VIR_DOMAIN_EVENT_SUSPENDED_* is reserved for events where the domain is in a paused state, due to virDomainSuspend. We need a _new_ state (perhaps named pmsuspend), along with a new prefix for events that move us into this new state (so far, we know of guest-agent S3 requests that move us into this state, and pmwakeup that moves us out of this state), since the state is very much distinct from libvirt's notion of suspended (which really means paused). -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org

This introduces a new running reason VIR_DOMAIN_RUNNING_WAKEUP, and new suspend event type VIR_DOMAIN_EVENT_STARTED_WAKEUP. While a wakeup event is emitted, the domain which was paused with reason VIR_DOMAIN_PAUSED_SUSPEND will be transferred to "running" with reason VIR_DOMAIN_RUNNING_WAKEUP, and a new domain lifecycle event emitted with type VIR_DOMAIN_EVENT_STARTED_WAKEUP. --- examples/domain-events/events-c/event-test.c | 3 ++ include/libvirt/libvirt.h.in | 2 + src/qemu/qemu_process.c | 30 ++++++++++++++++++++++++- tools/virsh.c | 2 + 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index 9231604..79a89b0 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -93,6 +93,9 @@ static const char *eventDetailToString(int event, int detail) { case VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT: ret = "Snapshot"; break; + case VIR_DOMAIN_EVENT_STARTED_WAKEUP: + ret = "Event wakeup"; + break; } break; case VIR_DOMAIN_EVENT_SUSPENDED: diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 11b7388..7c8c820 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -121,6 +121,7 @@ typedef enum { VIR_DOMAIN_RUNNING_UNPAUSED = 5, /* returned from paused state */ VIR_DOMAIN_RUNNING_MIGRATION_CANCELED = 6, /* returned from migration */ VIR_DOMAIN_RUNNING_SAVE_CANCELED = 7, /* returned from failed save process */ + VIR_DOMAIN_RUNNING_WAKEUP = 8, /* returned due to a wakeup event */ #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_RUNNING_LAST @@ -2665,6 +2666,7 @@ typedef enum { VIR_DOMAIN_EVENT_STARTED_MIGRATED = 1, /* Incoming migration from another host */ VIR_DOMAIN_EVENT_STARTED_RESTORED = 2, /* Restored from a state file */ VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT = 3, /* Restored from snapshot */ + VIR_DOMAIN_EVENT_STARTED_WAKEUP = 4, /* Started due to a wakeup event */ #ifdef VIR_ENUM_SENTINELS VIR_DOMAIN_EVENT_STARTED_LAST diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 19e6e03..c75067d 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1064,15 +1064,41 @@ qemuProcessHandleWakeup(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { struct qemud_driver *driver = qemu_driver; virDomainEventPtr event = NULL; + virDomainEventPtr lifecycleEvent = NULL; + int reason; + virDomainObjLock(vm); event = virDomainEventWakeupNewFromObj(vm); virDomainObjUnlock(vm); - if (event) { + /* Don't set domain status back to running if it wasn't paused + * from guest side, otherwise it can just cause confusion. + */ + if ((virDomainObjGetState(vm, &reason) == VIR_DOMAIN_PAUSED) && + (reason == VIR_DOMAIN_PAUSED_SUSPEND)) { + VIR_DEBUG("Transitioned guest %s to running state due to " + "QMP wakeup event", vm->def->name); + + virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, + VIR_DOMAIN_RUNNING_WAKEUP); + lifecycleEvent = virDomainEventNewFromObj(vm, + VIR_DOMAIN_EVENT_STARTED, + VIR_DOMAIN_EVENT_STARTED_WAKEUP); + + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { + VIR_WARN("Unable to save status on vm %s after wakeup event", + vm->def->name); + } + } + + if (event || lifecycleEvent) { qemuDriverLock(driver); - qemuDomainEventQueue(driver, event); + if (event) + qemuDomainEventQueue(driver, event); + if (lifecycleEvent) + qemuDomainEventQueue(driver, lifecycleEvent); qemuDriverUnlock(driver); } diff --git a/tools/virsh.c b/tools/virsh.c index 9063131..09e3290 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -18596,6 +18596,8 @@ vshDomainStateReasonToString(int state, int reason) return N_("migration canceled"); case VIR_DOMAIN_RUNNING_SAVE_CANCELED: return N_("save canceled"); + case VIR_DOMAIN_RUNNING_WAKEUP: + return N_("event wakeup"); case VIR_DOMAIN_RUNNING_UNKNOWN: case VIR_DOMAIN_RUNNING_LAST: ; -- 1.7.1

ping! On 2012年03月05日 18:25, Osier Yang wrote:
This patch series adds support for 3 new QMP events: WAKEUP, SUSPEND, and DEVICE_TRAY_MOVED, and related changes on domain's conf and status.
[1/9] Add support for tray moved event
[2/9] ~ [5/9]: New attribute "tray" is added to disk target, it indicates the tray status of removable disk, i.e. CDROM and Floppy disks, its value could be either of "open" or "closed", defaults to "closed", and a removable disk with tray == "open" won't have the source when domain is started. The value of "tray" will be updated while tray moved event is emitted from guest. Prior to these patches, if the user ejected the medium of removable disk from guest side, and then do migration or save/restoring, the guest will still starts the medium source ,and thus the medium will still exists in guest, which is strange. These patches fix it.
[6/9] + [8/9]: Add support for wakeup event, and update the domain status to paused if the domain is running, while the wakeup event is emitted.
[7/9] + [9/9]: Add support for suspend event, and update the domain status to running if the domain was paused by suspend event, while the suspend event is emitted.
Osier Yang(9) Add support for event tray moved of removable disks docs: Add documentation for new attribute tray of disk target conf: Parse and for the tray attribute qemu: Do not start with source for removable disks if tray is open qemu: Update tray status while tray moved event is emitted Add support for the wakeup event Add support for the event suspend qemu: Update domain status to paused while suspend event is emitted qemu: Update domain status to running while wakeup event is emitted
daemon/remote.c | 80 +++++++++++ docs/formatdomain.html.in | 13 ++- docs/schemas/domaincommon.rng | 8 + examples/domain-events/events-c/event-test.c | 61 ++++++++- examples/domain-events/events-python/event-test.py | 12 ++ include/libvirt/libvirt.h.in | 56 ++++++++ python/libvirt-override-virConnect.py | 27 ++++ python/libvirt-override.c | 146 ++++++++++++++++++++ src/conf/domain_conf.c | 33 +++++- src/conf/domain_conf.h | 9 ++ src/conf/domain_event.c | 117 ++++++++++++++++ src/conf/domain_event.h | 10 ++ src/libvirt_private.syms | 6 + src/qemu/qemu_command.c | 16 ++- src/qemu/qemu_monitor.c | 37 +++++ src/qemu/qemu_monitor.h | 14 ++ src/qemu/qemu_monitor_json.c | 37 +++++- src/qemu/qemu_process.c | 131 ++++++++++++++++++ src/remote/remote_driver.c | 98 +++++++++++++ src/remote/remote_protocol.x | 19 +++- src/remote_protocol-structs | 11 ++ tests/qemuxml2argvdata/qemuxml2argv-boot-cdrom.xml | 2 +- .../qemuxml2argv-boot-complex-bootindex.xml | 6 +- .../qemuxml2argvdata/qemuxml2argv-boot-complex.xml | 6 +- .../qemuxml2argvdata/qemuxml2argv-boot-floppy.xml | 2 +- ...uxml2argv-boot-menu-disable-drive-bootindex.xml | 2 +- .../qemuxml2argv-boot-menu-disable-drive.xml | 2 +- .../qemuxml2argv-boot-menu-disable.xml | 2 +- .../qemuxml2argv-boot-menu-enable.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-multi.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-boot-order.xml | 4 +- tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-aio.xml | 2 +- .../qemuxml2argv-disk-cdrom-empty.xml | 2 +- ...qemuxml2argv-disk-cdrom-tray-no-device-cap.args | 4 + .../qemuxml2argv-disk-cdrom-tray-no-device-cap.xml | 32 +++++ .../qemuxml2argv-disk-cdrom-tray.args | 10 ++ .../qemuxml2argv-disk-cdrom-tray.xml | 43 ++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-cdrom.xml | 2 +- .../qemuxml2argv-disk-copy_on_read.xml | 2 +- .../qemuxml2argv-disk-drive-boot-cdrom.xml | 2 +- .../qemuxml2argv-disk-drive-boot-disk.xml | 2 +- .../qemuxml2argv-disk-drive-cache-directsync.xml | 2 +- .../qemuxml2argv-disk-drive-cache-unsafe.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v1-wt.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-none.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wb.xml | 2 +- .../qemuxml2argv-disk-drive-cache-v2-wt.xml | 2 +- ...muxml2argv-disk-drive-error-policy-enospace.xml | 2 +- .../qemuxml2argv-disk-drive-error-policy-stop.xml | 2 +- ...rgv-disk-drive-error-policy-wreport-rignore.xml | 2 +- .../qemuxml2argv-disk-drive-fmt-qcow.xml | 2 +- .../qemuxml2argv-disk-drive-no-boot.xml | 4 +- .../qemuxml2argv-disk-drive-readonly-disk.xml | 2 +- .../qemuxml2argv-disk-drive-readonly-no-device.xml | 2 +- .../qemuxml2argv-disk-drive-shared.xml | 2 +- ...emuxml2argv-disk-floppy-tray-no-device-cap.args | 4 + ...qemuxml2argv-disk-floppy-tray-no-device-cap.xml | 37 +++++ .../qemuxml2argv-disk-floppy-tray.args | 10 ++ .../qemuxml2argv-disk-floppy-tray.xml | 37 +++++ .../qemuxml2argvdata/qemuxml2argv-disk-floppy.xml | 4 +- .../qemuxml2argv-disk-ioeventfd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-order.xml | 2 +- .../qemuxml2argv-disk-snapshot.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 2 +- .../qemuxml2argvdata/qemuxml2argv-disk-xenvbd.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-event_idx.xml | 2 +- .../qemuxml2argv-floppy-drive-fat.xml | 2 +- .../qemuxml2argv-graphics-spice-timeout.xml | 2 +- tests/qemuxml2argvdata/qemuxml2argv-lease.xml | 2 +- .../qemuxml2argv-net-bandwidth.xml | 2 +- tests/qemuxml2argvtest.c | 6 + .../qemuxml2xmlout-graphics-spice-timeout.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-ide-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-cdrom-scsi-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-2.xml | 8 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-3.xml | 4 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml | 2 +- tests/vmx2xmldata/vmx2xml-esx-in-the-wild-6.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-device.xml | 2 +- tests/vmx2xmldata/vmx2xml-floppy-file.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-1.xml | 2 +- tests/vmx2xmldata/vmx2xml-ws-in-the-wild-2.xml | 2 +- tools/virsh.c | 4 + 88 files changed, 1185 insertions(+), 79 deletions(-)
Regards, Osier
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
participants (4)
-
Daniel Veillard
-
Eric Blake
-
Osier Yang
-
Paolo Bonzini