[Libvirt-cim] [PATCH] Set additional properties of template RASDs

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Fri Oct 3 16:47:46 UTC 2008


# HG changeset patch
# User Kaitlin Rupert <karupert at us.ibm.com>
# Date 1223052389 25200
# Node ID 2952b0fb0fef8e77b34c04a779ac44b1d092876f
# Parent  7244474e5d2e118316e1636b06f99acb54062489
Set additional properties of template RASDs.

For Proc:
   -Set Limit and Weight

For Mem:
   -Set Limit - use same values set for VirtualQuantity

For Net:
   -Set address - get a default mac address

For Disk:
  -Set VirtualDevice, Address, and Mountpoint properties
  -For Xen, the default is xvda, which is accurate for paravirt, but not for full virt.

Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>

diff -r 7244474e5d2e -r 2952b0fb0fef src/Makefile.am
--- a/src/Makefile.am	Thu Oct 02 14:11:39 2008 -0700
+++ b/src/Makefile.am	Fri Oct 03 09:46:29 2008 -0700
@@ -131,12 +131,13 @@
                                         -lVirt_VSMigrationService \
                                         -lVirt_DevicePool
 
-libVirt_SettingsDefineCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la libVirt_VSMigrationCapabilities.la libVirt_VSMigrationSettingData.la
+libVirt_SettingsDefineCapabilities_la_DEPENDENCIES = libVirt_RASD.la libVirt_DevicePool.la libVirt_VSMigrationCapabilities.la libVirt_VSMigrationSettingData.la libVirt_VirtualSystemManagementService.la
 libVirt_SettingsDefineCapabilities_la_SOURCES = Virt_SettingsDefineCapabilities.c
 libVirt_SettingsDefineCapabilities_la_LIBADD = -lVirt_RASD \
                                                -lVirt_DevicePool \
                                                -lVirt_VSMigrationCapabilities \
-                                               -lVirt_VSMigrationSettingData
+                                               -lVirt_VSMigrationSettingData \
+                                               -lVirt_VirtualSystemManagementService
 
 libVirt_RegisteredProfile_la_SOURCES = Virt_RegisteredProfile.c
 
diff -r 7244474e5d2e -r 2952b0fb0fef src/Virt_SettingsDefineCapabilities.c
--- a/src/Virt_SettingsDefineCapabilities.c	Thu Oct 02 14:11:39 2008 -0700
+++ b/src/Virt_SettingsDefineCapabilities.c	Fri Oct 03 09:46:29 2008 -0700
@@ -46,6 +46,7 @@
 #include "Virt_RASD.h"
 #include "Virt_VSMigrationCapabilities.h"
 #include "Virt_VSMigrationSettingData.h"
+#include "Virt_VirtualSystemManagementService.h"
 
 const static CMPIBroker *_BROKER;
 
@@ -249,12 +250,38 @@
         return s;
 }
 
+static CMPIInstance *sdc_rasd_inst(CMPIStatus *s,
+                                   const CMPIObjectPath *ref,
+                                   uint16_t resource_type)
+{
+        CMPIInstance *inst = NULL;
+        const char *base = NULL;
+
+        if (rasd_classname_from_type(resource_type, &base) != CMPI_RC_OK) {
+                cu_statusf(_BROKER, s,
+                           CMPI_RC_ERR_FAILED,
+                           "Resource type not known");
+                goto out;
+        }
+
+        inst = get_typed_instance(_BROKER,
+                                  CLASSNAME(ref),
+                                  base,
+                                  NAMESPACE(ref));
+
+        CMSetProperty(inst, "ResourceType", &resource_type, CMPI_uint16);
+
+ out:
+        return inst;
+}
+
 static CMPIStatus mem_template(const CMPIObjectPath *ref,
                                int template_type,
-                               CMPIInstance *inst)
+                               struct inst_list *list)
 {
         uint64_t mem_size;
         const char *id;
+        CMPIInstance *inst;
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
         switch (template_type) {
@@ -281,11 +308,17 @@
                 goto out;
         }
 
+        inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_MEM); 
+
         CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);
         CMSetProperty(inst, "AllocationUnits", 
                       (CMPIValue *)"KiloBytes", CMPI_chars);
         CMSetProperty(inst, "VirtualQuantity", 
                       (CMPIValue *)&mem_size, CMPI_uint64);
+        CMSetProperty(inst, "Limit", 
+                      (CMPIValue *)&mem_size, CMPI_uint64);
+
+        inst_list_add(list, inst);
 
  out:
         return s;
@@ -316,30 +349,41 @@
 
 static CMPIStatus proc_template(const CMPIObjectPath *ref,
                                 int template_type,
-                                CMPIInstance *inst)
+                                struct inst_list *list)
 {
         bool ret;
         uint64_t num_procs;
+        uint64_t limit;
+        uint32_t weight;
         const char *id;
+        CMPIInstance *inst;
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
         switch (template_type) {
         case SDC_RASD_MIN:
                 num_procs = 0;
+                limit = 1;
+                weight = MIN_XEN_WEIGHT;
                 id = "Minimum";
                 break;
         case SDC_RASD_MAX:
                 ret = get_max_procs(ref, &num_procs, &s);
                 if (!ret)
                     goto out;
+                limit = 0;
+                weight = MAX_XEN_WEIGHT;
                 id = "Maximum";
                 break;
         case SDC_RASD_INC:
                 num_procs = 1;
+                limit = 50;
+                weight = INC_XEN_WEIGHT;
                 id = "Increment";
                 break;
         case SDC_RASD_DEF:
                 num_procs = 1;
+                limit = 0;
+                weight = DEFAULT_XEN_WEIGHT;
                 id = "Default";
                 break;
         default:
@@ -349,11 +393,21 @@
                 goto out;
         }
 
+        inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_PROC); 
+
         CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);
         CMSetProperty(inst, "AllocationUnits", 
                       (CMPIValue *)"Processors", CMPI_chars);
         CMSetProperty(inst, "VirtualQuantity", 
                       (CMPIValue *)&num_procs, CMPI_uint64);
+
+        if (STARTS_WITH(CLASSNAME(ref), "Xen")) {
+                CMSetProperty(inst, "Limit", (CMPIValue *)&limit, CMPI_uint64); 
+                CMSetProperty(inst, "Weight", 
+                              (CMPIValue *)&weight, CMPI_uint32); 
+        }
+
+        inst_list_add(list, inst);
 
  out:
         return s;
@@ -438,11 +492,13 @@
 
 static CMPIStatus net_template(const CMPIObjectPath *ref,
                                int template_type,
-                               CMPIInstance *inst)
+                               struct inst_list *list)
 {
         bool ret;
         uint64_t num_nics;
         const char *id;
+        const char *mac;
+        CMPIInstance *inst;
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
         switch (template_type) {
@@ -471,9 +527,22 @@
                 goto out;
         }
 
+        mac = _net_rand_mac(_BROKER);
+        if (mac == NULL) {
+                cu_statusf(_BROKER, &s,
+                           CMPI_RC_ERR_FAILED,
+                           "Unable to generate a MAC address");
+                goto out;
+        }
+
+        inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_NET); 
+
         CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);
         CMSetProperty(inst, "VirtualQuantity", 
                       (CMPIValue *)&num_nics, CMPI_uint64);
+        CMSetProperty(inst, "Address", (CMPIValue *)mac, CMPI_chars);
+
+        inst_list_add(list, inst);
 
  out:
         return s;
@@ -525,13 +594,64 @@
         return ret;
 }
 
+static CMPIStatus set_disk_props(int type,
+                                 const CMPIObjectPath *ref,
+                                 const char *id,
+                                 uint64_t disk_size,
+                                 struct inst_list *list)
+{
+        const char *addr;
+        const char *dev;
+        CMPIInstance *inst;
+        CMPIStatus s = {CMPI_RC_OK, NULL};
+
+        if (type == DOMAIN_LXC) {
+                addr = "/tmp";
+                dev = "/lxc_mnt/tmp";
+        }
+        else {
+                dev = "hda";
+                addr = "/dev/null";
+        }
+
+        inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_DISK);
+
+        CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);
+        CMSetProperty(inst, "AllocationQuantity",
+                      (CMPIValue *)"MegaBytes", CMPI_chars);
+        CMSetProperty(inst, "VirtualQuantity",
+                      (CMPIValue *)&disk_size, CMPI_uint64);
+        CMSetProperty(inst, "Address", (CMPIValue *)addr, CMPI_chars);
+
+        if (type == DOMAIN_LXC)
+                CMSetProperty(inst, "MountPoint", (CMPIValue *)dev, CMPI_chars);
+        else {
+                if (type == DOMAIN_XENPV) {
+                        dev = "xvda";
+                        CMSetProperty(inst, "Caption",
+                                      (CMPIValue *)"PV disk", CMPI_chars);
+                } else if (type, DOMAIN_XENFV) {
+                        CMSetProperty(inst, "Caption",
+                                      (CMPIValue *)"FV disk", CMPI_chars);
+                }
+
+                CMSetProperty(inst, "VirtualDevice",
+                              (CMPIValue *)dev, CMPI_chars);
+        }
+
+        inst_list_add(list, inst);
+
+        return s;
+}
+
 static CMPIStatus disk_template(const CMPIObjectPath *ref,
                                 int template_type,
-                                CMPIInstance *inst)
+                                struct inst_list *list)
 {
         bool ret;
+        char *pfx;
+        const char *id;
         uint64_t disk_size;
-        const char *id;
         CMPIStatus s = {CMPI_RC_OK, NULL};
 
         switch(template_type) {
@@ -560,57 +680,27 @@
                 goto out;
         }
 
-        CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars);
-        CMSetProperty(inst, "AllocationQuantity", 
-                      (CMPIValue *)"MegaBytes", CMPI_chars);
-        CMSetProperty(inst, "VirtualQuantity", 
-                      (CMPIValue *)&disk_size, CMPI_uint64);
+        pfx = class_prefix_name(CLASSNAME(ref));
+
+        if (STREQ(pfx, "Xen")) {
+                s = set_disk_props(DOMAIN_XENPV, ref, id, disk_size, list); 
+                
+                if (s.rc != CMPI_RC_OK)
+                       goto out;
+
+                s = set_disk_props(DOMAIN_XENFV, ref, id, disk_size, list); 
+        } else if (STREQ(pfx, "KVM")) {
+                s = set_disk_props(DOMAIN_KVM, ref, id, disk_size, list); 
+        } else if (STREQ(pfx, "LXC")) {
+                s = set_disk_props(DOMAIN_LXC, ref, id, disk_size, list); 
+        } else {
+                cu_statusf(_BROKER, &s, 
+                            CMPI_RC_ERR_FAILED,
+                           "Unsupported virtualization type");
+       }
 
  out:
         return s;
-}
-
-static CMPIInstance *sdc_rasd_inst(CMPIStatus *s,
-                                   const CMPIObjectPath *ref,
-                                   sdc_rasd_type type,
-                                   uint16_t resource_type)
-{
-        CMPIInstance *inst = NULL;
-        const char *base = NULL;
-
-        if (rasd_classname_from_type(resource_type, &base) != CMPI_RC_OK) {
-                cu_statusf(_BROKER, s, 
-                           CMPI_RC_ERR_FAILED,
-                           "Resource type not known");
-                goto out;
-        }
-
-        inst = get_typed_instance(_BROKER,
-                                  CLASSNAME(ref),
-                                  base,
-                                  NAMESPACE(ref));
-
-        if (resource_type == CIM_RES_TYPE_MEM)
-                *s = mem_template(ref, type, inst);
-        else if (resource_type == CIM_RES_TYPE_PROC)
-                *s = proc_template(ref, type, inst);
-        else if (resource_type == CIM_RES_TYPE_NET)
-                *s = net_template(ref, type, inst);
-        else if (resource_type == CIM_RES_TYPE_DISK)
-                *s = disk_template(ref, type, inst);
-        else {
-                cu_statusf(_BROKER, s,
-                           CMPI_RC_ERR_FAILED,
-                           "Unsupported resource type");
-        }
-
-        if (s->rc != CMPI_RC_OK) 
-                goto out;
-
-        CMSetProperty(inst, "ResourceType", &resource_type, CMPI_uint16);
-
- out:
-        return inst;
 }
 
 static CMPIStatus sdc_rasds_for_type(const CMPIObjectPath *ref,
@@ -618,21 +708,26 @@
                                      uint16_t type)
 {
         CMPIStatus s = {CMPI_RC_OK, NULL};
-        CMPIInstance *inst;
         int i;
 
         for (i = SDC_RASD_MIN; i <= SDC_RASD_INC; i++) {
-                inst = sdc_rasd_inst(&s, ref, i, type);
+                if (type == CIM_RES_TYPE_MEM)
+                        s = mem_template(ref, i, list);
+                else if (type == CIM_RES_TYPE_PROC)
+                        s = proc_template(ref, i, list);
+                else if (type == CIM_RES_TYPE_NET)
+                        s = net_template(ref, i, list);
+                else if (type == CIM_RES_TYPE_DISK)
+                        s = disk_template(ref, i, list);
+                else {
+                        cu_statusf(_BROKER, &s,
+                                   CMPI_RC_ERR_FAILED,
+                                   "Unsupported resource type");
+                }
+
                 if (s.rc != CMPI_RC_OK) {
-                        CU_DEBUG("Problem getting inst");
+                        CU_DEBUG("Problem getting inst list");
                         goto out;
-                }
-                CU_DEBUG("Got inst");
-                if ((s.rc == CMPI_RC_OK) && (inst != NULL)) {
-                        inst_list_add(list, inst);
-                        CU_DEBUG("Added inst");
-                } else {
-                        CU_DEBUG("Inst is null, not added");
                 }
         }
                 
diff -r 7244474e5d2e -r 2952b0fb0fef src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c	Thu Oct 02 14:11:39 2008 -0700
+++ b/src/Virt_VirtualSystemManagementService.c	Fri Oct 03 09:46:29 2008 -0700
@@ -321,7 +321,7 @@
         return poolid;
 }
 
-static const char *_net_rand_mac(void)
+const char *_net_rand_mac(const CMPIBroker *broker)
 {
         int r;
         int ret;
@@ -344,7 +344,7 @@
         if (ret == -1)
                 goto out;
 
-        str = CMNewString(_BROKER, mac, &status);
+        str = CMNewString(broker, mac, &status);
         if ((str == NULL) || (status.rc != CMPI_RC_OK)) {
                 str = NULL;
                 CU_DEBUG("Failed to create string");
@@ -369,7 +369,7 @@
         const char *msg = NULL;
 
         if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK) {
-                val = _net_rand_mac();
+                val = _net_rand_mac(_BROKER);
                 if (val == NULL) {
                         msg = "Unable to generate a MAC address";
                         goto out;
diff -r 7244474e5d2e -r 2952b0fb0fef src/Virt_VirtualSystemManagementService.h
--- a/src/Virt_VirtualSystemManagementService.h	Thu Oct 02 14:11:39 2008 -0700
+++ b/src/Virt_VirtualSystemManagementService.h	Fri Oct 03 09:46:29 2008 -0700
@@ -19,8 +19,15 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
  */
 
+#define MIN_XEN_WEIGHT 1
+#define MAX_XEN_WEIGHT 65535
+#define INC_XEN_WEIGHT MAX_XEN_WEIGHT / 2 
+#define DEFAULT_XEN_WEIGHT 1024
+
 CMPIStatus get_vsms(const CMPIObjectPath *reference,
                     CMPIInstance **_inst,
                     const CMPIBroker *broker,
                     const CMPIContext *context,
                     bool is_get_inst);
+
+const char *_net_rand_mac(const CMPIBroker *broker);




More information about the Libvirt-cim mailing list