[Libvirt-cim] [PATCH 1 of 2] ComputerSystemDeletedIndication wasn't being called when a guest was removed. This patch fix it

Richard Maciel rmaciel at linux.vnet.ibm.com
Thu Aug 27 16:00:17 UTC 2009


# HG changeset patch
# User Richard Maciel <rmaciel at linux.vnet.ibm.com>
# Date 1251388779 10800
# Node ID 84de50fc3126ea6de453da4543d43b28539eff67
# Parent  7a5403380789571fca9496003461c45f23e18c2f
ComputerSystemDeletedIndication wasn't being called when a guest was removed. This patch fix it.

Added and exported a function from ComputerSystem, so the indication can create an instance of
the guest based on the domain structure stored.

#2:
  Improved status information return in set_instance_state function

Signed-off-by: Richard Maciel <rmaciel at linux.vnet.ibm.com>

diff -r 7a5403380789 -r 84de50fc3126 src/Virt_ComputerSystem.c
--- a/src/Virt_ComputerSystem.c	Thu Aug 20 17:16:24 2009 -0700
+++ b/src/Virt_ComputerSystem.c	Thu Aug 27 12:59:39 2009 -0300
@@ -439,6 +439,102 @@
         return 1;
 }
 
+static CMPIStatus set_properties_from_dominfo(const CMPIBroker *broker,
+                                              const char *prefix,
+                                              struct domain *dominfo,
+                                              CMPIInstance *instance)
+{
+        CMPIStatus s = {CMPI_RC_ERR_FAILED, NULL};
+        CMPIObjectPath *ref = NULL;
+
+        ref = CMGetObjectPath(instance, &s);
+        if ((ref == NULL) || (s.rc != CMPI_RC_OK))
+                return s;
+
+        CMSetProperty(instance, "Name",
+                      (CMPIValue *)dominfo->name, CMPI_chars);
+
+        CMSetProperty(instance, "ElementName",
+                      (CMPIValue *)dominfo->name, CMPI_chars);
+
+        CMSetProperty(instance, "UUID",
+                      (CMPIValue *)dominfo->uuid, CMPI_chars);
+
+        if (!set_capdesc_from_dominfo(broker, dominfo, ref, instance)) {
+                CU_DEBUG("Problem in set_capdesc_from_dominfo function");
+                cu_statusf(broker, &s, 
+                           CMPI_RC_FAILED, 
+                           "Could not set caption and description properties");
+                goto out;
+        }
+
+        /* We don't set state, because struct domain doesn't have that
+         * information */
+
+        if (!set_creation_class(instance)) {
+                CU_DEBUG("Problem in set_creation_class function");
+                cu_statusf(broker, &s,
+                           CMPI_RC_FAILED,
+                           "Could not set creation class");
+                goto out;
+        }
+
+        if (!set_other_id_info(broker, dominfo->uuid, prefix, instance)) {
+                CU_DEBUG("Problem in set_other_id_info function");
+                cu_statusf(broker, &s,
+                           CMPI_RC_FAILED,
+                           "Could not set other OtherIdentifyingInfo and "
+                           "IdentifyingDescription");
+                goto out;
+        }
+
+        cu_statusf(broker, &s,
+                   CMPI_RC_OK,
+                   "");
+
+ out:
+        return s;
+}
+
+CMPIStatus instance_from_dominfo(const CMPIBroker *broker,
+                                 const char *namespace,
+                                 const char *prefix,
+                                 struct domain *dominfo,
+                                 CMPIInstance **_inst)
+{
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+        CMPIInstance *inst = NULL;
+
+        inst = get_typed_instance(broker,
+                                  prefix,
+                                  "ComputerSystem",
+                                  namespace);
+
+        if (inst == NULL) {
+                CU_DEBUG("Could not init CS instance. "
+                         "typestr: %s, namespace: %s", prefix, namespace);
+                cu_statusf(broker, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Unable to init ComputerSystem instance");
+                goto out;
+        }
+       
+        s = set_properties_from_dominfo(broker,
+                                        prefix,
+                                        dominfo,
+                                        inst);
+        if (s.rc != CMPI_RC_OK) {
+                CU_DEBUG("Could not set instance properties");
+                goto out;
+        }
+
+        *_inst = inst;
+
+ out:
+        return s;
+
+}
+
 /* Populate an instance with information from a domain */
 static CMPIStatus set_properties(const CMPIBroker *broker,
                                  virDomainPtr dom,
diff -r 7a5403380789 -r 84de50fc3126 src/Virt_ComputerSystem.h
--- a/src/Virt_ComputerSystem.h	Thu Aug 20 17:16:24 2009 -0700
+++ b/src/Virt_ComputerSystem.h	Thu Aug 27 12:59:39 2009 -0300
@@ -22,6 +22,7 @@
 #define __VIRT_COMPUTERSYSTEM_H
 
 #include "misc_util.h"
+#include  "device_parsing.h"
 
 /**
  * Get a list of domain instances
@@ -62,6 +63,25 @@
                               const char *name,
                               CMPIInstance **_inst);
 
+/**
+ * Create a domain instance from the domain structure. Note that the instance
+ * doesn't necessarily represents an existing domain (can represent a deleted
+ * one, for instance)
+ *
+ * @param broker A pointer to the current broker
+ * @param namespace The namespace to used by the domain instance
+ * @param prefix The virtualization prefix (i.e. KVM, Xen, LXC)
+ * @param dominfo A pointer to the struct domain used to fill the instance
+ * @param _inst In case of success the pointer to the instance
+ * @returns CMPIStatus
+ */
+CMPIStatus instance_from_dominfo(const CMPIBroker *broker,
+                                 const char *namespace,
+                                 const char *prefix,
+                                 struct domain *dominfo,
+                                 CMPIInstance **_inst);
+
+
 #endif
 
 /*
diff -r 7a5403380789 -r 84de50fc3126 src/Virt_ComputerSystemIndication.c
--- a/src/Virt_ComputerSystemIndication.c	Thu Aug 20 17:16:24 2009 -0700
+++ b/src/Virt_ComputerSystemIndication.c	Thu Aug 27 12:59:39 2009 -0300
@@ -330,6 +330,41 @@
         return false;
 }
 
+static bool create_deleted_guest_inst(char *xml, 
+                                      char *namespace, 
+                                      char *prefix,
+                                      CMPIInstance **inst)
+{
+        bool rc = false;
+        struct domain *dominfo = NULL;
+        int res;
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+
+        res = get_dominfo_from_xml(xml, &dominfo);
+        if (res == 0) {
+                CU_DEBUG("failed to extract domain info from xml");
+                goto out;
+        }
+
+        s = instance_from_dominfo(_BROKER, 
+                                  namespace, 
+                                  prefix,
+                                  dominfo, 
+                                  inst); 
+        if (s.rc != CMPI_RC_OK) {
+                CU_DEBUG("instance from domain info error: %s", s.msg);
+                goto out;
+        }
+        /* Must set guest state */
+
+        rc = true;
+
+ out:
+        cleanup_dominfo(&dominfo);
+
+        return rc;
+}
+
 static bool async_ind(CMPIContext *context,
                       virConnectPtr conn,
                       int ind_type,
@@ -360,12 +395,27 @@
         cn = get_typed_class(prefix, "ComputerSystem");
 
         op = CMNewObjectPath(_BROKER, args->ns, cn, &s);
-        if ((s.rc != CMPI_RC_OK) || CMIsNullObject(op))
+        if ((s.rc != CMPI_RC_OK) || CMIsNullObject(op)) {
+                CU_DEBUG("op error");
                 goto out;
+        }
 
-        s = get_domain_by_name(_BROKER, op, name, &affected_inst);
-        if (s.rc != CMPI_RC_OK)
-                goto out;
+        if (ind_type == CS_CREATED || ind_type == CS_MODIFIED) {
+                s = get_domain_by_name(_BROKER, op, name, &affected_inst);
+                if (s.rc != CMPI_RC_OK) { 
+                        CU_DEBUG("domain by name error");
+                        goto out;
+                }
+        } else if (ind_type == CS_DELETED) {
+                rc = create_deleted_guest_inst(prev_dom.xml, 
+                                               args->ns, 
+                                               prefix, 
+                                               &affected_inst);
+                if (!rc) {
+                        CU_DEBUG("Could not recreate guest instance");
+                        goto out;
+                }
+        }
 
         /* FIXME: We are unable to get the previous CS instance after it has 
                   been modified. Consider keeping track of the previous




More information about the Libvirt-cim mailing list