From 8c86ef4c0dc00101c13a6c4d650d49309e217a1b Mon Sep 17 00:00:00 2001 From: qgarnier Date: Mon, 13 Mar 2023 10:51:58 +0000 Subject: [PATCH] (plugin) storage::netapp::ontap::restapi - mode hardware add disk component (#4278) --- .../ontap/restapi/mode/components/bay.pm | 7 +- .../ontap/restapi/mode/components/disk.pm | 68 +++++++++++++++++++ .../ontap/restapi/mode/components/fru.pm | 7 +- .../ontap/restapi/mode/components/shelf.pm | 7 +- .../netapp/ontap/restapi/mode/hardware.pm | 34 ++++++++-- 5 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 src/storage/netapp/ontap/restapi/mode/components/disk.pm diff --git a/src/storage/netapp/ontap/restapi/mode/components/bay.pm b/src/storage/netapp/ontap/restapi/mode/components/bay.pm index 19a50ac54..39b98c86c 100644 --- a/src/storage/netapp/ontap/restapi/mode/components/bay.pm +++ b/src/storage/netapp/ontap/restapi/mode/components/bay.pm @@ -31,9 +31,12 @@ sub check { $self->{output}->output_add(long_msg => 'checking bays'); $self->{components}->{bay} = { name => 'bays', total => 0, skip => 0 }; return if ($self->check_filter(section => 'bay')); - return if (!defined($self->{json_results}->{records})); - foreach my $shelf (@{$self->{json_results}->{records}}) { + $self->get_shelves(); + + return if (!defined($self->{shelves}->{records})); + + foreach my $shelf (@{$self->{shelves}->{records}}) { my $shelf_instance = $shelf->{serial_number}; my $shelf_name = $shelf->{name}; diff --git a/src/storage/netapp/ontap/restapi/mode/components/disk.pm b/src/storage/netapp/ontap/restapi/mode/components/disk.pm new file mode 100644 index 000000000..3e25c575a --- /dev/null +++ b/src/storage/netapp/ontap/restapi/mode/components/disk.pm @@ -0,0 +1,68 @@ +# +# Copyright 2023 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 storage::netapp::ontap::restapi::mode::components::disk; + +use strict; +use warnings; + +sub load {} + +sub check { + my ($self) = @_; + + $self->{output}->output_add(long_msg => 'checking disks'); + $self->{components}->{disk} = { name => 'disks', total => 0, skip => 0 }; + return if ($self->check_filter(section => 'disk')); + + my $disks = $self->get_disks(); + + return if (!defined($disks->{records})); + + foreach my $disk (@{$disks->{records}}) { + next if ($self->check_filter(section => 'disk', instance => $disk->{name})); + + $self->{components}->{disk}->{total}++; + $self->{output}->output_add( + long_msg => sprintf( + "disk '%s' state is '%s' [bay: %s, serial: %s, instance: %s]", + $disk->{name}, + $disk->{state}, + $disk->{bay}, + $disk->{serial_number}, + $disk->{name} + ) + ); + + my $exit = $self->get_severity(section => 'disk', value => $disk->{state}); + if (!$self->{output}->is_status(value => $exit, compare => 'ok', litteral => 1)) { + $self->{output}->output_add( + severity => $exit, + short_msg => sprintf( + "Disk '%s' state is '%s'", + $disk->{name}, + $disk->{state} + ) + ); + } + } +} + +1; diff --git a/src/storage/netapp/ontap/restapi/mode/components/fru.pm b/src/storage/netapp/ontap/restapi/mode/components/fru.pm index 221bc7e16..61d8ea458 100644 --- a/src/storage/netapp/ontap/restapi/mode/components/fru.pm +++ b/src/storage/netapp/ontap/restapi/mode/components/fru.pm @@ -31,9 +31,12 @@ sub check { $self->{output}->output_add(long_msg => 'checking fru'); $self->{components}->{fru} = { name => 'frus', total => 0, skip => 0 }; return if ($self->check_filter(section => 'fru')); - return if (!defined($self->{json_results}->{records})); - foreach my $shelf (@{$self->{json_results}->{records}}) { + $self->get_shelves(); + + return if (!defined($self->{shelves}->{records})); + + foreach my $shelf (@{$self->{shelves}->{records}}) { my $shelf_instance = $shelf->{serial_number}; my $shelf_name = $shelf->{name}; diff --git a/src/storage/netapp/ontap/restapi/mode/components/shelf.pm b/src/storage/netapp/ontap/restapi/mode/components/shelf.pm index 216de56db..a4a1e5c5a 100644 --- a/src/storage/netapp/ontap/restapi/mode/components/shelf.pm +++ b/src/storage/netapp/ontap/restapi/mode/components/shelf.pm @@ -31,9 +31,12 @@ sub check { $self->{output}->output_add(long_msg => 'checking shelfs'); $self->{components}->{shelf} = { name => 'shelfs', total => 0, skip => 0 }; return if ($self->check_filter(section => 'shelf')); - return if (!defined($self->{json_results}->{records})); - foreach my $shelf (@{$self->{json_results}->{records}}) { + $self->get_shelves(); + + return if (!defined($self->{shelves}->{records})); + + foreach my $shelf (@{$self->{shelves}->{records}}) { my $shelf_instance = $shelf->{serial_number}; my $shelf_name = $shelf->{name}; diff --git a/src/storage/netapp/ontap/restapi/mode/hardware.pm b/src/storage/netapp/ontap/restapi/mode/hardware.pm index 31acf5145..1ee7589e0 100644 --- a/src/storage/netapp/ontap/restapi/mode/hardware.pm +++ b/src/storage/netapp/ontap/restapi/mode/hardware.pm @@ -28,18 +28,30 @@ use warnings; sub set_system { my ($self, %options) = @_; - $self->{cb_hook2} = 'execute_custom'; + $self->{cb_hook2} = 'save_custom'; $self->{thresholds} = { state => [ ['ok', 'OK'], ['error', 'CRITICAL'], ['.*', 'CRITICAL'] + ], + disk => [ + ['present', 'OK'], + ['broken', 'CRITICAL'], + ['copy', 'OK'], + ['maintenance', 'OK'], + ['partner', 'OK'], + ['reconstructing', 'OK'], + ['removed', 'OK'], + ['spare', 'OK'], + ['unfail', 'OK'], + ['zeroing', 'OK'] ] }; $self->{components_path} = 'storage::netapp::ontap::restapi::mode::components'; - $self->{components_module} = ['shelf', 'bay', 'fru']; + $self->{components_module} = ['bay', 'disk', 'fru', 'shelf']; } sub new { @@ -52,10 +64,24 @@ sub new { return $self; } -sub execute_custom { +sub get_disks { my ($self, %options) = @_; - $self->{json_results} = $options{custom}->request_api(endpoint => '/api/storage/shelves?fields=*'); + return $self->{custom}->request_api(endpoint => '/api/storage/disks?fields=*'); +} + +sub get_shelves { + my ($self, %options) = @_; + + return if (defined($self->{shelves})); + + $self->{shelves} = $self->{custom}->request_api(endpoint => '/api/storage/shelves?fields=*'); +} + +sub save_custom { + my ($self, %options) = @_; + + $self->{custom} = $options{custom}; } 1;