[Libvirt-cim] [PATCH v3 4/8] Set fields in mofs for Controller Device/RASD

John Ferlan jferlan at redhat.com
Mon Apr 14 14:14:54 UTC 2014



On 04/14/2014 04:19 AM, Xu Wang wrote:
> 
> 于 2014年03月28日 05:18, John Ferlan 写道:
>> From: Xu Wang <gesaint at linux.vnet.ibm.com>
>>
>> Set basic fields for the KVM_Controller instance based on the read XML
>> from the virtual controller device structure.
>>
>> Set the various KVM_ControllerRASD fields based on the read XML from
>> the virtual controller device structure
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>   src/Virt_Device.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
>>   src/Virt_RASD.c   | 57 +++++++++++++++++++++++++++++++++++++++++++++-
>>   src/svpc_types.h  |  3 ++-
>>   3 files changed, 124 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/Virt_Device.c b/src/Virt_Device.c
>> index 12ae6bd..60465b7 100644
>> --- a/src/Virt_Device.c
>> +++ b/src/Virt_Device.c
>> @@ -1,5 +1,5 @@
>>   /*
>> - * Copyright IBM Corp. 2007
>> + * Copyright IBM Corp. 2007-2014
>>    *
>>    * Authors:
>>    *  Dan Smith <danms at us.ibm.com>
>> @@ -366,6 +366,61 @@ static CMPIInstance *input_instance(const CMPIBroker *broker,
>>           return inst;
>>   }
>>
>> +static int controller_set_attr(const CMPIBroker *broker,
>> +                               CMPIInstance *instance,
>> +                               struct controller_device *dev)
>> +{
>> +        const char *type_str;
>> +
>> +        type_str = controller_protocol_type_IDToStr(dev->type);
>> +        if (type_str == NULL) {
>> +            CU_DEBUG("controller type=%d fails to return string", dev->type);
>> +            return 0;
>> +        }
>> +
>> +        CMSetProperty(instance, "ProtocolSupported",
>> +                      (CMPIValue *)&dev->type,
>> +                      CMPI_uint16);
>> +
>> +        if (dev->model)
>> +            CMSetProperty(instance, "ProtocolDescription",
>> +                          (CMPIValue *)dev->model,
>> +                          CMPI_chars);
>> +
>> +        return 1;
>> +}
>> +
>> +static CMPIInstance *controller_instance(const CMPIBroker *broker,
>> +                                         struct controller_device *dev,
>> +                                         const virDomainPtr dom,
>> +                                         const char *ns)
>> +{
>> +        CMPIInstance *inst;
>> +        virConnectPtr conn;
>> +
>> +        CU_DEBUG("controller_instance");
>> +
>> +        conn = virDomainGetConnect(dom);
>> +        inst = get_typed_instance(broker,
>> +                                  pfx_from_conn(conn),
>> +                                  "Controller",
>> +                                  ns,
>> +                                  true);
>> +        if (inst == NULL) {
>> +                CU_DEBUG("Failed to get instance of %s_Controller",
>> +                         pfx_from_conn(conn));
>> +                return NULL;
>> +        }
>> +
>> +
>> +        if (!controller_set_attr(broker, inst, dev)) {
>> +                CU_DEBUG("Failed to set contoller attributes of %s_Controller",
>> +                         pfx_from_conn(conn));
>> +                return NULL;
>> +        }
>> +
>> +        return inst;
>> +}
>>   static int device_set_devid(CMPIInstance *instance,
>>                               struct virt_device *dev,
>>                               const virDomainPtr dom)
>> @@ -488,6 +543,8 @@ static bool device_instances(const CMPIBroker *broker,
>>           for (i = 0; i < count; i++) {
>>                   struct virt_device *dev = &devs[i];
>>
>> +                CU_DEBUG("device_instance dev->type=%d", dev->type);
>> +
>>                   if (dev->type == CIM_RES_TYPE_NET)
>>                           instance = net_instance(broker,
>>                                                   &dev->dev.net,
>> @@ -516,11 +573,16 @@ static bool device_instances(const CMPIBroker *broker,
>>                                                       &dev->dev.console,
>>                                                       dom,
>>                                                       ns);
>> -                 else if (dev->type == CIM_RES_TYPE_INPUT)
>> +                else if (dev->type == CIM_RES_TYPE_INPUT)
>>                           instance = input_instance(broker,
>>                                                     &dev->dev.input,
>>                                                     dom,
>>                                                     ns);
>> +                else if (dev->type == CIM_RES_TYPE_CONTROLLER)
>> +                        instance = controller_instance(broker,
>> +                                                       &dev->dev.controller,
>> +                                                       dom,
>> +                                                       ns);
>>                   else
>>                           return false;
>>
>> @@ -555,6 +617,8 @@ uint16_t res_type_from_device_classname(const char *classname)
>>                   return CIM_RES_TYPE_GRAPHICS;
>>           else if (strstr(classname, "PointingDevice"))
>>                   return CIM_RES_TYPE_INPUT;
>> +        else if (strstr(classname, "Controller"))
>> +                return CIM_RES_TYPE_CONTROLLER;
>>           else
>>                   return CIM_RES_TYPE_UNKNOWN;
>>   }
>> diff --git a/src/Virt_RASD.c b/src/Virt_RASD.c
>> index abfb09f..3c62c2d 100644
>> --- a/src/Virt_RASD.c
>> +++ b/src/Virt_RASD.c
>> @@ -1,5 +1,5 @@
>>   /*
>> - * Copyright IBM Corp. 2007, 2013
>> + * Copyright IBM Corp. 2007-2014
>>    *
>>    * Authors:
>>    *  Dan Smith <danms at us.ibm.com>
>> @@ -915,6 +915,51 @@ static CMPIStatus set_input_rasd_params(const struct virt_device *dev,
>>           return s;
>>   }
>>
>> +static CMPIStatus set_controller_rasd_params(const CMPIBroker *broker,
>> +                                             const CMPIObjectPath *ref,
>> +                                             const struct virt_device *dev,
>> +                                             CMPIInstance *inst)
>> +{
>> +        const char *type_str;
>> +        CMPIStatus s = {CMPI_RC_OK, NULL};
>> +
>> +        type_str = controller_protocol_type_IDToStr(dev->dev.controller.type);
>> +        if (type_str == NULL) {
>> +                CU_DEBUG("controller type=%d fails to return string",
>> +                         dev->type);
>> +                return s;
>> +        }
>> +        CMSetProperty(inst, "OtherResourceType", "controller", CMPI_chars);
>> +        CMSetProperty(inst, "ResourceSubType",
>> +                      (CMPIValue *)type_str, CMPI_chars);
>> +        CMSetProperty(inst, "Index",
>> +                      (CMPIValue *)&(dev->dev.controller.index), CMPI_uint64);
>> +
>> +        if (dev->dev.controller.model)
>> +            CMSetProperty(inst, "Model",
>> +                          (CMPIValue *)dev->dev.controller.model, CMPI_chars);
>> +
>> +        if (dev->dev.controller.ports)
>> +            CMSetProperty(inst, "Ports",
>> +                          (CMPIValue *)dev->dev.controller.ports, CMPI_chars);
>> +
>> +        if (dev->dev.controller.vectors)
>> +            CMSetProperty(inst, "Vectors",
>> +                          (CMPIValue *)dev->dev.controller.vectors, CMPI_chars);
>> +
>> +        if (dev->dev.controller.queues)
>> +            CMSetProperty(inst, "Queues",
>> +                          (CMPIValue *)dev->dev.controller.queues, CMPI_chars);
>> +
>> +        if (dev->dev.controller.address.ct > 0)
>> +            set_rasd_device_address(broker,
>> +                                    ref,
>> +                                    &dev->dev.controller.address,
>> +                                    inst);
>> +
>> +        return s;
>> +}
>> +
>>   CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
>>                                       struct virt_device *dev,
>>                                       const char *host,
>> @@ -949,6 +994,9 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
>>           } else if (dev->type == CIM_RES_TYPE_INPUT) {
>>                   type = CIM_RES_TYPE_INPUT;
>>                   base = "InputResourceAllocationSettingData";
>> +        } else if (dev->type == CIM_RES_TYPE_CONTROLLER) {
>> +                type = CIM_RES_TYPE_OTHER;
> I noticed that only type of controller and console device are set into 
> CIM_RES_TYPE_OTHER.
> And I found only two places in this function use that macro. Why not 
> type is
> CIM_RES_TYPE_CONTROLLER/CONSOLE?
> 
> Thanks,
> Xu Wang

I'm following the advice of Boris on this one... Essentially, by
defining it to OTHER, the use of the OtherResourceType and
ResourceSubType fields come into play.

Go back to the original code review and see/read the following:

http://www.redhat.com/archives/libvirt-cim/2014-March/msg00012.html

then

http://www.redhat.com/archives/libvirt-cim/2014-March/msg00018.html

>> +                base = "ControllerResourceAllocationSettingData";
>>           } else {
>>                   return NULL;
>>           }
>> @@ -1004,6 +1052,8 @@ CMPIInstance *rasd_from_vdev(const CMPIBroker *broker,
>>                   s = set_input_rasd_params(dev, inst);
>>           } else if (dev->type == CIM_RES_TYPE_CONSOLE) {
>>                   s = set_console_rasd_params(dev, inst);
>> +        } else if (dev->type == CIM_RES_TYPE_CONTROLLER) {
>> +                s = set_controller_rasd_params(broker, ref, dev, inst);
>>           }
>>
>>           /* FIXME: Put the HostResource in place */
>> @@ -1138,6 +1188,8 @@ CMPIrc res_type_from_rasd_classname(const char *cn, uint16_t *type)
>>                  *type = CIM_RES_TYPE_IMAGE;
>>          else if (STREQ(base, "ConsoleResourceAllocationSettingData"))
>>                  *type = CIM_RES_TYPE_CONSOLE;
>> +       else if (STREQ(base, "ControllerResourceAllocationSettingData"))
>> +               *type = CIM_RES_TYPE_CONTROLLER;
>>          else
>>                  goto out;
>>
>> @@ -1175,6 +1227,9 @@ CMPIrc rasd_classname_from_type(uint16_t type, const char **classname)
>>           case CIM_RES_TYPE_INPUT:
>>                   *classname = "InputResourceAllocationSettingData";
>>                   break;
>> +        case CIM_RES_TYPE_CONTROLLER:
>> +                *classname = "ControllerResourceAllocationSettingData";
>> +                break;
>>           default:
>>                   rc = CMPI_RC_ERR_FAILED;
>>           }
>> diff --git a/src/svpc_types.h b/src/svpc_types.h
>> index d9f8032..6270233 100644
>> --- a/src/svpc_types.h
>> +++ b/src/svpc_types.h
>> @@ -42,7 +42,7 @@
>>   #define CIM_RES_TYPE_EMU        32770
>>   #define CIM_RES_TYPE_CONTROLLER 32771
>>
>> -#define CIM_RES_TYPE_COUNT 7
>> +#define CIM_RES_TYPE_COUNT 8
>>   const static int cim_res_types[CIM_RES_TYPE_COUNT] =
>>     {CIM_RES_TYPE_NET,
>>      CIM_RES_TYPE_DISK,
>> @@ -51,6 +51,7 @@ const static int cim_res_types[CIM_RES_TYPE_COUNT] =
>>      CIM_RES_TYPE_GRAPHICS,
>>      CIM_RES_TYPE_INPUT,
>>      CIM_RES_TYPE_CONSOLE,
>> +   CIM_RES_TYPE_CONTROLLER,
>>     };
>>
>>   #define CIM_VSSD_RECOVERY_NONE       2
> 
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
> 




More information about the Libvirt-cim mailing list