
# HG changeset patch # User Dan Smith <danms@us.ibm.com> # Date 1200588334 28800 # Node ID 2c754c60bfa8c0749571f10d2d95c273ce972a33 # Parent 019c2959e758e9bbc71a3d7e489f16100857fc68 FullVirt changes to VSMS This includes checking the isFullVirt flag in Xen VSSDs, and assuming it for KVM. Also, support creating Xen-type bridge interfaces and KVM-type virtual network interfaces. Changes: - Updated IsFullVirt property name Signed-off-by: Dan Smith <danms@us.ibm.com> diff -r 019c2959e758 -r 2c754c60bfa8 src/Virt_VirtualSystemManagementService.c --- a/src/Virt_VirtualSystemManagementService.c Thu Jan 17 08:45:33 2008 -0800 +++ b/src/Virt_VirtualSystemManagementService.c Thu Jan 17 08:45:34 2008 -0800 @@ -127,12 +127,73 @@ static CMPIStatus define_system_parse_ar return s; } +static int xenpv_vssd_to_domain(CMPIInstance *inst, + struct domain *domain) +{ + int ret; + const char *val; + + domain->type = DOMAIN_XENPV; + + ret = cu_get_str_prop(inst, "Bootloader", &val); + if (ret != CMPI_RC_OK) + val = ""; + + free(domain->bootloader); + domain->bootloader = strdup(val); + + ret = cu_get_str_prop(inst, "BootloaderArgs", &val); + if (ret != CMPI_RC_OK) + val = ""; + + free(domain->bootloader_args); + domain->bootloader_args = strdup(val); + + return 1; +} + +static int fv_vssd_to_domain(CMPIInstance *inst, + struct domain *domain, + const char *pfx) +{ + int ret; + const char *val; + + if (STREQC(pfx, "KVM")) + domain->type = DOMAIN_KVM; + else if (STREQC(pfx, "Xen")) + domain->type = DOMAIN_XENFV; + else { + CU_DEBUG("Unknown fullvirt domain type: %s", pfx); + return 0; + } + + ret = cu_get_str_prop(inst, "BootDevice", &val); + if (ret != CMPI_RC_OK) + val = "hd"; + + free(domain->os_info.fv.boot); + domain->os_info.fv.boot = strdup(val); + + return 1; +} + static int vssd_to_domain(CMPIInstance *inst, struct domain *domain) { uint16_t tmp; int ret = 0; const char *val; + const char *cn; + char *pfx = NULL; + bool fullvirt; + + cn = CLASSNAME(CMGetObjectPath(inst, NULL)); + pfx = class_prefix_name(cn); + if (pfx == NULL) { + CU_DEBUG("Unknown prefix for class: %s", cn); + return 0; + } ret = cu_get_str_prop(inst, "VirtualSystemIdentifier", &val); if (ret != CMPI_RC_OK) @@ -153,23 +214,41 @@ static int vssd_to_domain(CMPIInstance * domain->on_crash = (int)tmp; - ret = cu_get_str_prop(inst, "Bootloader", &val); - if (ret != CMPI_RC_OK) - val = ""; - - free(domain->bootloader); - domain->bootloader = strdup(val); - - ret = cu_get_str_prop(inst, "BootloaderArgs", &val); - if (ret != CMPI_RC_OK) - val = ""; - - free(domain->bootloader_args); - domain->bootloader_args = strdup(val); - - ret = 1; - out: + if (STREQC(pfx, "KVM")) + fullvirt = true; + else if (cu_get_bool_prop(inst, "IsFullVirt", &fullvirt) != CMPI_RC_OK) + fullvirt = false; + + if (fullvirt) + ret = fv_vssd_to_domain(inst, domain, pfx); + else + ret = xenpv_vssd_to_domain(inst, domain); + + out: + free(pfx); + return ret; +} + +static int xen_net_rasd_to_vdev(CMPIInstance *inst, + struct virt_device *dev) +{ + free(dev->dev.net.type); + dev->dev.net.type = strdup("bridge"); + + return 1; +} + +static int kvm_net_rasd_to_vdev(CMPIInstance *inst, + struct virt_device *dev) +{ + free(dev->dev.net.type); + dev->dev.net.type = strdup("network"); + + free(dev->dev.net.source); + dev->dev.net.source = strdup("default"); + + return 1; } static int rasd_to_vdev(CMPIInstance *inst, @@ -211,11 +290,14 @@ static int rasd_to_vdev(CMPIInstance *in free(dev->dev.net.mac); dev->dev.net.mac = devid; - if (cu_get_str_prop(inst, "NetworkType", &val) != CMPI_RC_OK) - val = "bridge"; - - free(dev->dev.net.type); - dev->dev.net.type = strdup(val); + if (STARTS_WITH(CLASSNAME(op), "Xen")) + xen_net_rasd_to_vdev(inst, dev); + else if (STARTS_WITH(CLASSNAME(op), "KVM")) + kvm_net_rasd_to_vdev(inst, dev); + else + CU_DEBUG("Unknown class type for net device: %s", + CLASSNAME(op)); + } else if (type == VIRT_DEV_MEM) { cu_get_u64_prop(inst, "VirtualQuantity", &dev->dev.mem.size); cu_get_u64_prop(inst, "Reservation", &dev->dev.mem.size);