Fan redundancy information is useful to system administrators who need to monitor system health. This example shows how to locate system fans and query the CIMOM for redundant fan relationships.

This example shows how to enumerate the fans by starting from the Interop namespace and traversing associations from the managed server Scoping Instance. Locating Redundant Fans shows the relationships of the CIM objects involved. If the managed server provides redundant cooling, the redundancy is modeled in the CIMOM by an instance of CIM_RedundancySet that is associated with two (or more) redundant fans.

Locating Redundant Fans

This pseudocode depends on the pseudocode in Make a Connection to the CIMOM and Identifying the Base Server Scoping Instance.

To report fan redundancy

1

Connect to the server URL.

Specify the Interop namespace, supplied as a parameter, for the connection.

use wbemlib
use sys
use connection renamed cnx
connection = Null

params = cnx.get_params()
if params is Null 
   sys.exit(-1)
interop_params = params
interop_params['namespace'] = 'root/interop'
connection = cnx.connect_to_host( interop_params )
if connection is Null 
   print 'Failed to connect to: ' + params['host'] + ' as user: ' + params['user']
   sys.exit(-1)
2

Locate the Base Server Scoping Instance of CIM_ComputerSystem.

use scoping_instance renamed si

scoping_instance_name = si.get_scoping_instance_name( connection )
if scoping_instance_name is Null
   print 'Failed to find server Scoping Instance.'
   sys.exit(-1)
3

Traverse the CIM_SystemDevice association to reach the CIM_Fan instances on the managed server.

fan_instances = connection.Associators( scoping_instance_name, \
                                        AssocClass = 'CIM_SystemDevice', \
                                        ResultClass = ’CIM_Fan’ )
if len( fan_instances ) is 0 
   print 'Error:  No fans associated with server Scoping Instance.'
   sys.exit(-1)
4

For each fan instance, print the ElementName and DeviceID properties.

function print_info( instance ) 
   print '\n' + ’CIM_Fan [' + instance.classname + '] ='
   for prop in [ 'ElementName', 'DeviceID' ] 
      print ' %30s = %s' % ( prop, instance[prop] )

for fan_instance in fan_instances 
   print_info( fan_instance )
5

For each fan instance, traverse the CIM_MemberOfCollection association to reach any instances of CIM_RedundancySet.

set_instances = connection.Associators( scoping_instance_name, \
                                        AssocClass = 'CIM_MemberOfCollection', \
                                        ResultClass = ’CIM_RedundancySet’ )
6

For each fan instance, print the redundancy status. If the fan is not a member of a redundancy set, the redundancy status is not applicable.

if len( set_instances ) is 0 
   print '   Redundancy status: N/A'
else
   for instance in set_instances 
      name = instance[’Name’]
      status = instance[’RedundancyStatus’]
      print ’   redundancy set (%s) status = %s’ %
               ( instance[’Name’], (status==2 ? ’Fully Redundant’ : ’unknown or degraded’)
A sample of the output looks like the following:
CIM_Fan [OMC_Fan] =
                    ElementName = FAN 1 RPM
                    DeviceID = 48.0.32.99
   redundancy set (117.0.32.0) status = Fully Redundant
CIM_Fan [OMC_Fan] =
                    ElementName = FAN 2 RPM
                    DeviceID = 49.0.32.99
   redundancy set (117.0.32.0) status = Fully Redundant