
# HG changeset patch # User Kaitlin Rupert <karupert@us.ibm.com> # Date 1248121657 25200 # Node ID 3976c5e9c8ace6b1c6d23d14ab80d5b737d6702f # Parent 5fad1c4642449d39d40c7f8c90b8e71371b90d58 Expose template RASDs that can be used for defining new storage volumes Also: -Change volume_template() to avail_volume_template() to distinguish from template RASDs that represent existing storage volumes in a pool vs the template RASDs that are used for creating a new storage volume within a given pool -Change disk_dev_or_pool_template() to disk_res_template() since it now handles more than existing storage volumes and disk pool templates. Signed-off-by: Kaitlin Rupert <karupert@us.ibm.com> diff -r 5fad1c464244 -r 3976c5e9c8ac src/Virt_SettingsDefineCapabilities.c --- a/src/Virt_SettingsDefineCapabilities.c Mon Jul 20 13:27:37 2009 -0700 +++ b/src/Virt_SettingsDefineCapabilities.c Mon Jul 20 13:27:37 2009 -0700 @@ -71,6 +71,7 @@ #define DEVICE_RASD 0 #define POOL_RASD 1 +#define NEW_VOL_RASD 2 static bool system_has_vt(virConnectPtr conn) { @@ -280,6 +281,10 @@ ret = rasd_classname_from_type(resource_type, &base); else if (rasd_type == POOL_RASD) ret = pool_rasd_classname_from_type(resource_type, &base); + else if (rasd_type == NEW_VOL_RASD) { + base = "StorageVolumeResourceAllocationSettingData"; + ret = 0; + } if (ret != CMPI_RC_OK) { cu_statusf(_BROKER, s, @@ -1023,10 +1028,76 @@ } #if VIR_USE_LIBVIRT_STORAGE -static CMPIStatus volume_template(const CMPIObjectPath *ref, - int template_type, - virStorageVolPtr volume_ptr, - struct inst_list *list) +static CMPIStatus new_volume_template(const CMPIObjectPath *ref, + int template_type, + virStoragePoolPtr poolptr, + struct inst_list *list) +{ + const char *id; + CMPIStatus s = {CMPI_RC_OK, NULL}; + int ret = 0; + struct virt_pool *pool = NULL; + CMPIInstance *inst = NULL; + int type = 0; + const char *path; + + switch(template_type) { + case SDC_RASD_MIN: + id = "New Storage Volume Minimum"; + break; + case SDC_RASD_MAX: + id = "New Storage Volume Maximum"; + break; + case SDC_RASD_INC: + id = "New Storage Volume Increment"; + break; + case SDC_RASD_DEF: + id = "New Storage Volume Default"; + break; + default: + cu_statusf(_BROKER, &s, + CMPI_RC_ERR_FAILED, + "Unsupported sdc_rasd type"); + goto out; + } + + ret = get_disk_pool(poolptr, &pool); + if (ret == 1) { + virt_set_status(_BROKER, &s, + CMPI_RC_ERR_FAILED, + virStoragePoolGetConnect(poolptr), + "Error getting referenced configuration"); + goto out; + } + + type = pool->pool_info.disk.pool_type; + if (type != DISK_POOL_DIR) { + CU_DEBUG("Image creation for this pool type is not supported"); + goto out; + } + + inst = sdc_rasd_inst(&s, ref, CIM_RES_TYPE_IMAGE, NEW_VOL_RASD); + if ((inst == NULL) || (s.rc != CMPI_RC_OK)) + goto out; + + CMSetProperty(inst, "InstanceID", (CMPIValue *)id, CMPI_chars); + CMSetProperty(inst, "Type", (CMPIValue *)&type, CMPI_uint16); + + path = "/var/lib/libvirt/images/"; + CMSetProperty(inst, "Path", (CMPIValue *)path, CMPI_chars); + + inst_list_add(list, inst); + + out: + cleanup_virt_pool(&pool); + + return s; +} + +static CMPIStatus avail_volume_template(const CMPIObjectPath *ref, + int template_type, + virStorageVolPtr volume_ptr, + struct inst_list *list) { char *pfx = NULL; const char *id; @@ -1163,6 +1234,10 @@ goto out; } + s = new_volume_template(ref, template_type, poolptr, list); + if (s.rc != CMPI_RC_OK) + goto out; + if ((numvols = virStoragePoolNumOfVolumes(poolptr)) == -1) { virt_set_status(_BROKER, &s, CMPI_RC_ERR_FAILED, @@ -1206,7 +1281,7 @@ goto out; } - s = volume_template(ref, template_type, volptr, list); + s = avail_volume_template(ref, template_type, volptr, list); virStorageVolFree(volptr); @@ -1388,9 +1463,9 @@ return s; } -static CMPIStatus disk_dev_or_pool_template(const CMPIObjectPath *ref, - int template_type, - struct inst_list *list) +static CMPIStatus disk_res_template(const CMPIObjectPath *ref, + int template_type, + struct inst_list *list) { CMPIStatus s = {CMPI_RC_OK, NULL}; CMPIInstance *inst; @@ -1421,7 +1496,7 @@ if (val) s = disk_pool_template(ref, template_type, list); - else + else s = disk_template(ref, template_type, list); out: @@ -1648,7 +1723,7 @@ else if (type == CIM_RES_TYPE_NET) s = net_dev_or_pool_template(ref, i, list); else if (type == CIM_RES_TYPE_DISK) - s = disk_dev_or_pool_template(ref, i, list); + s = disk_res_template(ref, i, list); else if (type == CIM_RES_TYPE_GRAPHICS) s = graphics_template(ref, i, list); else if (type == CIM_RES_TYPE_INPUT)