[Libvirt-cim] [PATCH] [RFC] Added HostedAccessPoint association (ComputerSystem <-> KVMRedirectionSAP)

Kaitlin Rupert kaitlin at linux.vnet.ibm.com
Mon Nov 24 19:34:41 UTC 2008


> Running the following query:
> wbemcli ain -ac KVM_HostedAccessPoint 'http://root:1mud2ar3@localhost:5988/root/virt:
> KVM_HostSystem.CreationClassName="KVM_HostSystem",Name="F10"'
> 
> Expecting this query to return the list KVMRedirectionSAPs associated with the host
> 
> Right now the query returns the following message:
>  wbemcli: Cim: (4) CIM_ERR_INVALID_PARAMETER: KVM_HostSystem.CreationClassName=
> "KVM_HostSystem",Name="F10"
> 

I'm not getting this error.. are you reconfiguring your tree to make 
sure the makefiles are updated?

> +static const CMPIBroker *_BROKER;
> +
> +static CMPIStatus rsap_to_host(const CMPIObjectPath *ref,
> +                               struct std_assoc_info *info,
> +                               struct inst_list *list)
> +{
> +        CMPIStatus s = {CMPI_RC_OK, NULL};
> +        CMPIInstance *instance = NULL;
> +
> +        if (!match_hypervisor_prefix(ref, info))
> +                goto out;
> +
> +        s = get_console_sap_by_ref(_BROKER, ref, &instance);
> +        if (s.rc != CMPI_RC_OK)
> +                goto out;
> +
> +        s = get_host(_BROKER, info->context, ref, &instance, false);
> +        if (s.rc == CMPI_RC_OK)
> +                inst_list_add(list, instance);
> +
> +out:

The style is to put a space before out.

> +        return s;
> +}
> +
> +
> +static CMPIStatus host_to_rsap(const CMPIObjectPath *ref,
> +                               struct std_assoc_info *info,
> +                               struct inst_list *list)
> +{
> +        CMPIStatus s = {CMPI_RC_OK, NULL};
> +        CMPIInstance *instance = NULL;
> +        CMPIObjectPath *vref = NULL;
> +
> +        if (!match_hypervisor_prefix(ref, info))
> +                goto out;
> +
> +        s = get_host(_BROKER, info->context, ref, &instance, true);
> +        if (s.rc != CMPI_RC_OK)
> +                goto out; 
> +
> +        vref = convert_sblim_hostsystem(_BROKER, ref, info);
> +        if (vref == NULL)
> +                goto out;
> +
> +        s = return_console_sap(vref, list);
> +
> +        //s = get_console_sap_by_ref(_BROKER, ref, &instance);
> +        if (s.rc != CMPI_RC_OK)
> +                goto out;
> +        //if (!CMIIsNullObject(instance))
> +        inst_list_add(list, instance);

You're adding the host instance to the list.  You don't want to return 
the host instance.. just the KVMRedirectionSAP instances.

> +         
> +out:
> +        return s;
> +}
> +
> +LIBVIRT_CIM_DEFAULT_MAKEREF()
> +
> +static char* antecedent[] = {
> +        "Xen_HostSystem",
> +        "KVM_HostSystem",
> +        "LXC_HostSystem",

You'll need to include Linux_ComputerSystem in this list.

> +        NULL
> +};
> +
> +static char* dependent[] = {
> +        "Xen_KVMRedirectionSAP",
> +        "KVM_KVMRedirectionSAP",
> +        "LXC_KVMRedirectionSAP",
> +        NULL
> +};
> +
> +static char* assoc_classname[] = {
> +        "Xen_HostedAccessPoint",
> +        "KVM_HostedAccessPoint",
> +        "LXC_HostedAccessPoint",
> +        NULL
> +};
> +
> +static struct std_assoc _rsap_to_host = {
> +        .source_class = (char **)&antecedent,
> +        .source_prop = "Antecedent", 
> +
> +        .target_class = (char **)&dependent,
> +        .target_prop = "Dependent", 
> +
> +        .assoc_class = (char **)&assoc_classname,
> +
> +        .handler = rsap_to_host,

This needs to be host_to_rsap  - your source class is antecedent, which 
is populated with <>_HostSystem classnames.

> +        .make_ref = make_ref
> +};
> +
> +static struct std_assoc _host_to_rsap = {
> +        .source_class = (char **)&dependent,
> +        .source_prop = "Dependent",
> +
> +        .target_class = (char **)&antecedent,
> +        .target_prop = "Antecedent",
> +        
> +        .assoc_class = (char **)&assoc_classname,
> +
> +        .handler = host_to_rsap,

This needs to be rsap_to_host.

> diff -r 5d8d418eef37 -r 6197321a3c5e src/Virt_KVMRedirectionSAP.c

This is a very long patch.  I'd break this up into smaller patches and 
send it as a patchset.

> --- a/src/Virt_KVMRedirectionSAP.c	Wed Nov 19 16:08:21 2008 -0200
> +++ b/src/Virt_KVMRedirectionSAP.c	Mon Nov 24 16:58:39 2008 -0200
> @@ -236,15 +236,36 @@
>          return true;
>  }
> 
> -static CMPIStatus return_console_sap(const CMPIObjectPath *ref,
> -                                     const CMPIResult *results,
> -                                     bool names_only)
> +static CMPIStatus enum_console_saps(const CMPIObjectPath *ref,
> +                                    const CMPIResult *results,
> +                                    bool names_only)
> +{
> +        CMPIStatus s = {CMPI_RC_OK, NULL};
> +        struct inst_list list;

You'll need to call inst_list_init() to initialize the list.

> +
> +        s = return_console_sap(ref, &list);
> +        if (s.rc != CMPI_RC_OK)
> +                goto out;
> +
> +        if (names_only)
> +                cu_return_instance_names(results, &list);
> +        else
> +                cu_return_instances(results, &list);
> +
> +out:

You'll need to call inst_list_free() here to free the list.

> +        return s;
> +}
> +
> +CMPIStatus return_console_sap(const CMPIObjectPath *ref,
> +                              struct inst_list *list)
> +                                     //const CMPIResult *results,
> +                                     //bool names_only)

Since you'll be calling this function from other providers, it needs to 
take a CMPIBroker param.  Instead of using the provider's _BROKER, it 
should be using the broker that is passed in.

>  {
>          CMPIStatus s = {CMPI_RC_OK, NULL};
>          virConnectPtr conn;
>          virDomainPtr *domain_list;
>          struct domain *dominfo = NULL;
> -        struct inst_list list;
> +        //struct inst_list list;
>          struct vnc_ports port_list;
>          int count;
>          int lport;
> @@ -255,7 +276,7 @@
>          if (conn == NULL)
>                  return s;
> 
> -        inst_list_init(&list);
> +        inst_list_init(list);

The list should already be initialized by the calling function.  No need 
to initialize it here.

-- 
Kaitlin Rupert
IBM Linux Technology Center
kaitlin at linux.vnet.ibm.com




More information about the Libvirt-cim mailing list