File 768_error.patch of Package libvirt-cim
# HG changeset patch
# User Dan Smith <danms@us.ibm.com>
# Date 1227560778 28800
# Node ID f21e9ebf0ad0573bf55be7c16a9d32a07d9ac899
# Parent 11147ca6980ce2d1999b600e316fd3c415f744b6
Make DefineSystem() and RequestStateChange() provide rich errors
This patch adds use of the new virt_set_status() function to a couple of
providers where it's likely to be the most effective. A DefineSystem()
call can fail for a variety of reasons, as can an attempt to change the
state of a guest. By pulling in the libvirt error message, we're much more
likely to be able to debug the issue from just the error message the CIM
client gets.
Signed-off-by: Dan Smith <danms@us.ibm.com>
Index: libvirt-cim-0.5.2/src/Virt_ComputerSystem.c
===================================================================
--- libvirt-cim-0.5.2.orig/src/Virt_ComputerSystem.c
+++ libvirt-cim-0.5.2/src/Virt_ComputerSystem.c
@@ -771,27 +771,39 @@ static void set_scheduler_params(virDoma
/* This composite operation may be supported as a flag to reboot */
-static int domain_reset(virDomainPtr dom)
+static CMPIStatus domain_reset(virDomainPtr dom)
{
int ret;
virConnectPtr conn = NULL;
char *xml = NULL;
+ CMPIStatus s = {CMPI_RC_OK, NULL};
conn = virDomainGetConnect(dom);
if (conn == NULL) {
CU_DEBUG("Unable to get connection from domain");
- return 1;
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Unable to get domain connection");
+ return s;
}
xml = virDomainGetXMLDesc(dom, 0);
if (xml == NULL) {
CU_DEBUG("Unable to retrieve domain XML");
- return 1;
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Unable to get domain definition");
+ return s;
}
ret = virDomainDestroy(dom);
- if (ret)
+ if (ret != 0) {
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to destroy domain");
goto out;
+ }
dom = virDomainLookupByName(virDomainGetConnect(dom),
virDomainGetName(dom));
@@ -799,8 +811,11 @@ static int domain_reset(virDomainPtr dom
if (dom == NULL) {
dom = virDomainDefineXML(conn, xml);
if (dom == NULL) {
- CU_DEBUG("Failed to define domain from XML");
- ret = 1;
+ CU_DEBUG("Failed to define domain from XML");
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to define domain");
goto out;
}
}
@@ -809,11 +824,16 @@ static int domain_reset(virDomainPtr dom
CU_DEBUG("Guest is now offline");
ret = virDomainCreate(dom);
+ if (ret != 0)
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Failed to start domain");
out:
free(xml);
- return ret;
+ return s;
}
static CMPIStatus start_domain(virDomainPtr dom)
@@ -828,9 +848,10 @@ static CMPIStatus start_domain(virDomain
}
if (virDomainCreate(dom) != 0) {
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Unable to start domain");
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to start domain");
return s;
}
@@ -842,7 +863,6 @@ static CMPIStatus start_domain(virDomain
static CMPIStatus state_change_enable(virDomainPtr dom, virDomainInfoPtr info)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
- int ret = 0;
switch (info->state) {
case VIR_DOMAIN_SHUTOFF:
@@ -851,7 +871,11 @@ static CMPIStatus state_change_enable(vi
break;
case VIR_DOMAIN_PAUSED:
CU_DEBUG("Unpause domain");
- ret = virDomainResume(dom);
+ if (virDomainResume(dom) != 0)
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to unpause domain");
break;
default:
CU_DEBUG("Cannot go to enabled state from %i", info->state);
@@ -860,18 +884,12 @@ static CMPIStatus state_change_enable(vi
"Invalid state transition");
};
- if (ret != 0)
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Domain Operation Failed");
-
return s;
}
static CMPIStatus state_change_disable(virDomainPtr dom, virDomainInfoPtr info)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
- int ret = 0;
info->state = adjust_state_xen(dom, info->state);
@@ -879,7 +897,11 @@ static CMPIStatus state_change_disable(v
case VIR_DOMAIN_RUNNING:
case VIR_DOMAIN_BLOCKED:
CU_DEBUG("Stop domain");
- ret = virDomainShutdown(dom);
+ if (virDomainShutdown(dom) != 0)
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to stop domain");
break;
default:
CU_DEBUG("Cannot go to disabled/shutdown state from %i",
@@ -889,18 +911,12 @@ static CMPIStatus state_change_disable(v
"Invalid state transition");
};
- if (ret != 0)
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Domain Operation Failed");
-
return s;
}
static CMPIStatus state_change_pause(virDomainPtr dom, virDomainInfoPtr info)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
- int ret = 0;
info->state = adjust_state_xen(dom, info->state);
@@ -908,7 +924,11 @@ static CMPIStatus state_change_pause(vir
case VIR_DOMAIN_RUNNING:
case VIR_DOMAIN_BLOCKED:
CU_DEBUG("Pause domain");
- ret = virDomainSuspend(dom);
+ if (virDomainSuspend(dom) != 0)
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to pause domain");
break;
default:
cu_statusf(_BROKER, &s,
@@ -916,18 +936,12 @@ static CMPIStatus state_change_pause(vir
"Domain not running");
};
- if (ret != 0)
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Domain Operation Failed");
-
return s;
}
static CMPIStatus state_change_reboot(virDomainPtr dom, virDomainInfoPtr info)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
- int ret = 0;
info->state = adjust_state_xen(dom, info->state);
@@ -936,7 +950,11 @@ static CMPIStatus state_change_reboot(vi
case VIR_DOMAIN_BLOCKED:
case VIR_DOMAIN_PAUSED:
CU_DEBUG("Reboot domain");
- ret = virDomainReboot(dom, 0);
+ if (virDomainReboot(dom, 0) != 0)
+ virt_set_status(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ virDomainGetConnect(dom),
+ "Unable to reboot domain");
break;
default:
cu_statusf(_BROKER, &s,
@@ -944,18 +962,12 @@ static CMPIStatus state_change_reboot(vi
"Domain not running");
};
- if (ret != 0)
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Domain Operation Failed");
-
return s;
}
static CMPIStatus state_change_reset(virDomainPtr dom, virDomainInfoPtr info)
{
CMPIStatus s = {CMPI_RC_OK, NULL};
- int ret = 0;
info->state = adjust_state_xen(dom, info->state);
@@ -964,7 +976,7 @@ static CMPIStatus state_change_reset(vir
case VIR_DOMAIN_BLOCKED:
case VIR_DOMAIN_PAUSED:
CU_DEBUG("Reset domain");
- ret = domain_reset(dom);
+ s = domain_reset(dom);
break;
default:
cu_statusf(_BROKER, &s,
@@ -972,11 +984,6 @@ static CMPIStatus state_change_reset(vir
"Domain not running");
};
- if (ret != 0)
- cu_statusf(_BROKER, &s,
- CMPI_RC_ERR_FAILED,
- "Domain Operation Failed");
-
return s;
}
Index: libvirt-cim-0.5.2/src/Virt_VirtualSystemManagementService.c
===================================================================
--- libvirt-cim-0.5.2.orig/src/Virt_VirtualSystemManagementService.c
+++ libvirt-cim-0.5.2/src/Virt_VirtualSystemManagementService.c
@@ -788,9 +788,10 @@ static CMPIInstance *connect_and_create(
dom = virDomainDefineXML(conn, xml);
if (dom == NULL) {
CU_DEBUG("Failed to define domain from XML");
- cu_statusf(_BROKER, s,
- CMPI_RC_ERR_FAILED,
- "Failed to create domain");
+ virt_set_status(_BROKER, s,
+ CMPI_RC_ERR_FAILED,
+ conn,
+ "Failed to define domain");
return NULL;
}