
+static bool vcpu_instances(const CMPIBroker *broker, + const virDomainPtr dom, + const char *ns, + uint64_t proc_count, + struct inst_list *list) +{ + int i; + char *dev_id; + CMPIInstance *inst; + virConnectPtr conn; + + for (i = 0; i < proc_count; i++) { + conn = virDomainGetConnect(dom); + inst = get_typed_instance(broker, + pfx_from_conn(conn), + "Processor", + ns); + if (inst == NULL) + return false; + + dev_id = get_vcpu_inst_id(dom, i); + CMSetProperty(inst, "DeviceID", + (CMPIValue *)dev_id, CMPI_chars); + free(dev_id); + + device_set_systemname(inst, dom); + inst_list_add(list, inst); + }
Need to close the virConnectPtr here.
+ + return true; +} + +static bool device_instances(const CMPIBroker *broker, + struct virt_device *devs, + int count, + const virDomainPtr dom, + const char *ns, + struct inst_list *list) +{ + int i; + bool ret; + uint64_t proc_count = 0; + bool proc_found = false; + CMPIInstance *instance = NULL; + + for (i = 0; i < count; i++) { + struct virt_device *dev = &devs[i]; + + if (dev->type == CIM_RES_TYPE_NET) + instance = net_instance(broker, + &dev->dev.net, + dom, + ns); + else if (dev->type == CIM_RES_TYPE_DISK) + instance = disk_instance(broker, + &dev->dev.disk, + dom, + ns); + else if (dev->type == CIM_RES_TYPE_MEM) + instance = mem_instance(broker, + &dev->dev.mem, + dom, + ns); + else if (dev->type == CIM_RES_TYPE_PROC) { + proc_found = true;
proc_found isn't used anywhere else
+ proc_count = dev->dev.vcpu.quantity; + continue; + } else + return false; + + if (!instance) + return false; + + device_set_devid(instance, dev, dom); + device_set_systemname(instance, dom); + inst_list_add(list, instance); + } + + if (proc_count) { + ret = vcpu_instances(broker, + dom, + ns, + proc_count, + list); + } + + return true; }
uint16_t res_type_from_device_classname(const char *classname) @@ -290,25 +344,27 @@ static CMPIStatus _get_devices(const CMP { CMPIStatus s = {CMPI_RC_OK, NULL}; int count; - int i; + bool rc; struct virt_device *devs = NULL;
count = get_devices(dom, &devs, type); if (count <= 0) goto out;
- for (i = 0; i < count; i++) { - CMPIInstance *dev = NULL; - - dev = device_instance(broker, - &devs[i], - dom, - NAMESPACE(reference)); - if (dev) - inst_list_add(list, dev); - - cleanup_virt_device(&devs[i]); - } + rc = device_instances(broker, + devs, + count, + dom, + NAMESPACE(reference), + list); + + if (!rc) { + CU_DEBUG("Problem getting device instances"); + cu_statusf(broker, &s, + CMPI_RC_ERR_FAILED, + "Couldn't get device instances");
This block is missing a closing brace.
@@ -462,10 +552,13 @@ CMPIStatus get_device_by_name(const CMPI CMPIStatus s = {CMPI_RC_OK, NULL}; char *domain = NULL; char *device = NULL; - CMPIInstance *instance = NULL; virConnectPtr conn = NULL; virDomainPtr dom = NULL; struct virt_device *dev = NULL; + struct inst_list tmp_list; + bool rc; + + inst_list_init(&tmp_list);
conn = connect_by_classname(broker, CLASSNAME(reference), &s); if (conn == NULL) { @@ -501,13 +594,27 @@ CMPIStatus get_device_by_name(const CMPI goto err; }
- instance = device_instance(broker, - dev, - dom, - NAMESPACE(reference)); + if (type == CIM_RES_TYPE_PROC) { + CU_DEBUG("PROC");
This statement should be removed or should be more descriptive.
+ rc = vcpu_instances(broker, + dom, + NAMESPACE(reference), + 1, + &tmp_list);
I think you need a different function here. If you have a guest with more than one proc, a query with the following with fail: wbemcli gi 'http://localhost/root/virt:KVM_Processor.CreationClassName="KVM_Processor",SystemName="demo2",DeviceID="demo2/1",SystemCreationClassName="KVM_ComputerSystem"' This is because you are telling vcpu_instances() there is only 1 device, and so vcpu_instances() assigns the instance a DeviceID of <guest_name>/0 instead of <guest_name>/1.
+ } else { + + rc = device_instances(broker, + dev, + 1, + dom, + NAMESPACE(reference), + &tmp_list); + } + cleanup_virt_device(dev);
- *_inst = instance; + *_inst = tmp_list.list[0]; + CU_DEBUG("cleaning up");
Same here - this statement can be removed. Also, the following queries fail for me - not sure why: wbemcli ain -ac KVM_SettingsDefineState 'http://localhost/root/virt:KVM_Processor.CreationClassName="KVM_Processor",SystemName="demo2",DeviceID="demo2/0",SystemCreationClassName="KVM_ComputerSystem"' wbemcli ain -ac KVM_SettingsDefineState 'http://localhost/root/virt:KVM_ProcResourceAllocationSettingData.InstanceID="demo2/proc"' Here's the values I get back from the enumerate calls: wbemcli ein http://localhost/root/virt:KVM_ProcResourceAllocationSettingData localhost:5988/root/virt:KVM_ProcResourceAllocationSettingData.InstanceID="demo2/proc" wbemcli ein http://localhost/root/virt:KVM_Processor localhost:5988/root/virt:KVM_Processor.CreationClassName="KVM_Processor",DeviceID="demo2/0",SystemCreationClassName="KVM_ComputerSystem",SystemName="demo2" localhost:5988/root/virt:KVM_Processor.CreationClassName="KVM_Processor",DeviceID="demo2/1",SystemCreationClassName="KVM_ComputerSystem",SystemName="demo2" localhost:5988/root/virt:KVM_Processor.CreationClassName="KVM_Processor",DeviceID="demo2/2",SystemCreationClassName="KVM_ComputerSystem",SystemName="demo2" localhost:5988/root/virt:KVM_Processor.CreationClassName="KVM_Processor",DeviceID="demo2/3",SystemCreationClassName="KVM_ComputerSystem",SystemName="demo2" Don't forget the xml_parse.c related change. -- Kaitlin Rupert IBM Linux Technology Center kaitlin@linux.vnet.ibm.com