diff --git a/hardware/server/hp/oneview/restapi/mode/components/enclosure.pm b/hardware/server/hp/oneview/restapi/mode/components/enclosure.pm new file mode 100644 index 000000000..2615e6719 --- /dev/null +++ b/hardware/server/hp/oneview/restapi/mode/components/enclosure.pm @@ -0,0 +1,120 @@ +# +# Copyright 2019 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package hardware::server::hp::oneview::restapi::mode::components::enclosure; + +use strict; +use warnings; + +sub load { + my ($self) = @_; + + push @{$self->{requests}}, { label => 'enclosure', uri => '/rest/enclosures?start=0&count=-1' }; +} + +sub check_subpart { + my ($self, %options) = @_; + + foreach (@{$options{entries}}) { + my $instance = $options{enclosure} . ':' . $_->{$options{instance}}; + + next if ($self->check_filter(section => 'enclosure.' . $options{section}, instance => $instance)); + + my $status = $_->{status}; + $self->{output}->output_add( + long_msg => sprintf( + "enclosure %s '%s' status is '%s' [instance = %s]", + $options{section}, $instance, $status, $instance, + ) + ); + + my $exit = $self->get_severity(label => 'default', section => 'enclosure.' . $options{section}, value => $status); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Enclosure %s '%s' status is '%s'", $options{section}, $instance, $status) + ); + } + } +} + +sub check { + my ($self) = @_; + + return if (!defined($self->{results}->{enclosure})); + + $self->{output}->output_add(long_msg => 'checking enclosures'); + $self->{components}->{enclosure} = { name => 'enclosure', total => 0, skip => 0 }; + return if ($self->check_filter(section => 'enclosure')); + + foreach (@{$self->{results}->{enclosure}->{members}}) { + my $instance = $_->{uuid}; + + next if ($self->check_filter(section => 'enclosure', instance => $instance)); + $self->{components}->{enclosure}->{total}++; + + my $status = $_->{status}; + $self->{output}->output_add( + long_msg => sprintf( + "enclosure '%s' status is '%s' [instance = %s]", + $instance, $status, $instance, + ) + ); + + my $exit = $self->get_severity(label => 'default', section => 'enclosure', value => $status); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Enclosure '%s' status is '%s'", $instance, $status) + ); + } + + check_subpart( + $self, + entries => $_->{fanBays}, + section => 'fan', + enclosure => $instance, + instance => 'bayNumber' + ); + check_subpart( + $self, + entries => $_->{powerSupplyBays}, + section => 'psu', + enclosure => $instance, + instance => 'bayNumber' + ); + check_subpart( + $self, + entries => $_->{managerBays}, + section => 'manager', + enclosure => $instance, + instance => 'bayNumber' + ); + check_subpart( + $self, + entries => $_->{applianceBays}, + section => 'appliance', + enclosure => $instance, + instance => 'bayNumber' + ); + } +} + +1; diff --git a/hardware/server/hp/oneview/restapi/mode/components/server.pm b/hardware/server/hp/oneview/restapi/mode/components/server.pm new file mode 100644 index 000000000..60419fabe --- /dev/null +++ b/hardware/server/hp/oneview/restapi/mode/components/server.pm @@ -0,0 +1,65 @@ +# +# Copyright 2019 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package hardware::server::hp::oneview::restapi::mode::components::server; + +use strict; +use warnings; + +sub load { + my ($self) = @_; + + push @{$self->{requests}}, { label => 'server', uri => '/rest/server-hardware?start=0&count=-1' }; +} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => 'checking servers'); + $self->{components}->{server} = { name => 'server', total => 0, skip => 0 }; + return if ($self->check_filter(section => 'server')); + + return if (!defined($self->{results}->{server})); + + foreach (@{$self->{results}->{server}->{members}}) { + my $instance = $_->{serverName}; + + next if ($self->check_filter(section => 'server', instance => $instance)); + $self->{components}->{server}->{total}++; + + my $status = $_->{status}; + $self->{output}->output_add( + long_msg => sprintf( + "server '%s' status is '%s' [instance = %s]", + $instance, $status, $instance, + ) + ); + + my $exit = $self->get_severity(label => 'default', section => 'server', value => $status); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf("Server '%s' status is '%s'", $instance, $status) + ); + } + } +} + +1; diff --git a/hardware/server/hp/oneview/restapi/mode/hardware.pm b/hardware/server/hp/oneview/restapi/mode/hardware.pm new file mode 100644 index 000000000..692ca225a --- /dev/null +++ b/hardware/server/hp/oneview/restapi/mode/hardware.pm @@ -0,0 +1,101 @@ +# +# Copyright 2019 Centreon (http://www.centreon.com/) +# +# Centreon is a full-fledged industry-strength solution that meets +# the needs in IT infrastructure and application monitoring for +# service performance. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +package hardware::server::hp::oneview::restapi::mode::hardware; + +use base qw(centreon::plugins::templates::hardware); + +use strict; +use warnings; + +sub set_system { + my ($self, %options) = @_; + + $self->{regexp_threshold_overload_check_section_option} = '^(?:server|enclosure\.(.*))$'; + + $self->{cb_hook2} = 'execute_custom'; + + $self->{thresholds} = { + default => [ + ['ok', 'OK'], + ['disabled', 'OK'], + ['critical', 'CRITICAL'], + ['warning', 'WARNING'], + ['unknown', 'UNKNOWN'], + ], + }; + + $self->{components_path} = 'hardware::server::hp::oneview::restapi::mode::components'; + $self->{components_module} = ['enclosure', 'server']; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, no_absent => 1, no_performance => 1, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => {}); + + $self->{requests} = []; + return $self; +} + +sub execute_custom { + my ($self, %options) = @_; + + $self->{results} = {}; + foreach (@{$self->{requests}}) { + my $result = $options{custom}->request_api(url_path => $_->{uri}); + $self->{results}->{$_->{label}} = $result; + } +} + +1; + +=head1 MODE + +Check hardware. + +=over 8 + +=item B<--component> + +Which component to check (Default: '.*'). +Can be: 'enclosure', 'server'. + +=item B<--filter> + +Exclude some parts (comma seperated list) +Can also exclude specific instance: --filter='enclosure.fan,:1' + +=item B<--no-component> + +Return an error if no compenents are checked. +If total (with skipped) is 0. (Default: 'critical' returns). + +=item B<--threshold-overload> + +Set to overload default threshold values (syntax: section,[instance,]status,regexp) +It used before default thresholds (order stays). +Example: --threshold-overload='server,WARNING,disabled' + +=back + +=cut diff --git a/hardware/server/hp/oneview/restapi/plugin.pm b/hardware/server/hp/oneview/restapi/plugin.pm index 007af0823..c6c5b6dc0 100644 --- a/hardware/server/hp/oneview/restapi/plugin.pm +++ b/hardware/server/hp/oneview/restapi/plugin.pm @@ -32,6 +32,7 @@ sub new { $self->{version} = '1.0'; %{$self->{modes}} = ( + 'hardware' => 'hardware::server::hp::oneview::restapi::mode::hardware', 'storage-pools' => 'hardware::server::hp::oneview::restapi::mode::storagepools', );