[fm-discuss] Proposal: libtopo eumeration of power supplies and fans via IPMI
cindi
cindi at sun.com
Wed Jan 9 12:18:55 PST 2008
Rob Johnston wrote:
> Cynthia McGuire wrote:
>>>
>>> 6. LIBTOPO ENHANCEMENTS
>>>
>>> To make the implementation of this project possible, a handful of
>>> extensions to both the libtopo enumerator module API and XML schema are
>>> necessary.
>>>
>>> Currently it is not possible to register module methods on nodes that
>>> are statically enumerated via XML map files. Typically, node methods
>>> are registered onto a node by the enumerator module after the node is
>>> bound to the topology. However, since statically enumerated modules
>>> aren't created by the enumerator module this registration doesn't occur.
>>>
>>> While there will be cases where we will be forced to statically define
>>> psu and fan topologies via XML, these nodes still need to support the
>>> node methods that are implemented by the ipmi enumerator module. In
>>> order to allow these methods to be registered on statically defined
>>> nodes, the topo_modops_t struct will be extended with a new operation
>>> (tmo_meth_reg) as shown below:
>>>
>>> typedef int topo_meth_reg_f(topo_mod_t *, tnode_t *);
>>>
>>> typedef struct topo_modops {
>>> topo_enum_f *tmo_enum; /* enumeration op */
>>> topo_release_f *tmo_release; /* resource release op */
>>> topo_meth_reg_f *tmo_meth_reg; /* method registration op */
>>> } topo_modops_t;
>>>
>>> The tmo_meth_reg operation will be optional. Enumerator modules
>>> which implement this operation will register the appropriate set of
>>> methods on the topo node that is passed in.
>>>
>>> To provide a connection between this new operation and nodes that are
>>> statically defined in XML, the syntax of the <node> element will be
>>> extended to include a new optional "mod" attribute. The value of this
>>> attribute should be set to the name of an enumerator module, whose
>>> methods
>>> should be registered on that node. Below is an example usage of this
>>> new attribute:
>>>
>>> <range name='fan' min='0' max='2'>
>>> <node instance='0' mod='ipmi'>
>>> . . .
>>> </node>
>>> </range>
>>>
>>
>> I don't see a need for the extra registration op nor the new attribute
>> name, mod. I prefer to see the XML extended to permit enumerators to
>> be called after the XML parser has created the static node. The
>> enumerators can then register their methods and perform any
>> post-processing of the node (i.e. add other properties). The
>> attribute name should be 'enum' as for dynamically created nodes.
>
> Ok - so along those lines an alternative approach could do something like:
>
> <range name='fan' min='0' max='2'>
> <node instance='0'>
> . . .
> </node>
> ...
> <enum-process name='ipmi' version='1'>
> </range>
>
> This could invoke a new entry point in the module which would walk the
> tree and post-process any nodes that it's responsible for (like fan and
> psu nodes). Is this closer to what you're thinking of?
Not exactly. The XML should look like:
<range name='fan' min='0' max='2'>
<node instance='0'>
<enum-method name='ipmi' version='1'>
. . .
</node>
...
</range>
The topo XML parser should:
1) create the range 'fan' and reserve 0 - 2 nodes (code already in place)
2) create a node for instance 0: (code already in place)
3) topo_mod_load() the IPMI plugin (need to add this as part of
pad_process())
4) call topo_mod_enumerate() on the node just created (need to add this
as part of pad_process())
The IPMI module should:
1) register any methods for the node
2) decorate properties
3) it could also decide that the node should not exist and
topo_node_unbind() it from the topo tree
This change should require 0 changes to the module API and a minor
change to the DTD to permit an enum-method element for node.
>
>
>>> Additionally, the syntax of the <range> element will also be extended to
>>> allow a new "set" attribute. The intention is to allow for conditional
>>> enumeration of a range of nodes based on the platform type. This is
>>> analagous to the conditional specification of properties which is
>>> currently supported via the <propset> element. Below is an example
>>> usage of this new attribute:
>>>
>>> <range name='fanmodule' min='0' max='4'
>>> set='Sun-Fire-X4500|Sun-Fire-X4540'>
>>> . . .
>>> </range>
>>>
>>
>> This looks backwards. Shouldn't the set contain the range?
>
> Effectively it does. What I was trying to avoid was creating a brand
> new element (ala <rangeset>). By having the set that the range applies
> to be just an attribute of the <range> element greatly simplifies the
> actual code changes that I have to make to libtopo's parser.
>
> I suppose an alternative would be to do something like this:
>
> <rangeset type='product' set="Sun-Fire-X4500|Sun-Fire-X4540'>
> <range name='fanmodule' min='0' max='4'>
> . . .
> </range>
> </range>
>
> However this ends up being quite a bit more difficult to implement in
> the parser wothout any functional benefit. I also think the xml code
> looks a bit cleaner the other way.
>
>> You will also need to specify the set type (someplace) just as we do
>> in propset.
The reason for the propset element is to permit groupings of properties
by a some criteria (i.e. product name). I can see that being useful for
ranges as well. For example, we may want to do this:
<rangeset type='product' set='Sun-Fire-X4500|Sun-Fire-X4540'>
<range name='fanmodule' min='0' max='4'>
...
</range>
range name='psu' min='0' max='4'>
</range>
</rangeset>
We may also want to define sets for nodes:
<range name='fanmodule' min='0' max='4'>
<nodeset type='product' set='Sun-Fire-X4500|Sun-Fire-X4540'>
<node instance='0' />
<node instance='1' />
</nodeset>
</range>
I'd like to see a common element defined for all sets rather than
propset, rangeset and nodeset. The set element should be defined in the
DTD to include 0 or more propgroup, node or range elements. I wanted to
use the word, grouping, rather than propset, but it was already in use.
Perhaps you can come up with something more brilliant. :)
Cindi
More information about the fm-discuss
mailing list