File Coverage

blib/lib/FusionInventory/Agent/Task/Inventory/Solaris/CPU.pm
Criterion Covered Total %
statement 80 91 87.9
branch 45 64 70.3
condition 3 6 50.0
subroutine 8 10 80.0
pod 0 2 0.0
total 136 173 78.6


line stmt bran cond sub pod time code
1             package FusionInventory::Agent::Task::Inventory::Solaris::CPU;
2              
3 2     2   117354474 use strict;
  2         4  
  2         88  
4 2     2   11 use warnings;
  2         3  
  2         119  
5              
6 2     2   20 use English qw(-no_match_vars);
  2         85  
  2         29  
7              
8 2     2   2197 use FusionInventory::Agent::Tools;
  2         5  
  2         396  
9 2     2   1301 use FusionInventory::Agent::Tools::Solaris;
  2         6  
  2         2442  
10              
11             sub isEnabled {
12 0     0 0 0 my (%params) = @_;
13 0 0       0 return 0 if $params{no_category}->{cpu};
14 0         0 return 1;
15             }
16              
17             sub doInventory {
18 0     0 0 0 my (%params) = @_;
19              
20 0         0 my $inventory = $params{inventory};
21              
22 0         0 foreach my $cpu (_getCPUs()) {
23 0         0 $inventory->addEntry(
24             section => 'CPUS',
25             entry => $cpu
26             );
27             }
28              
29             }
30              
31             sub _getCPUs {
32 13     13   7086 my (%params) = @_;
33              
34             # get virtual CPUs from psrinfo -v
35 13         57 my @all_virtual_cpus = _getVirtualCPUs(logger => $params{logger});
36              
37             # get physical CPUs from psrinfo -vp
38 13         72 my @all_physical_cpus = _getPhysicalCPUs(logger => $params{logger});
39              
40             # count the different speed values
41             # undef is temporarily mapped to 0, to avoid warnings
42             my @physical_speeds =
43 14 100       55 map { $_ ? $_ : undef }
44 1         4 sort { $a <=> $b }
45             uniq
46 13 100       38 map { $_->{speed} || 0 }
  44         170  
47             @all_physical_cpus;
48              
49             my @virtual_speeds =
50 14 50       51 map { $_ ? $_ : undef }
51 1         3 sort { $a <=> $b }
52             uniq
53 13 50       31 map { $_->{speed} || 0 }
  190         536  
54             @all_virtual_cpus;
55              
56 13         33 my @cpus;
57              
58             # process CPUs by groups, according to their speed
59 13         30 while (@physical_speeds) {
60 14         24 my $physical_speed = shift @physical_speeds;
61 14         22 my $virtual_speed = shift @virtual_speeds;
62              
63             my @physical_cpus = $physical_speed ?
64 50         107 grep { $_->{speed} eq $physical_speed } @all_physical_cpus:
65 14 100       36 grep { ! defined $_->{speed} } @all_physical_cpus;
  6         17  
66             my @virtual_cpus = $virtual_speed ?
67 210         392 grep { $_->{speed} eq $virtual_speed } @all_virtual_cpus:
68 14 50       40 grep { ! defined $_->{speed} } @all_virtual_cpus;
  0         0  
69              
70 14   66     47 my $speed = $physical_cpus[0]->{speed} || $virtual_cpus[0]->{speed};
71 14   33     31 my $type = $physical_cpus[0]->{type} || $virtual_cpus[0]->{type};
72 14 100       54 my $manufacturer =
    100          
73             $type =~ /SPARC/ ? 'SPARC' :
74             $type =~ /Xeon/ ? 'Intel' :
75             undef ;
76 14         20 my $cpus = scalar @physical_cpus;
77              
78 14 50       87 my ($cores, $threads) =
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
79             $type eq 'UltraSPARC-IV' ? (2, 1) : # US-IV & US-IV+
80             $type eq 'UltraSPARC-T1' ? (undef, 4) : # Niagara
81             $type eq 'UltraSPARC-T2' ? (undef, 8) : # Niagara-II
82             $type eq 'UltraSPARC-T2+' ? (undef, 8) : # Victoria Falls
83             $type eq 'SPARC-T3' ? (undef, 8) : # Rainbow Falls
84             $type eq 'SPARC64-VI' ? (2, 2) : # Olympus-C SPARC64-VI
85             $type eq 'SPARC64-VII' ? (4, 2) : # Jupiter SPARC64-VII
86             $type eq 'SPARC64-VII+' ? (4, 2) : # Jupiter+ SPARC64-VII+
87             $type eq 'SPARC64-VII++' ? (4, 2) : # Jupiter++ SPARC64-VII++
88             $type eq 'SPARC64-VIII' ? (8, 2) : # Venus SPARC64-VIII
89             (1, 1) ;
90              
91 14 50       81 if ($type =~ /MB86907/) {
    50          
    50          
92 0         0 $type = "TurboSPARC-II $type";
93             } elsif ($type =~ /MB86904|390S10/) {
94 0 0       0 $type = ($speed > 70) ? "microSPARC-II $type" : "microSPARC $type";
95             } elsif ($type =~ /,RT62[56]/) {
96 0         0 $type = "hyperSPARC $type";
97             }
98              
99             # deduce core numbers from number of virtual cpus if needed
100 14 100       31 if (!$cores) {
101             # cores may be < 1 in case of virtualisation
102 6         18 $cores = (scalar @virtual_cpus) / $threads / $cpus;
103             }
104              
105 14         32 for my $i (1 .. $cpus) {
106 44         220 push @cpus,
107             {
108             MANUFACTURER => $manufacturer,
109             NAME => $type,
110             SPEED => $speed,
111             CORE => $cores,
112             THREAD => $threads
113             };
114             }
115             }
116              
117 13         147 return @cpus;
118             }
119              
120             sub _getVirtualCPUs {
121 26     26   189967 my %params = (
122             command => '/usr/sbin/psrinfo -v',
123             @_
124             );
125              
126 26         111 my $handle = getFileHandle(%params);
127 26 50       66 return unless $handle;
128              
129 26         30 my @cpus;
130 26         556 while (my $line = <$handle>) {
131 1520 100       5357 if ($line =~ /The (\S+) processor operates at (\d+) MHz/) {
132 380         1357 push @cpus, {
133             type => $1,
134             speed => $2,
135             };
136 380         1193 next;
137             }
138             }
139 26         595 close $handle;
140              
141 26         208 return @cpus;
142             }
143              
144             sub _getPhysicalCPUs {
145 26     26   56256 my %params = (
146             command => '/usr/sbin/psrinfo -vp',
147             @_
148             );
149              
150 26         110 my $handle = getFileHandle(%params);
151 26 50       85 return unless $handle;
152              
153 26         36 my @cpus;
154 26         308 while (my $line = <$handle>) {
155              
156 198 100       544 if ($line =~ /^The physical processor has (\d+) virtual/) {
157 74         232 push @cpus, {
158             count => $1
159             };
160 74         236 next;
161             }
162              
163 124 100       255 if ($line =~ /^The physical processor has (\d+) cores and (\d+) virtual/) {
164 2         9 push @cpus, {
165             count => $2
166             };
167 2         8 next;
168             }
169              
170 122 100       307 if ($line =~ /^The (\S+) physical processor has (\d+) virtual/) {
171 12         50 push @cpus, {
172             type => $1,
173             count => $2
174             };
175 12         52 next;
176             }
177              
178 110 100       451 if ($line =~ /(\S+) \(.* clock (\d+) MHz\)/) {
179 76         91 my $cpu = $cpus[-1];
180 76         198 $cpu->{type} = $1;
181 76         147 $cpu->{speed} = $2;
182 76         276 next;
183             }
184              
185 34 100       140 if ($line =~ /Intel\(r\) Xeon\(r\) CPU +(\S+)/) {
186 16         21 my $cpu = $cpus[-1];
187 16         82 $cpu->{type} = "Xeon $1";
188             }
189             }
190 26         234 close $handle;
191              
192 26         148 return @cpus;
193             }
194              
195             1;