A number of operations are only valid when the corresponding object is in
a particular state. eg, you can only suspend a domain, if it is currently
running. We don't have a very consistent way of reporting this problem
across drivers, so this patch introduces a new error code for this situation
called VIR_ERR_INVALID_OPERATION. This code is intended to be used if the
operation is supported, but not applicable for the object at this time.
It updates the Xen and QEMU drivers to use this error code.
Daniel
diff -r 2e97361b7242 include/libvirt/virterror.h
--- a/include/libvirt/virterror.h Mon Apr 27 11:44:32 2009 +0100
+++ b/include/libvirt/virterror.h Mon Apr 27 12:12:23 2009 +0100
@@ -157,6 +157,7 @@ typedef enum {
VIR_ERR_INVALID_NODE_DEVICE,/* invalid node device object */
VIR_ERR_NO_NODE_DEVICE,/* node device not found */
VIR_ERR_NO_SECURITY_MODEL, /* security model not found */
+ VIR_ERR_OPERATION_INVALID, /* operation is not applicable at this time */
} virErrorNumber;
/**
diff -r 2e97361b7242 src/qemu_driver.c
--- a/src/qemu_driver.c Mon Apr 27 11:44:32 2009 +0100
+++ b/src/qemu_driver.c Mon Apr 27 12:12:23 2009 +0100
@@ -1325,7 +1325,7 @@ static int qemudStartVMDaemon(virConnect
FD_ZERO(&keepfd);
if (virDomainIsActive(vm)) {
- qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("VM is already active"));
return -1;
}
@@ -2214,7 +2214,7 @@ static int qemudDomainSuspend(virDomainP
goto cleanup;
}
if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -2267,7 +2267,7 @@ static int qemudDomainResume(virDomainPt
goto cleanup;
}
if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -2755,7 +2755,7 @@ static int qemudDomainSave(virDomainPtr
}
if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -2890,7 +2890,7 @@ static int qemudDomainSetVcpus(virDomain
}
if (virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT, "%s",
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s",
_("cannot change vcpu count of an active domain"));
goto cleanup;
}
@@ -2942,8 +2942,16 @@ qemudDomainPinVcpu(virDomainPtr dom,
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver);
- if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
+ if (!vm) {
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ virUUIDFormat(dom->uuid, uuidstr);
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_DOMAIN,
+ _("no domain with matching uuid '%s'"),
uuidstr);
+ goto cleanup;
+ }
+
+ if (!virDomainIsActive(vm)) {
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s",_("cannot pin vcpus on an inactive
domain"));
goto cleanup;
}
@@ -3003,8 +3011,16 @@ qemudDomainGetVcpus(virDomainPtr dom,
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
qemuDriverUnlock(driver);
- if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
+ if (!vm) {
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+ virUUIDFormat(dom->uuid, uuidstr);
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_DOMAIN,
+ _("no domain with matching uuid '%s'"),
uuidstr);
+ goto cleanup;
+ }
+
+ if (!virDomainIsActive(vm)) {
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s",_("cannot pin vcpus on an inactive
domain"));
goto cleanup;
}
@@ -3248,7 +3264,7 @@ static int qemudDomainRestore(virConnect
vm = virDomainFindByName(&driver->domains, def->name);
if (vm) {
if (virDomainIsActive(vm)) {
- qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_INVALID,
_("domain is already active as '%s'"),
vm->def->name);
goto cleanup;
} else {
@@ -3503,7 +3519,7 @@ static int qemudDomainUndefine(virDomain
}
if (virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot delete active domain"));
goto cleanup;
}
@@ -3900,7 +3916,7 @@ static int qemudDomainAttachDevice(virDo
if (!virDomainIsActive(vm)) {
qemuDriverUnlock(driver);
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot attach device on inactive
domain"));
goto cleanup;
}
@@ -4052,7 +4068,7 @@ static int qemudDomainDetachDevice(virDo
if (!virDomainIsActive(vm)) {
qemuDriverUnlock(driver);
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot detach device on inactive
domain"));
goto cleanup;
}
@@ -4212,7 +4228,7 @@ qemudDomainBlockStats (virDomainPtr dom,
goto cleanup;
}
if (!virDomainIsActive (vm)) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -4351,7 +4367,7 @@ qemudDomainInterfaceStats (virDomainPtr
}
if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -4497,7 +4513,7 @@ qemudDomainMemoryPeek (virDomainPtr dom,
}
if (!virDomainIsActive(vm)) {
- qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
@@ -4824,7 +4840,7 @@ qemudDomainMigratePerform (virDomainPtr
}
if (!virDomainIsActive(vm)) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+ qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("domain is not running"));
goto cleanup;
}
diff -r 2e97361b7242 src/virterror.c
--- a/src/virterror.c Mon Apr 27 11:44:32 2009 +0100
+++ b/src/virterror.c Mon Apr 27 12:12:23 2009 +0100
@@ -1018,6 +1018,12 @@ virErrorMsg(virErrorNumber error, const
else
errmsg = _("Security model not found: %s");
break;
+ case VIR_ERR_OPERATION_INVALID:
+ if (info == NULL)
+ errmsg = _("Requested operation is not valid");
+ else
+ errmsg = _("Requested operation is not valid: %s");
+ break;
}
return (errmsg);
}
diff -r 2e97361b7242 src/xen_internal.c
--- a/src/xen_internal.c Mon Apr 27 11:44:32 2009 +0100
+++ b/src/xen_internal.c Mon Apr 27 12:12:23 2009 +0100
@@ -1068,9 +1068,14 @@ xenHypervisorGetSchedulerType(virDomainP
}
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
- if (priv->handle < 0 || domain->id < 0) {
+ if (priv->handle < 0) {
virXenErrorFunc(domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
- "priv->handle or domain->id invalid", 0);
+ "priv->handle invalid", 0);
+ return NULL;
+ }
+ if (domain->id < 0) {
+ virXenError(domain->conn, VIR_ERR_OPERATION_INVALID,
+ "%s", _("domain is not running"));
return NULL;
}
@@ -1143,9 +1148,14 @@ xenHypervisorGetSchedulerParameters(virD
}
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
- if (priv->handle < 0 || domain->id < 0) {
+ if (priv->handle < 0) {
virXenErrorFunc(domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
- "priv->handle or domain->id invalid", 0);
+ "priv->handle invalid", 0);
+ return -1;
+ }
+ if (domain->id < 0) {
+ virXenError(domain->conn, VIR_ERR_OPERATION_INVALID,
+ "%s", _("domain is not running"));
return -1;
}
@@ -1241,9 +1251,14 @@ xenHypervisorSetSchedulerParameters(virD
}
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
- if (priv->handle < 0 || domain->id < 0) {
- virXenErrorFunc (domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
- "priv->handle or domain->id invalid", 0);
+ if (priv->handle < 0) {
+ virXenErrorFunc(domain->conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__,
+ "priv->handle invalid", 0);
+ return -1;
+ }
+ if (domain->id < 0) {
+ virXenError(domain->conn, VIR_ERR_OPERATION_INVALID,
+ "%s", _("domain is not running"));
return -1;
}
diff -r 2e97361b7242 src/xend_internal.c
--- a/src/xend_internal.c Mon Apr 27 11:44:32 2009 +0100
+++ b/src/xend_internal.c Mon Apr 27 12:12:23 2009 +0100
@@ -2970,7 +2970,7 @@ xenDaemonDomainSuspend(virDomainPtr doma
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -2997,7 +2997,7 @@ xenDaemonDomainResume(virDomainPtr domai
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -3025,7 +3025,7 @@ xenDaemonDomainShutdown(virDomainPtr dom
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -3054,7 +3054,7 @@ xenDaemonDomainReboot(virDomainPtr domai
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -3085,7 +3085,7 @@ xenDaemonDomainDestroy(virDomainPtr doma
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -3160,7 +3160,7 @@ xenDaemonDomainSave(virDomainPtr domain,
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
@@ -3197,7 +3197,7 @@ xenDaemonDomainCoreDump(virDomainPtr dom
}
if (domain->id < 0) {
- virXendError(domain->conn, VIR_ERR_INVALID_ARG,
+ virXendError(domain->conn, VIR_ERR_OPERATION_INVALID,
_("Domain %s isn't running."), domain->name);
return(-1);
}
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|