[Libvirt-cim] [PATCH 2 of 2] Make DefineSystem() and RequestStateChange() provide rich errors

Dan Smith danms at us.ibm.com
Mon Nov 24 18:36:48 UTC 2008


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1227551693 28800
# Node ID eb2994b2c5f955067d087b1a404d025351276a70
# Parent  af1c552b33cb473ed7ce52ddb6eb97b39b69b001
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 at us.ibm.com>

diff -r af1c552b33cb -r eb2994b2c5f9 src/Virt_ComputerSystem.c
--- a/src/Virt_ComputerSystem.c	Mon Nov 24 10:15:35 2008 -0800
+++ b/src/Virt_ComputerSystem.c	Mon Nov 24 10:34:53 2008 -0800
@@ -771,27 +771,39 @@
 
 
 /* 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 @@
         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 @@
             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 @@
         }
 
         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 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 @@
                 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 @@
                            "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 @@
         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 @@
                            "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 @@
         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 @@
                            "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 @@
         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 @@
                            "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,18 +976,13 @@
         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,
                            CMPI_RC_ERR_FAILED,
                            "Domain not running");
         };
-
-        if (ret != 0)
-                cu_statusf(_BROKER, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Domain Operation Failed");
 
         return s;
 }
diff -r af1c552b33cb -r eb2994b2c5f9 src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c	Mon Nov 24 10:15:35 2008 -0800
+++ b/src/Virt_VirtualSystemManagementService.c	Mon Nov 24 10:34:53 2008 -0800
@@ -831,9 +831,10 @@
         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;
         }
 




More information about the Libvirt-cim mailing list