Add cappingstatus support and support the capping setting for double wide blade
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@15945 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		@@ -2330,10 +2330,23 @@ my $dsavingstatus_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.7";    #bladeDetails
 | 
			
		||||
my $dsperformance_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.8";    #bladeDetailsDynamicPowerFavorPerformanceOverPower
 | 
			
		||||
 | 
			
		||||
# New attributes which supported by CMM
 | 
			
		||||
#".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.9"; #bladeDetailsPowerControl
 | 
			
		||||
#".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.10"; #bladeDetailsPcapMin
 | 
			
		||||
#".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.11"; #bladeDetailsPcapGuaranteedMin
 | 
			
		||||
#".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.12"; #bladeDetailsPcapMax
 | 
			
		||||
my $PowerControl_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.9"; #bladeDetailsPowerControl
 | 
			
		||||
my $PowerPcapMin_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.10"; #bladeDetailsPcapMin
 | 
			
		||||
my $PowerPcapGMin_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.11"; #bladeDetailsPcapGuaranteedMin
 | 
			
		||||
my $PowerPcapMax_oid = ".1.3.6.1.4.1.2.3.51.2.2.10.4.1.1.1.12"; #bladeDetailsPcapMax
 | 
			
		||||
 | 
			
		||||
# New table used to control the power management
 | 
			
		||||
#my $powerPcapMin =".1.3.6.1.4.1.2.3.51.2.22.31.6.1.10";    # componentPowerDetailsPcapMin
 | 
			
		||||
#my $powerPcapGMin = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.11";    # componentPowerDetailsPcapGuaranteedMin
 | 
			
		||||
#my $powerPcapMax = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.12";    # componentPowerDetailsPcapMax
 | 
			
		||||
 | 
			
		||||
#my $powerPcapSet = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.3"; # componentPowerDetailsMaxPowerConfig
 | 
			
		||||
#my $powerControl = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.9"; # componentPowerDetailsPowerControl
 | 
			
		||||
#my $powersavingstatus_oid = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.6";    #componentPowerDetailsPowerSaverMode
 | 
			
		||||
#my $powerdsavingstatus_oid = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.7";    #componentPowerDetailsDynamicPowerSaver
 | 
			
		||||
#my $powerdsperformance_oid = ".1.3.6.1.4.1.2.3.51.2.22.31.6.1.8";    #componentPowerDetailsDynamicPowerFavorPerformanceOverPower
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# The meaning of obj fuelGaugePowerManagementPolicySetting
 | 
			
		||||
my %pdpolicymap = (
 | 
			
		||||
@@ -2353,7 +2366,7 @@ my %capabilitymap = (
 | 
			
		||||
    '3' => "dynamicPowerManagement",
 | 
			
		||||
    '4' => "dynamicPowerMeasurement1",
 | 
			
		||||
    '5' => "dynamicPowerMeasurement2",
 | 
			
		||||
    '6' => "dynamicPowerMeasurement2",
 | 
			
		||||
    '6' => "dynamicPowerMeasurementWithPowerCapping",
 | 
			
		||||
    '255' => "notApplicable",
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
@@ -2441,12 +2454,14 @@ my %flex_blade_valid_items = (
 | 
			
		||||
    'cappingmaxmin' => 1,
 | 
			
		||||
    'cappingmax' => 1,
 | 
			
		||||
    'cappingmin' => 1,
 | 
			
		||||
    'cappingGmin' => 1,
 | 
			
		||||
    'capability' => 1,
 | 
			
		||||
    'cappingvalue' => 1,
 | 
			
		||||
    'cappingwatt' => 2,
 | 
			
		||||
    'cappingperc' => 2,
 | 
			
		||||
    'CPUspeed' => 1,
 | 
			
		||||
    'maxCPUspeed' => 1,
 | 
			
		||||
    'cappingstatus' => 3,
 | 
			
		||||
    'savingstatus' => 3,
 | 
			
		||||
    'dsavingstatus' => 3,
 | 
			
		||||
);
 | 
			
		||||
@@ -2504,7 +2519,6 @@ sub getpdbayinfo {
 | 
			
		||||
    return ($pdnum, $pdbay);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# command to hand the renergy request
 | 
			
		||||
sub renergy {
 | 
			
		||||
    my ($mpa, $node, $slot, @items) = @_;
 | 
			
		||||
@@ -2698,30 +2712,26 @@ sub renergy {
 | 
			
		||||
            $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") {
 | 
			
		||||
        }  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 "cappingmax") {
 | 
			
		||||
            $oid = $PowerPcapMax_oid.".".$slot;
 | 
			
		||||
        } elsif ($item eq "cappingmin") {
 | 
			
		||||
            $oid = $PowerPcapMin_oid.".".$slot;
 | 
			
		||||
        } elsif ($item eq "cappingGmin") {
 | 
			
		||||
            $oid = $PowerPcapGMin_oid.".".$slot;
 | 
			
		||||
        } 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 "cappingstatus") {
 | 
			
		||||
            $oid = $PowerControl_oid.".".$slot;
 | 
			
		||||
        } elsif ($item eq "savingstatus") {
 | 
			
		||||
            $oid = $savingstatus_oid.".".$slot;
 | 
			
		||||
        } elsif ($item eq "dsavingstatus") {
 | 
			
		||||
@@ -2741,24 +2751,35 @@ sub renergy {
 | 
			
		||||
                    push @output, "$item: $pdpolicymap{$data}";
 | 
			
		||||
                } elsif ($item eq "capability") {
 | 
			
		||||
                    push @output, "$item: $capabilitymap{$data}";
 | 
			
		||||
                } elsif ($item =~/cappingvalue|averageDC|cappingmax|cappingmin/) {
 | 
			
		||||
                } elsif ($item =~/cappingvalue|averageDC|cappingmax|cappingmin|cappingGmin/) {
 | 
			
		||||
                    if ($item eq "cappingvalue" && $data eq "0") {
 | 
			
		||||
                        push @output,"$item: na";
 | 
			
		||||
                    } else {
 | 
			
		||||
                        my $bladewidth = $session->get([$bladewidth_oid.".$slot"]);
 | 
			
		||||
                        if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
                        $data =~ s/W$//;
 | 
			
		||||
                        $data =~ s/[^\d]*$//;
 | 
			
		||||
                        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}); }
 | 
			
		||||
                            $nextdata =~ s/W$//;
 | 
			
		||||
                            $nextdata =~ s/[^\d]*$//;
 | 
			
		||||
                            $data += $nextdata;
 | 
			
		||||
                        }
 | 
			
		||||
                        push @output, "$item: $data"."W";
 | 
			
		||||
                    }
 | 
			
		||||
                } elsif ($item eq "cappingstatus") {
 | 
			
		||||
                    if ($data eq "2" || $data eq "5" || $data eq "10") {
 | 
			
		||||
                        # 1 all off; 2 cap; 
 | 
			
		||||
                        # 4 staticsaving; 5 cap + staticsaving; 
 | 
			
		||||
                        # 9 dynamicsaving; 10 cap + dynamicsaving;
 | 
			
		||||
                        push @output,"$item: on";
 | 
			
		||||
                    } elsif ($data eq "0" || $data eq "1" || $data eq "3" || $data eq "4" || $data eq "9") {
 | 
			
		||||
                        push @output, "$item: off";
 | 
			
		||||
                    } else {
 | 
			
		||||
                        push @output,"$item: na";
 | 
			
		||||
                    }
 | 
			
		||||
                } elsif ($item eq "savingstatus") {
 | 
			
		||||
                    if ($data eq "0") {
 | 
			
		||||
                        push @output,"$item: off";
 | 
			
		||||
@@ -2801,43 +2822,141 @@ sub renergy {
 | 
			
		||||
    foreach my $item (keys %writelist) {
 | 
			
		||||
        my $oid = "";
 | 
			
		||||
        my $svalue;
 | 
			
		||||
        my $cvalue;
 | 
			
		||||
 | 
			
		||||
        my $capmax;
 | 
			
		||||
        my $capmin;
 | 
			
		||||
        if ($item eq "cappingwatt" || $item eq "cappingperc") {
 | 
			
		||||
            if (0) {
 | 
			
		||||
            foreach my $i (@setneed) {
 | 
			
		||||
                if ($i =~ /^cappingmax: (\d*)W/) {
 | 
			
		||||
                    $capmax = $1;
 | 
			
		||||
                } elsif ($i =~ /^cappingmin: (\d*)W/) {
 | 
			
		||||
                    $capmin = $1;
 | 
			
		||||
                }
 | 
			
		||||
         if ($item eq "cappingstatus") {
 | 
			
		||||
            if ($writelist{$item} eq "on") {
 | 
			
		||||
                $cvalue = "1";
 | 
			
		||||
            } elsif ($writelist{$item} eq "off") {
 | 
			
		||||
                $cvalue = "0";
 | 
			
		||||
            } else {
 | 
			
		||||
                return (1, "The setting value should be on|off.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (! (defined ($capmax) && defined ($capmin))) {
 | 
			
		||||
                return (1, "Cannot get the value of cappingmin or cappingmax.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ($item eq "cappingwatt" && ($writelist{$item} > $capmax || $writelist{$item} < $capmin)) {
 | 
			
		||||
                return (1, "The set value should be in the range $capmin - $capmax.");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if ($item eq "cappingperc") {
 | 
			
		||||
                if ($writelist{$item} > 100 || $writelist{$item} < 0) {
 | 
			
		||||
                    return (1, "The percentage value should be in the range 0 - 100");
 | 
			
		||||
                }
 | 
			
		||||
                $writelist{$item} = int (($capmax-$capmin)*$writelist{$item}/100 + $capmin);
 | 
			
		||||
            }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            my $data = $session->set(new SNMP::Varbind([$powercapping_oid, $slot, $writelist{$item} ,'INTEGER']));
 | 
			
		||||
            unless ($data) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
 | 
			
		||||
            my $ndata=$session->get([$powercapping_oid.".".$slot]);
 | 
			
		||||
            # Get the power control value
 | 
			
		||||
            my $cdata = $session->get([$PowerControl_oid.".".$slot]);
 | 
			
		||||
            if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
            if ($ndata ne $writelist{$item}) {
 | 
			
		||||
 | 
			
		||||
            # 1 all off; 2 cap; 
 | 
			
		||||
            # 4 staticsaving; 5 cap + staticsaving; 
 | 
			
		||||
            # 9 dynamicsaving; 10 cap + dynamicsaving;
 | 
			
		||||
 | 
			
		||||
            if ($cvalue eq "1") {
 | 
			
		||||
                # to enable capping
 | 
			
		||||
                if ($cdata eq "2" || $cdata eq "5" || $cdata eq "10") {
 | 
			
		||||
                    return (0, "Power capping has been enabled.");
 | 
			
		||||
                } elsif ($cdata eq "0" || $cdata eq "1") {
 | 
			
		||||
                    $cvalue = "2";
 | 
			
		||||
                } elsif ($cdata eq "4") {
 | 
			
		||||
                    $cvalue = "5";
 | 
			
		||||
                } elsif ($cdata eq "9") {
 | 
			
		||||
                    $cvalue = "10";
 | 
			
		||||
                } else {
 | 
			
		||||
                    return (1, "Encountered error to turn on capping.");
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                # to disable capping
 | 
			
		||||
                if ($cdata eq "1" || $cdata eq "4" || $cdata eq "9") {
 | 
			
		||||
                    return (0, "Power capping has been disabled.");
 | 
			
		||||
                } elsif ($cdata eq "2") {
 | 
			
		||||
                    $cvalue = "1";
 | 
			
		||||
                } elsif ($cdata eq "5") {
 | 
			
		||||
                    $cvalue = "4";
 | 
			
		||||
                } elsif ($cdata eq "10") {
 | 
			
		||||
                    $cvalue = "9";
 | 
			
		||||
                } else {
 | 
			
		||||
                    return (1, "Encountered error to turn off capping.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            my $data = $session->set(new SNMP::Varbind([$PowerControl_oid, $slot, $cvalue ,'INTEGER']));
 | 
			
		||||
            unless ($data) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
            
 | 
			
		||||
            my $rdata=$session->get([$PowerControl_oid.".".$slot]);
 | 
			
		||||
            if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
            if ($rdata ne $cvalue) {
 | 
			
		||||
                return (1, "$item: set operation failed.");
 | 
			
		||||
            }
 | 
			
		||||
         } elsif ($item eq "cappingwatt" || $item eq "cappingperc") {
 | 
			
		||||
            my $bladewidth = $session->get([$bladewidth_oid.".$slot"]);
 | 
			
		||||
            if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
            if ($bladewidth == 1) {
 | 
			
		||||
               foreach my $i (@setneed) {
 | 
			
		||||
                   if ($i =~ /^cappingmax: (\d*)W/) {
 | 
			
		||||
                       $capmax = $1;
 | 
			
		||||
                   } elsif ($i =~ /^cappingmin: (\d*)W/) {
 | 
			
		||||
                       $capmin = $1;
 | 
			
		||||
                   }
 | 
			
		||||
               }
 | 
			
		||||
   
 | 
			
		||||
               if (! (defined ($capmax) && defined ($capmin))) {
 | 
			
		||||
                   return (1, "Cannot get the value of cappingmin or cappingmax.");
 | 
			
		||||
               }
 | 
			
		||||
   
 | 
			
		||||
               if ($item eq "cappingwatt" && ($writelist{$item} > $capmax || $writelist{$item} < $capmin)) {
 | 
			
		||||
                   return (1, "The set value should be in the range $capmin - $capmax.");
 | 
			
		||||
               }
 | 
			
		||||
   
 | 
			
		||||
               if ($item eq "cappingperc") {
 | 
			
		||||
                   if ($writelist{$item} > 100 || $writelist{$item} < 0) {
 | 
			
		||||
                       return (1, "The percentage value should be in the range 0 - 100");
 | 
			
		||||
                   }
 | 
			
		||||
                   $writelist{$item} = int (($capmax-$capmin)*$writelist{$item}/100 + $capmin);
 | 
			
		||||
               }
 | 
			
		||||
   
 | 
			
		||||
               my $data = $session->set(new SNMP::Varbind([$powercapping_oid, $slot, $writelist{$item} ,'INTEGER']));
 | 
			
		||||
               unless ($data) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
   
 | 
			
		||||
               my $ndata=$session->get([$powercapping_oid.".".$slot]);
 | 
			
		||||
               if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
               if ($ndata ne $writelist{$item}) {
 | 
			
		||||
                   return (1, "$item: set operation failed.");
 | 
			
		||||
               }
 | 
			
		||||
            } elsif ($bladewidth == 2) {
 | 
			
		||||
                # for double wide blade, the capping needs to be set for the two slots one by one
 | 
			
		||||
                # base on the min/max of the slots to know the rate of how many set to slot1 and how many set to slot2
 | 
			
		||||
                my $min1 = $session->get([$PowerPcapMin_oid.".".$slot]);
 | 
			
		||||
                if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
                my $min2 = $session->get([$PowerPcapMin_oid.".".($slot+1)]);
 | 
			
		||||
                if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
                my $max1 = $session->get([$PowerPcapMax_oid.".".$slot]);
 | 
			
		||||
                if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
                my $max2 = $session->get([$PowerPcapMax_oid.".".($slot+1)]);
 | 
			
		||||
                if ($session->{ErrorStr}) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
 | 
			
		||||
                my ($cv1, $cv2);
 | 
			
		||||
                if ($item eq "cappingperc") {
 | 
			
		||||
                   if ($writelist{$item} > 100 || $writelist{$item} < 0) {
 | 
			
		||||
                       return (1, "The percentage value should be in the range 0 - 100");
 | 
			
		||||
                   }
 | 
			
		||||
                   $cv1 = int (($max1-$min1)*$writelist{$item}/100 + $min1);
 | 
			
		||||
                   $cv2 = int (($max2-$min2)*$writelist{$item}/100 + $min2);
 | 
			
		||||
               } elsif ($item eq "cappingwatt") {
 | 
			
		||||
                   if (($min1 + $min2)>$writelist{$item} || ($max1+$max2)< $writelist{$item}) {
 | 
			
		||||
                       return (1, "The set value should be in the range ".($min1 + $min2)." - ".($max1+$max2).".");
 | 
			
		||||
                   } elsif (($max1 + $max2) == $writelist{$item}) {
 | 
			
		||||
                       $cv1 = $max1;
 | 
			
		||||
                       $cv2 = $max2;
 | 
			
		||||
                   } elsif (($min1 + $min2) == $writelist{$item}) {
 | 
			
		||||
                       $cv1 = $min1;
 | 
			
		||||
                       $cv2 = $min2;
 | 
			
		||||
                   } else {
 | 
			
		||||
                       my $x1 = ($max1+$min1)/2;
 | 
			
		||||
                       my $x2 = ($max2+$min2)/2;
 | 
			
		||||
                       # cv1/cv2 = $x1/$x2; cv1+cv2=$writelist{$item}
 | 
			
		||||
                       $cv1 = int ($writelist{$item}*$x1/($x1+$x2));
 | 
			
		||||
                       $cv2 = $writelist{$item} - $cv1;
 | 
			
		||||
                   }
 | 
			
		||||
               }
 | 
			
		||||
               my $data = $session->set(new SNMP::Varbind([$powercapping_oid, $slot, $cv1 ,'INTEGER']));
 | 
			
		||||
               unless ($data) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
 | 
			
		||||
               $data = $session->set(new SNMP::Varbind([$powercapping_oid, ($slot+1), $cv2 ,'INTEGER']));
 | 
			
		||||
               unless ($data) { return (1,$session->{ErrorStr}); }
 | 
			
		||||
            } else {
 | 
			
		||||
                return (1, "Don't know the wide of the blade.");
 | 
			
		||||
            }
 | 
			
		||||
        } elsif ($item eq "savingstatus") {
 | 
			
		||||
            if ($writelist{$item} eq "on") {
 | 
			
		||||
                $svalue = "1";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user