From ea98017a2b2d21df1d5aad482a1b2f20f202b673 Mon Sep 17 00:00:00 2001 From: daniceexi Date: Tue, 20 Apr 2010 09:34:48 +0000 Subject: [PATCH] the code drop of energy management support for blade git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@5825 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT/xCAT/Usage.pm | 8 +- xCAT-client/pods/man1/renergy.1.pod | 602 +++++++++++++++++++------- xCAT-server/lib/xcat/plugins/blade.pm | 388 +++++++++++++++++ 3 files changed, 834 insertions(+), 164 deletions(-) diff --git a/perl-xCAT/xCAT/Usage.pm b/perl-xCAT/xCAT/Usage.pm index 958066e0f..d0250ae47 100644 --- a/perl-xCAT/xCAT/Usage.pm +++ b/perl-xCAT/xCAT/Usage.pm @@ -185,7 +185,13 @@ my %usage = ( Power 7 server specific : renergy noderange [-V] { all | { [savingstatus] [dsavingstatus] [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] [syssbpower] [sysIPLtime] } } - renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage }", + renergy noderange [-V] { {savingstatus}={on | off} | {dsavingstatus}={on-norm | on-maxp | off} | {cappingstatus}={on | off} | {cappingwatt}=watt | {cappingperc}=percentage } + + Blade specific : + renergy noderange [-V] { all | pd1all | pd2all | { [pd1status] [pd2status] [pd1policy] [pd2policy] [pd1powermodule1] [pd1powermodule2] [pd2powermodule1] [pd2powermodule2] [pd1avaiablepower] [pd2avaiablepower] [pd1reservedpower] [pd2reservedpower] [pd1remainpower] [pd2remainpower] [pd1inusedpower] [pd2inusedpower] [availableDC] [averageAC] [thermaloutput] [ambienttemp] [mmtemp] } } + renergy noderange [-V] { all | { [averageAC] [cappingmaxmin] [capability] [cappingvalue] [CPUspeed] [maxCPUspeed] } } + + renergy noderange [-V] { cappingwatt}=watt }", "updatenode" => "Usage: diff --git a/xCAT-client/pods/man1/renergy.1.pod b/xCAT-client/pods/man1/renergy.1.pod index ed29b42bc..fcf00cffe 100644 --- a/xCAT-client/pods/man1/renergy.1.pod +++ b/xCAT-client/pods/man1/renergy.1.pod @@ -12,27 +12,64 @@ B [-v | --version] B -B noderange [-V] { all | { [savingstatus] [cappingstatus] - [cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] - [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] } } +=over 2 -B noderange [-V] { {savingstatus}={on | off} - | {cappingstatus}={on | off} | {cappingwatt}=watt - | {cappingperc}=percentage } +B I [-V] { all | { [savingstatus] [cappingstatus] +[cappingmaxmin] [cappingvalue] [cappingsoftmin] [averageAC] +[averageDC] [ambienttemp] [exhausttemp] [CPUspeed] } } +B I [-V] { {savingstatus}={on | off} +| {cappingstatus}={on | off} | {cappingwatt}=watt +| {cappingperc}=percentage } + +=back B -B noderange [-V] { all | { [savingstatus] [dsavingstatus] - [cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] - [averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] - [syssbpower] [sysIPLtime] } } +=over 2 -B noderange [-V] { {savingstatus}={on | off} - | {dsavingstatus}={on-norm | on-maxp | off} - | {cappingstatus}={on | off} | {cappingwatt}=watt - | {cappingperc}=percentage } +B I [-V] { all | { [savingstatus] [dsavingstatus] +[cappingstatus] [cappingmaxmin] [cappingvalue] [cappingsoftmin] +[averageAC] [averageDC] [ambienttemp] [exhausttemp] [CPUspeed] +[syssbpower] [sysIPLtime] } } +B I [-V] { {savingstatus}={on | off} +| {dsavingstatus}={on-norm | on-maxp | off} +| {cappingstatus}={on | off} | {cappingwatt}=watt +| {cappingperc}=percentage } + +=back + +B + +=over 2 + +B + +=over 4 + +B I [-V] { all | pd1all | pd2all | { [pd1status] +[pd2status] [pd1policy] [pd2policy] [pd1powermodule1] +[pd1powermodule2] [pd2powermodule1] [pd2powermodule2] +[pd1avaiablepower] [pd2avaiablepower] [pd1reservedpower] +[pd2reservedpower] [pd1remainpower] [pd2remainpower] +[pd1inusedpower] [pd2inusedpower] [availableDC] [averageAC] +[thermaloutput] [ambienttemp] [mmtemp] } } + +=back + +B + +=over 4 + +B I [-V] { all | { [averageAC] [cappingmaxmin] +[capability] [cappingvalue] [CPUspeed] [maxCPUspeed] } } + +B I [-V] { cappingwatt}=watt } + +=back + +=back =head1 B @@ -42,18 +79,20 @@ user can query and set the power saving and power capping status, also can query the average consumed energy, the ambient and exhaust temperature, the processor frequency for a server. -B command supports IBM POWER6 and POWER7 rack-mounted servers. -Currently, following specific hardware types are supported: +B command supports IBM POWER6 and POWER7 rack-mounted servers +(system P CEC node), blade management module node, blade server node. +For rack-mounted servers, following specific hardware types are supported: I<8203-E4A>, I<8204-E8A>, I<9125-F2A>, I<8233-E8B>, I<8236-E8C>. The parameter I needs to be specified for B command to -get the target server. The I should be a list of CEC names. Lpar name +get the target server. The I should be a list of CEC node names, blade +management module node names or blade server node names. Lpar name is not acceptable here. B command can accept multiple of energy attributes to query or one of energy attribute to set. If only the attribute name is specified, without the '=', B gets and displays the current value. Otherwise, if specifying the attribute with '=' like -'savingstatus=on', B will turn on the static power saving. +'savingstatus=on', B will set the attribute savingstatus to value 'on'. The attributes listed in the B section are which ones can be handled by B command. But for each specific type of server, there are some attributes @@ -62,139 +101,316 @@ server, the return value of this attribute will be 'na'. The supported attributes for each specific hardware types are listed at following: -8203-E4A, 8204-E8A - Supported attributes: - B: savingstatus,cappingstatus,cappingmin,cappingmax,cappingvalue, -cappingsoftmin,averageAC,averageDC,ambienttemp,exhausttemp,CPUspeed - B: savingstatus,cappingstatus,cappingwatt,cappingperc +=over 2 -9125-F2A - Supported attributes: - B: savingstatus,averageAC,ambienttemp,exhausttemp,CPUspeed - B: savingstatus +B<8203-E4A>, B<8204-E8A> -8233-E8B, 8236-E8C - Supported attributes: - B: savingstatus,dsavingstatus,cappingstatus,cappingmin,cappingmax, -cappingvalue,cappingsoftmin,averageAC,averageDC,ambienttemp,exhausttemp, -CPUspeed,syssbpower,sysIPLtime - B: savingstatus,dsavingstatus,cappingstatus,cappingwatt,cappingperc +=over 4 + +Supported attributes: + +B: savingstatus,cappingstatus,cappingmin,cappingmax, +cappingvalue,cappingsoftmin,averageAC,averageDC,ambienttemp, +exhausttemp,CPUspeed + +B: savingstatus,cappingstatus,cappingwatt,cappingperc + +=back + +B<9125-F2A> + +=over 4 + +Supported attributes: + +B: savingstatus,averageAC,ambienttemp,exhausttemp, +CPUspeed + +B: savingstatus + +=back + +B<8233-E8B>, B<8236-E8C> + +=over 4 + +Supported attributes: + +B: savingstatus,dsavingstatus,cappingstatus,cappingmin, +cappingmax,cappingvalue,cappingsoftmin,averageAC,averageDC, +ambienttemp,exhausttemp,CPUspeed,syssbpower,sysIPLtime + +B: savingstatus,dsavingstatus,cappingstatus,cappingwatt, +cappingperc + +=back + +=back Note: -Each query operation for attribute CPUspeed, averageAC or averageDC -needs about 30 seconds to complete. The query for others attributes +For system P CEC nodes, each query operation for attribute CPUspeed, averageAC +or averageDC needs about 30 seconds to complete. The query for others attributes will get response immediately. =head1 B -B command depends on a CIM client tool B to -communicate with server. Then, before running the B command, please +For the system P CEC nodes, B command depends +on a CIM client tool B to +communicate with server. Then, before running the B command, to check whether the B package has been installed. + B can be downloaded from IBM web site. =head1 B --h | --help - Display the usage message. +=over 4 --v | --version - Display the version information. +=item B<-h | --help> + +Display the usage message. --V - Verbose output. +=item B<-v | --version> + +Display the version information. + +=item B<-V> + +Verbose output. -B - Query all energy attributes which supported by the specific - type of hardware. +=item B -savingstatus - Query the static power saving status. The result should be - 'on' or 'off'. 'on' - enable; 'off' - disable. +Query all energy attributes which supported by the specific +type of hardware. -savingstatus={on | off} - Set the static power saving. The value must be 'on' or 'off'. - If turning on the static power saving, the processor frequency - and voltage will be dropped to a fixed value to save energy. - The savingstatus setting operation needs about 2 minutes to - take effect. (The used time depends on the hardware type) +=item B -dsavingstatus - Query the dynamic power saving status. The result should - be 'on-norm', 'on-maxp' or 'off'. - If turning on the dynamic power saving, the processor - frequency and voltage will be dropped dynamically based on - the core utilization. It supports two modes for turn on state: - I - means normal, the processor frequency cannot - exceed the nominal value; - I - means maximum performance, the processor - frequency can exceed the nominal value. +Query all energy attributes of the power domain 1 for blade +management module node. -dsavingstatus={on-norm | on-maxp | off} - Set the dynamic power saving. The value must be 'on-norm', - 'on-maxp' or 'off'. - The dsavingstatus setting operation needs about 2 minutes - to take effect. (The used time depends on the hardware type) +=item B -cappingstatus - Query the power capping status. The result should be 'on' - or 'off'. +Query all energy attributes of the power domain 2 for blade +management module node. -cappingstatus={on | off} - Set the power capping status. The value must be 'on' - or 'off'. This is the switch to turn on or turn off the - power capping function. +=item B -cappingwatt=watt - Set the power capping value base on the watt unit. - If the 'watt' > maximum of I or 'watt' - < minimum of I, the setting operation - will be failed. +Query the current ambient temperature. (Unit is centigrade) -cappingperc=percentage - Set the power capping value base on the percentage of - the max-min of capping value which getting from - I attribute. The valid value must be - from 0 to 100. +=item B -cappingmaxmin - Query the maximum and minimum of power capping value - which can be set for a CEC. (Unit is watt) +Query the total DC power available for the entire chassis. + +=item B -cappingvalue - Query the current power capping value. (Unit is watt) +Query the average power consumed (Input). (Unit is watt) -cappingsoftmin - Query the minimum value that can be assigned to power - capping without guaranteed enforceability. (Unit is watt) +Note: For 9125-F2A server, the value of attribute +averageAC is the aggregate for all of the servers in a rack. -averageAC - Query the average power consumed (Input). (Unit is watt) - Note: For 9125-F2A server, the value of attribute - averageAC is the aggregate for all of the servers in a rack. +=item B -averageDC - Query the average power consumed (Output). (Unit is - watt) +Query the average power consumed (Output). (Unit is watt) -ambienttemp - Query the current ambient temperature. (Unit is centigrade) +=item B -exhausttemp - Query the current exhaust temperature. (Unit is centigrade) +Query the Power Capabilities of the blade server. -CPUspeed - Query the effective processor frequency. (Unit is MHz) +staticPowerManagement: the module with the static worst case power values. -syssbpower - Query the system power consumed prior to power on. - (Unit is MHz) +fixedPowermanagement: the module with the static power values but ability +to throttle. -sysIPLtime - Query the time used from FSP standby to OS standby. - (Unit is Second) +dynamicPowerManagement: the module with power meter capability, measurement +enabled, but capping disabled. + +dynamicPowerMeasurement1: the module with power meter capability, measurement +enabled, phase 1 only + +dynamicPowerMeasurement2: the module with power meter capability, measurement +enabled, phase 2 or higher + +dynamicPowerMeasurementWithPowerCapping: the module with power meter capability, +both measurement and capping enabled, phase 2 or higher" + +=item B + +Query the maximum and minimum of power capping value +which can be set for a CEC or blade server. (Unit is watt) + +=item B=B + +Set the power capping value base on the percentage of +the max-min of capping value which getting from +I attribute. The valid value must be +from 0 to 100. + +=item B + +Query the minimum value that can be assigned to power +capping without guaranteed enforceability. (Unit is watt) + +=item B + +Query the power capping status. The result should be 'on' +or 'off'. + +=item B={B | B} + +Set the power capping status. The value must be 'on' +or 'off'. This is the switch to turn on or turn off the +power capping function. + +=item B + +Query the current power capping value. (Unit is watt) + +=item B=B + +Set the power capping value base on the watt unit. + +If the 'watt' > maximum of I or 'watt' +< minimum of I, the setting operation +will be failed. + +=item B + +Query the effective processor frequency. (Unit is MHz) + +=item B + +Query the dynamic power saving status. The result should +be 'on-norm', 'on-maxp' or 'off'. + +If turning on the dynamic power saving, the processor +frequency and voltage will be dropped dynamically based on +the core utilization. It supports two modes for turn on state: + +I - means normal, the processor frequency cannot +exceed the nominal value; + +I - means maximum performance, the processor +frequency can exceed the nominal value. + +=item B={B | B | B} + +Set the dynamic power saving. The value must be 'on-norm', +'on-maxp' or 'off'. + +The dsavingstatus setting operation needs about 2 minutes +to take effect. (The used time depends on the hardware type) + +=item B + +Query the current exhaust temperature. (Unit is centigrade) + +=item B + +Query the maximum processor frequency. (Unit is MHz) + +=item B + +Query the current temperature of management module. +(Unit is centigrade) + +=item B + +Query the status of power domain 1 for blade management +module node. + +=item B + +Query the power management policy of power domain 1. + +=item B + +Query the First Power Module capacity in power domain 1. + +=item B + +Query the Second Power Module capacity in power domain 1. + +=item B + +Query the total available power in power domain 1. + +=item B + +Query the power that has been reserved for power domain 1. + +=item B + +Query the remaining power available in power domain 1. + +=item B + +Query the total power being used in power domain 1. + +=item B + +Query the status of power domain 2 for blade management +module node. + +=item B + +Query the power management policy of power domain 2. + +=item B + +Query the First Power Module capacity in power domain 2. + +=item B + +Query the Second Power Module capacity in power domain 2. + +=item B + +Query the total available power in power domain 2. + +=item B + +Query the power that has been reserved for power domain 2. + +=item B + +Query the remaining power available in power domain 2. + +=item B + +Query the total power being used in power domain 2. + +=item B + +Query the static power saving status. The result should be +'on' or 'off'. 'on' - enable; 'off' - disable. + +=item B={B | B} + +Set the static power saving. The value must be 'on' or 'off'. + +If turning on the static power saving, the processor frequency +and voltage will be dropped to a fixed value to save energy. + +The savingstatus setting operation needs about 2 minutes to +take effect. (The used time depends on the hardware type) + +=item B + +Query the time used from FSP standby to OS standby. +(Unit is Second) + +=item B + +Query the system power consumed prior to power on. +(Unit is MHz) + +=item B + +Query the thermal output (load) in BTUs per hour for the chassis. + +=back =head1 B @@ -206,64 +422,124 @@ sysIPLtime =head1 B -1. Query all the attributes which CEC1,CEC2 supported. - B CEC1,CEC2 all +=over 3 - The output of the query operation: - CEC1: savingstatus: off - CEC1: dsavingstatus: off - CEC1: cappingstatus: off - CEC1: cappingmin: 1953 W - CEC1: cappingmax: 2358 W - CEC1: cappingvalue: 2000 W - CEC1: cappingsoftmin: 304 W - CEC1: averageAC: na - CEC1: averageDC: na - CEC1: ambienttemp: na - CEC1: exhausttemp: na - CEC1: CPUspeed: na - CEC1: syssbpower: 40 W - CEC1: sysIPLtime: 900 S - CEC2: savingstatus: off - CEC2: cappingstatus: off - CEC2: cappingmin: 955 W - CEC2: cappingmax: 1093 W - CEC2: cappingvalue: 1000 W - CEC2: cappingsoftmin: 226 W - CEC2: averageAC: 627 W - CEC2: averageDC: 531 W - CEC2: ambienttemp: 25 C - CEC2: exhausttemp: 40 C - CEC2: CPUspeed: 4695 MHz +=item 1 -2. Query the attributes savingstatus, cappingstatus - and CPUspeed for server CEC1. - B CEC1 savingstatus cappingstatus CPUspeed +Query all the attributes which CEC1,CEC2 supported. - The output of the query operation: - CEC1: savingstatus: off - CEC1: cappingstatus: on - CEC1: CPUspeed: 3621 MHz +B CEC1,CEC2 all -3. Turn on the power saving function of CEC1. - B CEC1 savingstatus=on +The output of the query operation: + CEC1: savingstatus: off + CEC1: dsavingstatus: off + CEC1: cappingstatus: off + CEC1: cappingmin: 1953 W + CEC1: cappingmax: 2358 W + CEC1: cappingvalue: 2000 W + CEC1: cappingsoftmin: 304 W + CEC1: averageAC: na + CEC1: averageDC: na + CEC1: ambienttemp: na + CEC1: exhausttemp: na + CEC1: CPUspeed: na + CEC1: syssbpower: 40 W + CEC1: sysIPLtime: 900 S + CEC2: savingstatus: off + CEC2: cappingstatus: off + CEC2: cappingmin: 955 W + CEC2: cappingmax: 1093 W + CEC2: cappingvalue: 1000 W + CEC2: cappingsoftmin: 226 W + CEC2: averageAC: 627 W + CEC2: averageDC: 531 W + CEC2: ambienttemp: 25 C + CEC2: exhausttemp: 40 C + CEC2: CPUspeed: 4695 MHz - The output of the setting operation: - CEC1: Set savingstatus succeeded. - CEC1: This setting may need some minutes to take effect. +=item 2 -4. Set the power capping value base on the percentage of the - max-min capping value. Here, set it to 50%. - B CEC1 cappingperc=50 +Query all the attirbutes for management module node MM1. (For chassis) - If the maximum capping value of the CEC1 is 850w, and the - minimum capping value of the CEC1 is 782w, the Power Capping - value will be set as ((850-782)*50% + 782) = 816w. +B MM1 all - The output of the setting operation: - CEC1: Set cappingperc succeeded. - CEC1: cappingvalue: 816 +The output of the query operation: + mm1: availableDC: 5880W + mm1: frontpaneltmp: 18.00 Centigrade + mm1: inusedAC: 2848W + mm1: mmtmp: 28.00 Centigrade + mm1: pd1avaiablepower: 2940W + mm1: pd1inusedpower: 848W + mm1: pd1policy: redundantWithoutPerformanceImpact + mm1: pd1powermodule1: Bay 1: 2940W + mm1: pd1powermodule2: Bay 2: 2940W + mm1: pd1remainpower: 1269W + mm1: pd1reservedpower: 1671W + mm1: pd1status: 1 - Power domain status is good. + mm1: pd2avaiablepower: 2940W + mm1: pd2inusedpower: 1490W + mm1: pd2policy: redundantWithoutPerformanceImpact + mm1: pd2powermodule1: Bay 3: 2940W + mm1: pd2powermodule2: Bay 4: 2940W + mm1: pd2remainpower: 51W + mm1: pd2reservedpower: 2889W + mm1: pd2status: 2 - Warning: Power redundancy does not exist +in this power domain. + mm1: thermaloutput: 9717.376000 BTU/hour +=item 3 + +Query all the attirbutes for blade server node blade1. + +B blade1 all + +The output of the query operation: + blade1: capability: dynamicPowerMeasurement2 + blade1: capping: 349 + blade1: curalloc: 204W + blade1: effCPU: 4005MHZ + blade1: maxCPU: 4005MHZ + blade1: maxalloc: 349W + blade1: minalloc: 285W + +=item 4 + +Query the attributes savingstatus, cappingstatus +and CPUspeed for server CEC1. + +B CEC1 savingstatus cappingstatus CPUspeed + +The output of the query operation: + CEC1: savingstatus: off + CEC1: cappingstatus: on + CEC1: CPUspeed: 3621 MHz + +=item 5 + +Turn on the power saving function of CEC1. + +B CEC1 savingstatus=on + +The output of the setting operation: + CEC1: Set savingstatus succeeded. + CEC1: This setting may need some minutes to take effect. + +=item 6 + +Set the power capping value base on the percentage of the +max-min capping value. Here, set it to 50%. + +B CEC1 cappingperc=50 + +If the maximum capping value of the CEC1 is 850w, and the +minimum capping value of the CEC1 is 782w, the Power Capping +value will be set as ((850-782)*50% + 782) = 816w. + +The output of the setting operation: + CEC1: Set cappingperc succeeded. + CEC1: cappingvalue: 816 + +=back =head1 B diff --git a/xCAT-server/lib/xcat/plugins/blade.pm b/xCAT-server/lib/xcat/plugins/blade.pm index 32007dacb..e6de2fb9d 100644 --- a/xCAT-server/lib/xcat/plugins/blade.pm +++ b/xCAT-server/lib/xcat/plugins/blade.pm @@ -50,6 +50,7 @@ sub handled_commands { rbootseq => 'nodehm:mgt', reventlog => 'nodehm:mgt', switchblade => 'nodehm:mgt', + renergy => 'nodehm:mgt', }; } @@ -1734,6 +1735,383 @@ sub beacon { } } + +# The oids which are used in the renergy command +my $bladetype_oid = "1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0"; #bladeCenterVpdMachineType + +my $pdstatus_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.3"; #fuelGaugeStatus +my $pdpolicy_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.6"; #fuelGaugePowerManagementPolicySetting +my $pdmodule1_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.4"; #fuelGaugeFirstPowerModule +my $pdmodule2_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.5"; #fuelGaugeSecondPowerModule +my $pdavailablepower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.7"; #fuelGaugeTotalPower +my $pdreservepower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.8"; #fuelGaugeAllocatedPower +my $pdremainpower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.9"; #fuelGaugeRemainingPower +my $pdinused_oid = "1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.10"; #fuelGaugePowerInUsed + +my $chassisDCavailable_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.5.1.1.0"; #chassisTotalDCPowerAvailable +my $chassisACinused_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.5.1.2.0"; #chassisTotalACPowerInUsed +my $chassisThermalOutput_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.5.1.3.0"; #chassisTotalThermalOutput + +my $chassisFrontTmp_oid = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0"; #frontPanelTemp +my $mmtemp_oid = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0"; #mmTemp + +my $bladewidth_oid = "1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15"; #bladeWidth + +my $curallocpower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.pdnum.1.1.7"; #pd1ModuleAllocatedPowerCurrent +my $maxallocpower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.pdnum.1.1.8"; #pd1ModuleAllocatedPowerMax +my $minallocpower_oid = "1.3.6.1.4.1.2.3.51.2.2.10.pdnum.1.1.9"; #pd1ModuleAllocatedPowerMin +my $powercapability_oid = "1.3.6.1.4.1.2.3.51.2.2.10.pdnum.1.1.12"; #pd1ModulePowerCapabilities + +my $powercapping_oid = "1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.3"; #bladeDetailsMaxPowerConfig +my $effCPU_oid = "1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.4"; #bladeDetailsEffectiveClockRate +my $maxCPU_oid = "1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.5"; #bladeDetailsMaximumClockRate +my $savingstatus_oid = "1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.6"; #bladeDetailsPowerSaverMode + +# The meaning of obj fuelGaugePowerManagementPolicySetting +my %pdpolicymap = ( + '0' => "redundantWithoutPerformanceImpact", + '1' => "redundantWithPerformanceImpact", + '2' => "nonRedundant", + '3' => "redundantACPowerSource", + '4' => "acPowerSourceWithBladeThrottlingAllowed", + '255' => "notApplicable", +); + +# The meaning of obj pd1/2ModulePowerCapabilities +my %capabilitymap = ( + '0' => "noAbility", + '1' => "staticPowerManagement", + '2' => "fixedPowerManagement", + '3' => "dynamicPowerManagement", + '4' => "dynamicPowerMeasurement1", + '5' => "dynamicPowerMeasurement2", + '6' => "dynamicPowerMeasurement2", + '255' => "notApplicable", +); + +# The valid attributes the renergy command can support +# 1 for readonly; 2 for write; 3 readwrite +my %mm_valid_items = ( + 'all' => 1, + 'pd1all' => 1, + 'pd2all' => 1, + 'pd1status' => 1, + 'pd2status' => 1, + 'pd1policy' => 1, + 'pd2policy' => 1, + 'pd1powermodule1' => 1, + 'pd1powermodule2' => 1, + 'pd2powermodule1' => 1, + 'pd2powermodule2' => 1, + 'pd1avaiablepower' => 1, + 'pd2avaiablepower' => 1, + 'pd1reservedpower' => 1, + 'pd2reservedpower' => 1, + 'pd1remainpower' => 1, + 'pd2remainpower' => 1, + 'pd1inusedpower' => 1, + 'pd2inusedpower' => 1, + 'availableDC' => 1, + 'averageAC' => 1, + 'thermaloutput' => 1, + 'ambienttemp' => 1, + 'mmtemp' => 1, +); +my %blade_valid_items = ( + 'all' => 1, + 'averageAC' => 1, + 'cappingmaxmin' => 1, + 'cappingmax' => 1, + 'cappingmin' => 1, + 'capability' => 1, + 'cappingvalue' => 1, + 'cappingwatt' => 2, + 'CPUspeed' => 1, + 'maxCPUspeed' => 1, + 'savingstatus' => 2, + 'dsavingstatus' => 2, +); + + +# use the slot number of serverblade to get the powerdomain number +# and the bay number in the powerdomain +sub getpdbayinfo { + my ($bc_type, $slot) = @_; + + my $pdnum = 0; + my $pdbay = 0; + + if ($bc_type =~ /^1886|7989|8852$/) { # for blade center H + if ($slot < 8) { + $pdnum = 1; + $pdbay = $slot + 16; + } elsif ($slot < 15) { + $pdnum = 2; + $pdbay = $slot + 16 -7; + } + } elsif ($bc_type =~ /^8740|8750$/) { # for blade center HT + if ($slot < 7) { + $pdnum = 1; + $pdbay = $slot + 22; + } elsif ($slot < 13) { + $pdnum = 2; + $pdbay = $slot + 12 -6; + } + } elsif ($bc_type =~ /^8720|8730$/) { # for blade center T + if ($slot < 5) { + $pdnum = 1; + $pdbay = $slot + 12; + } elsif ($slot < 9) { + $pdnum = 2; + $pdbay = $slot + 2 -4; + } + } elsif ($bc_type =~ /^8720|8730$/) { # for blade center S + if ($slot < 7) { + $pdnum = 1; + $pdbay = $slot + 17; + } + } else { # for common blade center + if ($slot < 7) { + $pdnum = 1; + $pdbay = $slot + 10; + } elsif ($slot < 15) { + $pdnum = 2; + $pdbay = $slot - 6; + } + } + + return ($pdnum, $pdbay); +} + + +# command to hand the renergy request +sub renergy { + my ($mpa, $node, $slot, @items) = @_; + + if (!$mpa) { + return (1, "The attribute [mpa] needs to be set for the node $node."); + } + if (!$slot) { + return (1, "The attribute [id] needs to be set for the node $node."); + } + + # the type of blade center + my $bc_type = ""; + + #check the validity of all the attributes + my @readlist = (); + my %writelist = (); + foreach my $item (@items) { + if (!$item) { + next; + } + if ($item =~ /^all$/) { + if ($mpa eq $node) { + #handle the mm itself + push @readlist, ('pd1status','pd2status','pd1policy','pd2policy', + 'pd1powermodule1','pd1powermodule2','pd2powermodule1', + 'pd2powermodule2','pd1avaiablepower','pd2avaiablepower', + 'pd1reservedpower','pd2reservedpower','pd1remainpower', + 'pd2remainpower','pd1inusedpower','pd2inusedpower', + 'availableDC','averageAC','thermaloutput','ambienttemp', + 'mmtemp'); + } else { + push @readlist, ('averageAC','cappingmax','cappingmin','capability', + 'cappingvalue','CPUspeed','maxCPUspeed','savingstatus'.'dsavingstatus'); + } + } elsif ($item =~ /^pd1all$/) { + push @readlist, ('pd1status','pd1policy','pd1powermodule1', + 'pd1powermodule2','pd1avaiablepower','pd1reservedpower', + 'pd1remainpower','pd1inusedpower'); + } elsif ($item =~ /^pd2all$/) { + push @readlist, ('pd2status','pd2policy','pd2powermodule1', + 'pd2powermodule2','pd2avaiablepower','pd2reservedpower', + 'pd2remainpower','pd2inusedpower'); + } elsif ($item =~ /^cappingmaxmin$/) { + push @readlist, ('cappingmin','cappingmax'); + } elsif ($item =~ /(.*)=(.*)/) { + my $name = $1; + my $value = $2; + if ($mpa eq $node) { + if ($mm_valid_items{$name} < 2) { + return (1, "$name is NOT writable."); + } + } else { + if ($blade_valid_items{$name} < 2) { + return (1, "$name is NOT writable."); + } + } + $writelist{$name} = $value; + } else { + if ($mpa eq $node) { + if ($mm_valid_items{$item} != 1 && $mm_valid_items{$item} != 3) { + return (1, "$item is NOT a valid attribute."); + } + } else { + if ($blade_valid_items{$item} != 1 && $blade_valid_items{$item} != 3) { + return (1, "$item is NOT a valid attribute."); + } + } + push @readlist, $item; + } + } + + # does not support to read and write in one command + if ( @readlist && %writelist ) { + return (1, "Cannot handle read and write in one command."); + } + + if (! (@readlist || %writelist) ) { + return (1, "Does not get any valid attributes."); + } + + # get the blade center type first + if (grep (/^averageAC|cappingmax|cappingmin|capability$/, @readlist)) { + $bc_type =$session->get([$bladetype_oid]); + if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } + } + + + my @output = (); + foreach my $item (sort(@readlist)) { + my $oid = ""; + if ($item eq "pd1status") { + $oid = $pdstatus_oid.".1"; + } elsif ($item eq "pd2status") { + $oid = $pdstatus_oid.".2"; + } elsif ($item eq "pd1policy") { + $oid = $pdpolicy_oid.".1"; + } elsif ($item eq "pd2policy") { + $oid = $pdpolicy_oid.".2"; + } elsif ($item eq "pd1powermodule1") { + $oid = $pdmodule1_oid.".1"; + } elsif ($item eq "pd2powermodule1") { + $oid = $pdmodule1_oid.".2"; + } elsif ($item eq "pd1powermodule2") { + $oid = $pdmodule2_oid.".1"; + } elsif ($item eq "pd2powermodule2") { + $oid = $pdmodule2_oid.".2"; + } elsif ($item eq "pd1avaiablepower") { + $oid = $pdavailablepower_oid.".1"; + } elsif ($item eq "pd2avaiablepower") { + $oid = $pdavailablepower_oid.".2"; + } elsif ($item eq "pd1reservedpower") { + $oid = $pdreservepower_oid.".1"; + } elsif ($item eq "pd2reservedpower") { + $oid = $pdreservepower_oid.".2"; + } elsif ($item eq "pd1remainpower") { + $oid = $pdremainpower_oid.".1"; + } elsif ($item eq "pd2remainpower") { + $oid = $pdremainpower_oid.".2"; + } elsif ($item eq "pd1inusedpower") { + $oid = $pdinused_oid.".1"; + } elsif ($item eq "pd2inusedpower") { + $oid = $pdinused_oid.".2"; + } elsif ($item eq "availableDC") { + $oid = $chassisDCavailable_oid; + } elsif ($item eq "thermaloutput") { + $oid = $chassisThermalOutput_oid; + } elsif ($item eq "ambienttemp") { + $oid = $chassisFrontTmp_oid; + } elsif ($item eq "mmtemp") { + $oid = $mmtemp_oid; + } elsif ($item eq "averageAC") { + if ($mpa eq $node) { + # for management module + $oid = $chassisACinused_oid; + } else { + # for server blade + my ($pdnum, $pdbay) = getpdbayinfo($bc_type, $slot); + $oid = $curallocpower_oid; + $pdnum++; + $oid =~ s/pdnum/$pdnum/; + $oid = $oid.".".$pdbay; + } + } elsif ($item eq "cappingmax") { + my ($pdnum, $pdbay) = getpdbayinfo($bc_type, $slot); + $oid = $maxallocpower_oid; + $pdnum++; + $oid =~ s/pdnum/$pdnum/; + $oid = $oid.".".$pdbay; + } elsif ($item eq "cappingmin") { + my ($pdnum, $pdbay) = getpdbayinfo($bc_type, $slot); + $oid = $minallocpower_oid; + $pdnum++; + $oid =~ s/pdnum/$pdnum/; + $oid = $oid.".".$pdbay; + } elsif ($item eq "capability") { + my ($pdnum, $pdbay) = getpdbayinfo($bc_type, $slot); + $oid = $powercapability_oid; + $pdnum++; + $oid =~ s/pdnum/$pdnum/; + $oid = $oid.".".$pdbay; + } elsif ($item eq "cappingvalue") { + $oid = $powercapping_oid.".".$slot; + } elsif ($item eq "CPUspeed") { + $oid = $effCPU_oid.".".$slot; + } elsif ($item eq "maxCPUspeed") { + $oid = $maxCPU_oid.".".$slot; + } elsif ($item eq "savingstatus") { + $oid = ""; + push @output, "$item: not support now."; + } elsif ($item eq "dsavingstatus") { + $oid = ""; + push @output, "$item: not support now."; + } + + if ($oid ne "") { + my $data=$session->get([$oid]); + if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } + + if ($data ne "" + && $data ne "NOSUCHINSTANCE" + && $data ne "notApplicable" ) { + if ($item =~ /pd[1|2]policy/) { + push @output, "$item: $pdpolicymap{$data}"; + } elsif ($item eq "capability") { + push @output, "$item: $capabilitymap{$data}"; + } elsif ($item eq "cappingvalue") { + if ($data eq "0") { + push @output,"$item: na"; + } else { + push @output, "$item: $data"."W"; + } + } elsif ($item =~/averageAC|cappingmax|cappingmin/) { + my $bladewidth = $session->get([$bladewidth_oid.".$slot"]); + if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } + foreach (1..$bladewidth-1) { + $oid =~ /(\d+)$/; + my $next = $1+$_; + $oid =~ s/(\d+)$/$next/; + my $nextdata=$session->get([$oid]); + if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); } + $data += $nextdata; + } + push @output, "$item: $data"; + } else { + push @output,"$item: $data"; + } + } else { + push @output,"$item: na"; + } + } + } + + foreach my $item (keys %writelist) { + my $oid = ""; + if ($item eq "cappingvalue") { + $oid = $powercapping_oid; + } + + my $data = $session->set(new SNMP::Varbind([".".$oid, $slot, $writelist{$item} ,'INTEGER'])); + unless ($data) { return (1,$session->{ErrorStr}); } + push @output, "$item: set value to $writelist{$item}"; + } + + return (0, @output); +} + + sub bladecmd { $mpa = shift; my $node = shift; @@ -1775,6 +2153,8 @@ sub bladecmd { return eventlog(@args); } elsif ($command eq "rscan") { return rscan(\@args); + } elsif ($command eq "renergy") { + return renergy($mpa, $node, $slot, @args); } return (1,"$command not a supported command by blade method"); @@ -2094,6 +2474,14 @@ sub preprocess_request { return; } } + } elsif ($command eq "renergy") { + if (! @exargs) { + $usage_string="Missing arguments\n"; + $usage_string .=xCAT::Usage->getUsage($command); + $callback->({data=>$usage_string}); + $request = {}; + return; + } } if (!$noderange) {