diff --git a/centreon-plugins/storage/netapp/ontap/restapi/custom/api.pm b/centreon-plugins/storage/netapp/ontap/restapi/custom/api.pm index b0e9a17d7..26966b98a 100644 --- a/centreon-plugins/storage/netapp/ontap/restapi/custom/api.pm +++ b/centreon-plugins/storage/netapp/ontap/restapi/custom/api.pm @@ -148,20 +148,12 @@ sub request_api { $self->settings(); - my $content = do { - local $/ = undef; - if (!open my $fh, "<", '/home/qgarnier/clients/plugins/todo/netapp_restapi/shelves') { - $self->{output}->add_option_msg(short_msg => "Could not open file $self->{option_results}->{$_} : $!"); - $self->{output}->option_exit(); - } - <$fh>; - }; - #my $content = $self->{http}->request( - # url_path => $options{endpoint}, - # unknown_status => $self->{unknown_http_status}, - # warning_status => $self->{warning_http_status}, - # critical_status => $self->{critical_http_status} - #); + my $content = $self->{http}->request( + url_path => $options{endpoint}, + unknown_status => $self->{unknown_http_status}, + warning_status => $self->{warning_http_status}, + critical_status => $self->{critical_http_status} + ); if (!defined($content) || $content eq '') { $self->{output}->add_option_msg(short_msg => "API returns empty content [code: '" . $self->{http}->get_code() . "'] [message: '" . $self->{http}->get_message() . "']"); diff --git a/centreon-plugins/storage/netapp/ontap/restapi/mode/liststorageresources.pm b/centreon-plugins/storage/netapp/ontap/restapi/mode/liststorageresources.pm deleted file mode 100644 index 14aac625a..000000000 --- a/centreon-plugins/storage/netapp/ontap/restapi/mode/liststorageresources.pm +++ /dev/null @@ -1,109 +0,0 @@ -# -# Copyright 2020 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::emc::unisphere::restapi::mode::liststorageresources; - -use base qw(centreon::plugins::mode); - -use strict; -use warnings; -use storage::emc::unisphere::restapi::mode::components::resources qw($health_status); - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options); - bless $self, $class; - - $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' }, - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::init(%options); -} - -sub manage_selection { - my ($self, %options) = @_; - - return $options{custom}->request_api(url_path => '/api/types/storageResource/instances?fields=name,health'); -} - -sub run { - my ($self, %options) = @_; - - my $storages = $self->manage_selection(%options); - foreach (@{$storages->{entries}}) { - next if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' - && $_->{content}->{name} !~ /$self->{option_results}->{filter_name}/); - - $self->{output}->output_add(long_msg => sprintf( - '[name = %s][status = %s]', - $_->{content}->{name}, - $health_status->{ $_->{content}->{health}->{value} }, - )); - } - - $self->{output}->output_add( - severity => 'OK', - short_msg => 'List storage resources:' - ); - $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); - $self->{output}->exit(); -} - -sub disco_format { - my ($self, %options) = @_; - - $self->{output}->add_disco_format(elements => ['name', 'status']); -} - -sub disco_show { - my ($self, %options) = @_; - - my $storages = $self->manage_selection(%options); - foreach (@{$storages->{entries}}) { - $self->{output}->add_disco_entry( - name => $_->{content}->{name}, - status => $health_status->{ $_->{content}->{health}->{value} }, - ); - } -} - -1; - -__END__ - -=head1 MODE - -List pools. - -=over 8 - -=item B<--filter-name> - -Filter pool name (Can be a regexp). - -=back - -=cut diff --git a/centreon-plugins/storage/netapp/ontap/restapi/mode/listpools.pm b/centreon-plugins/storage/netapp/ontap/restapi/mode/listvolumes.pm similarity index 62% rename from centreon-plugins/storage/netapp/ontap/restapi/mode/listpools.pm rename to centreon-plugins/storage/netapp/ontap/restapi/mode/listvolumes.pm index 2e3344914..598a8a1ff 100644 --- a/centreon-plugins/storage/netapp/ontap/restapi/mode/listpools.pm +++ b/centreon-plugins/storage/netapp/ontap/restapi/mode/listvolumes.pm @@ -18,13 +18,12 @@ # limitations under the License. # -package storage::emc::unisphere::restapi::mode::listpools; +package storage::netapp::ontap::restapi::mode::listvolumes; use base qw(centreon::plugins::mode); use strict; use warnings; -use storage::emc::unisphere::restapi::mode::components::resources qw($health_status); sub new { my ($class, %options) = @_; @@ -32,7 +31,6 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' }, }); return $self; @@ -46,27 +44,24 @@ sub check_options { sub manage_selection { my ($self, %options) = @_; - return $options{custom}->request_api(url_path => '/api/types/pool/instances?fields=name,health'); + return $options{custom}->request_api(url_path => '/api/storage/volumes?fields=*'); } sub run { my ($self, %options) = @_; - my $pools = $self->manage_selection(%options); - foreach (@{$pools->{entries}}) { - next if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' - && $_->{content}->{name} !~ /$self->{option_results}->{filter_name}/); - + my $volumes = $self->manage_selection(%options); + foreach (@{$volumes->{records}}) { $self->{output}->output_add(long_msg => sprintf( - '[name = %s][status = %s]', - $_->{content}->{name}, - $health_status->{ $_->{content}->{health}->{value} }, + '[name = %s][state = %s]', + $_->{name}, + $_->{state} )); } $self->{output}->output_add( severity => 'OK', - short_msg => 'List pools:' + short_msg => 'List volumes:' ); $self->{output}->display(nolabel => 1, force_ignore_perfdata => 1, force_long_output => 1); $self->{output}->exit(); @@ -75,17 +70,17 @@ sub run { sub disco_format { my ($self, %options) = @_; - $self->{output}->add_disco_format(elements => ['name', 'status']); + $self->{output}->add_disco_format(elements => ['name', 'state']); } sub disco_show { my ($self, %options) = @_; - my $pools = $self->manage_selection(%options); - foreach (@{$pools->{entries}}) { + my $volumes = $self->manage_selection(%options); + foreach (@{$volumes->{records}}) { $self->{output}->add_disco_entry( - name => $_->{content}->{name}, - status => $health_status->{ $_->{content}->{health}->{value} }, + name => $_->{name}, + state => $_->{state} ); } } @@ -96,14 +91,10 @@ __END__ =head1 MODE -List pools. +List volumes. =over 8 -=item B<--filter-name> - -Filter pool name (Can be a regexp). - =back =cut diff --git a/centreon-plugins/storage/netapp/ontap/restapi/mode/pools.pm b/centreon-plugins/storage/netapp/ontap/restapi/mode/pools.pm deleted file mode 100644 index 93b108391..000000000 --- a/centreon-plugins/storage/netapp/ontap/restapi/mode/pools.pm +++ /dev/null @@ -1,237 +0,0 @@ -# -# Copyright 2020 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::emc::unisphere::restapi::mode::pools; - -use base qw(centreon::plugins::templates::counter); - -use strict; -use warnings; -use storage::emc::unisphere::restapi::mode::components::resources qw($health_status); -use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold catalog_status_calc); - -sub custom_status_output { - my ($self, %options) = @_; - - my $msg = 'status : ' . $self->{result_values}->{status}; - return $msg; -} - -sub custom_usage_output { - my ($self, %options) = @_; - - my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); - my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_space}); - my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_space}); - my $msg = sprintf('space usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_space}, - $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_space} - ); - return $msg; -} - -sub custom_subscribed_output { - my ($self, %options) = @_; - - my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); - my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_sub}); - $self->{result_values}->{free_sub} = 0 if ($self->{result_values}->{free_sub} < 0); - $self->{result_values}->{prct_free_sub} = 0 if ($self->{result_values}->{prct_free_sub} < 0); - my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_sub}); - my $msg = sprintf('subscribed usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_sub}, - $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_sub} - ); - return $msg; -} - -sub set_counters { - my ($self, %options) = @_; - - $self->{maps_counters_type} = [ - { name => 'pool', type => 1, cb_prefix_output => 'prefix_pool_output', message_multiple => 'All pools are ok' }, - ]; - - $self->{maps_counters}->{pool} = [ - { label => 'status', threshold => 0, set => { - key_values => [ { name => 'status' }, { name => 'display' } ], - closure_custom_calc => \&catalog_status_calc, - closure_custom_output => $self->can('custom_status_output'), - closure_custom_perfdata => sub { return 0; }, - closure_custom_threshold_check => \&catalog_status_threshold, - } - }, - { label => 'usage', nlabel => 'pool.space.usage.bytes', set => { - key_values => [ { name => 'used_space' }, { name => 'free_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_usage_output'), - perfdatas => [ - { value => 'used_space', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'usage-free', nlabel => 'pool.space.free.bytes', display_ok => 0, set => { - key_values => [ { name => 'free_space' }, { name => 'used_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_usage_output'), - perfdatas => [ - { value => 'free_space', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'usage-prct', nlabel => 'pool.space.usage.percentage', display_ok => 0, set => { - key_values => [ { name => 'prct_used_space' }, { name => 'display' } ], - output_template => 'used : %.2f %%', - perfdatas => [ - { value => 'prct_used_space', template => '%.2f', min => 0, max => 100, - unit => '%', label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'subscribed', nlabel => 'pool.subscribed.usage.bytes', display_ok => 0, set => { - key_values => [ { name => 'used_sub' }, { name => 'free_sub' }, { name => 'prct_used_sub' }, { name => 'prct_free_sub' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_subscribed_output'), - perfdatas => [ - { value => 'used_sub', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'subscribed-prct', display_ok => 0, nlabel => 'pool.subscribed.usage.percentage', set => { - key_values => [ { name => 'prct_used_sub' }, { name => 'display' } ], - output_template => 'subcribed used : %.2f %%', - perfdatas => [ - { value => 'prct_used_sub', template => '%.2f', min => 0, max => 100, - unit => '%', label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - ]; -} - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); - bless $self, $class; - - $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' }, - 'unknown-status:s' => { name => 'unknown_status', default => '%{status} =~ /unknown/i' }, - 'warning-status:s' => { name => 'warning_status', default => '%{status} =~ /ok_but|degraded|minor/i' }, - 'critical-status:s' => { name => 'critical_status', default => '%{status} =~ /major|criticalnon_recoverable/i' }, - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::check_options(%options); - - $self->change_macros(macros => ['warning_status', 'critical_status', 'unknown_status']); -} - -sub prefix_pool_output { - my ($self, %options) = @_; - - return "Pool '" . $options{instance_value}->{display} . "' "; -} - -sub manage_selection { - my ($self, %options) = @_; - - my $results = $options{custom}->request_api(url_path => '/api/types/pool/instances?fields=name,sizeFree,sizeSubscribed,sizeTotal,health'); - - $self->{pool} = {}; - foreach (@{$results->{entries}}) { - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $_->{content}->{name} !~ /$self->{option_results}->{filter_name}/) { - $self->{output}->output_add(long_msg => "skipping pool '" . $_->{content}->{name} . "': no matching filter.", debug => 1); - next; - } - - my $used = $_->{content}->{sizeTotal} - $_->{content}->{sizeFree}; - $self->{pool}->{$_->{content}->{id}} = { - display => $_->{content}->{name}, - status => $health_status->{ $_->{content}->{health}->{value} }, - total_space => $_->{content}->{sizeTotal}, - used_space => $used, - free_space => $_->{content}->{sizeFree}, - prct_used_space => $used * 100 / $_->{content}->{sizeTotal}, - prct_free_space => $_->{content}->{sizeFree} * 100 / $_->{content}->{sizeTotal}, - - used_sub => $_->{content}->{sizeSubscribed}, - free_sub => $_->{content}->{sizeTotal} - $_->{content}->{sizeSubscribed}, - prct_used_sub => $_->{content}->{sizeSubscribed} * 100 / $_->{content}->{sizeTotal}, - prct_free_sub => 100 - ($_->{content}->{sizeSubscribed} * 100 / $_->{content}->{sizeTotal}), - }; - } - - if (scalar(keys %{$self->{pool}}) <= 0) { - $self->{output}->add_option_msg(short_msg => "No pool found"); - $self->{output}->option_exit(); - } -} - -1; - -__END__ - -=head1 MODE - -Check pool usages. - -=over 8 - -=item B<--filter-counters> - -Only display some counters (regexp can be used). -Example: --filter-counters='^usage$' - -=item B<--filter-name> - -Filter pool name (can be a regexp). - -=item B<--unknown-status> - -Set warning threshold for status (Default: '%{status} =~ /unknown/i'). -Can used special variables like: %{status}, %{display} - -=item B<--warning-status> - -Set warning threshold for status (Default: '%{status} =~ /ok_but|degraded|minor/i'). -Can used special variables like: %{status}, %{display} - -=item B<--critical-status> - -Set critical threshold for status (Default: '%{status} =~ /major|criticalnon_recoverable/i'). -Can used special variables like: %{status}, %{display} - -=item B<--warning-*> B<--critical-*> - -Thresholds. -Can be: 'usage' (B), 'usage-free' (B), 'usage-prct' (%), -'subscribed', 'subscribed-prct'. - -=back - -=cut diff --git a/centreon-plugins/storage/netapp/ontap/restapi/mode/storageresources.pm b/centreon-plugins/storage/netapp/ontap/restapi/mode/storageresources.pm deleted file mode 100644 index 57815a469..000000000 --- a/centreon-plugins/storage/netapp/ontap/restapi/mode/storageresources.pm +++ /dev/null @@ -1,240 +0,0 @@ -# -# Copyright 2020 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::emc::unisphere::restapi::mode::storageresources; - -use base qw(centreon::plugins::templates::counter); - -use strict; -use warnings; -use storage::emc::unisphere::restapi::mode::components::resources qw($health_status); -use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold catalog_status_calc); - -sub custom_status_output { - my ($self, %options) = @_; - - my $msg = 'status : ' . $self->{result_values}->{status}; - return $msg; -} - -sub custom_usage_output { - my ($self, %options) = @_; - - my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); - my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_space}); - my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_space}); - my $msg = sprintf('space usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_space}, - $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_space} - ); - return $msg; -} - -sub custom_allocated_output { - my ($self, %options) = @_; - - my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); - my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_alloc}); - $self->{result_values}->{free_alloc} = 0 if ($self->{result_values}->{free_alloc} < 0); - $self->{result_values}->{prct_free_alloc} = 0 if ($self->{result_values}->{prct_free_alloc} < 0); - my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_alloc}); - my $msg = sprintf('allocated usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', - $total_size_value . " " . $total_size_unit, - $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_alloc}, - $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_alloc} - ); - return $msg; -} - -sub set_counters { - my ($self, %options) = @_; - - $self->{maps_counters_type} = [ - { name => 'sr', type => 1, cb_prefix_output => 'prefix_sr_output', message_multiple => 'All storage resources are ok', skipped_code => { -10 => 1 } }, - ]; - - $self->{maps_counters}->{sr} = [ - { label => 'status', threshold => 0, set => { - key_values => [ { name => 'status' }, { name => 'display' } ], - closure_custom_calc => \&catalog_status_calc, - closure_custom_output => $self->can('custom_status_output'), - closure_custom_perfdata => sub { return 0; }, - closure_custom_threshold_check => \&catalog_status_threshold, - } - }, - { label => 'usage', nlabel => 'storageresource.space.usage.bytes', set => { - key_values => [ { name => 'used_space' }, { name => 'free_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_usage_output'), - perfdatas => [ - { value => 'used_space', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'usage-free', nlabel => 'storageresource.space.free.bytes', display_ok => 0, set => { - key_values => [ { name => 'free_space' }, { name => 'used_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_usage_output'), - perfdatas => [ - { value => 'free_space', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'usage-prct', nlabel => 'storageresource.space.usage.percentage', display_ok => 0, set => { - key_values => [ { name => 'prct_used_space' }, { name => 'display' } ], - output_template => 'used : %.2f %%', - perfdatas => [ - { value => 'prct_used_space', template => '%.2f', min => 0, max => 100, - unit => '%', label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'allocated', nlabel => 'storageresource.allocated.usage.bytes', display_ok => 0, set => { - key_values => [ { name => 'used_alloc' }, { name => 'free_alloc' }, { name => 'prct_used_alloc' }, { name => 'prct_free_alloc' }, { name => 'total_space' }, { name => 'display' }, ], - closure_custom_output => $self->can('custom_allocated_output'), - perfdatas => [ - { value => 'used_alloc', template => '%d', min => 0, max => 'total_space', - unit => 'B', cast_int => 1, label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - { label => 'allocated-prct', display_ok => 0, nlabel => 'storageresource.allocated.usage.percentage', set => { - key_values => [ { name => 'prct_used_alloc' }, { name => 'display' } ], - output_template => 'allocated used : %.2f %%', - perfdatas => [ - { value => 'prct_used_alloc', template => '%.2f', min => 0, max => 100, - unit => '%', label_extra_instance => 1, instance_use => 'display' }, - ], - } - }, - ]; -} - -sub new { - my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); - bless $self, $class; - - $options{options}->add_options(arguments => { - 'filter-name:s' => { name => 'filter_name' }, - 'unknown-status:s' => { name => 'unknown_status', default => '%{status} =~ /unknown/i' }, - 'warning-status:s' => { name => 'warning_status', default => '%{status} =~ /ok_but|degraded|minor/i' }, - 'critical-status:s' => { name => 'critical_status', default => '%{status} =~ /major|criticalnon_recoverable/i' }, - }); - - return $self; -} - -sub check_options { - my ($self, %options) = @_; - $self->SUPER::check_options(%options); - - $self->change_macros(macros => ['warning_status', 'critical_status', 'unknown_status']); -} - -sub prefix_sr_output { - my ($self, %options) = @_; - - return "Storage resource '" . $options{instance_value}->{display} . "' "; -} - -sub manage_selection { - my ($self, %options) = @_; - - my $results = $options{custom}->request_api(url_path => '/api/types/storageResource/instances?fields=name,health,sizeUsed,sizeAllocated,sizeTotal'); - - $self->{sr} = {}; - foreach (@{$results->{entries}}) { - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $_->{content}->{name} !~ /$self->{option_results}->{filter_name}/) { - $self->{output}->output_add(long_msg => "skipping storage resource '" . $_->{content}->{name} . "': no matching filter.", debug => 1); - next; - } - - $self->{sr}->{$_->{content}->{id}} = { - display => $_->{content}->{name}, - status => $health_status->{ $_->{content}->{health}->{value} }, - total_space => $_->{content}->{sizeTotal}, - }; - - if (defined($_->{content}->{sizeUsed})) { - $self->{sr}->{$_->{content}->{id}}->{used_space} = $_->{content}->{sizeUsed}; - $self->{sr}->{$_->{content}->{id}}->{free_space} = $_->{content}->{sizeTotal} - $_->{content}->{sizeUsed}; - $self->{sr}->{$_->{content}->{id}}->{prct_used_space} = $_->{content}->{sizeUsed} * 100 / $_->{content}->{sizeTotal}; - $self->{sr}->{$_->{content}->{id}}->{prct_free_space} = 100 - ($_->{content}->{sizeUsed} * 100 / $_->{content}->{sizeTotal}); - } - if (defined($_->{content}->{sizeAllocated})) { - $self->{sr}->{$_->{content}->{id}}->{used_alloc} = $_->{content}->{sizeAllocated}; - $self->{sr}->{$_->{content}->{id}}->{free_alloc} = $_->{content}->{sizeTotal} - $_->{content}->{sizeAllocated}; - $self->{sr}->{$_->{content}->{id}}->{prct_used_alloc} = $_->{content}->{sizeAllocated} * 100 / $_->{content}->{sizeTotal}; - $self->{sr}->{$_->{content}->{id}}->{prct_free_alloc} = 100 - ($_->{content}->{sizeAllocated} * 100 / $_->{content}->{sizeTotal}); - } - } - - if (scalar(keys %{$self->{sr}}) <= 0) { - $self->{output}->add_option_msg(short_msg => "No storage resource found"); - $self->{output}->option_exit(); - } -} - -1; - -__END__ - -=head1 MODE - -Check storage resources. - -=over 8 - -=item B<--filter-counters> - -Only display some counters (regexp can be used). -Example: --filter-counters='^usage$' - -=item B<--filter-name> - -Filter name (can be a regexp). - -=item B<--unknown-status> - -Set warning threshold for status (Default: '%{status} =~ /unknown/i'). -Can used special variables like: %{status}, %{display} - -=item B<--warning-status> - -Set warning threshold for status (Default: '%{status} =~ /ok_but|degraded|minor/i'). -Can used special variables like: %{status}, %{display} - -=item B<--critical-status> - -Set critical threshold for status (Default: '%{status} =~ /major|criticalnon_recoverable/i'). -Can used special variables like: %{status}, %{display} - -=item B<--warning-*> B<--critical-*> - -Thresholds. -Can be: 'usage' (B), 'usage-free' (B), 'usage-prct' (%), -'allocated', 'allocated-prct'. - -=back - -=cut diff --git a/centreon-plugins/storage/netapp/ontap/restapi/mode/volumes.pm b/centreon-plugins/storage/netapp/ontap/restapi/mode/volumes.pm new file mode 100644 index 000000000..d255c824d --- /dev/null +++ b/centreon-plugins/storage/netapp/ontap/restapi/mode/volumes.pm @@ -0,0 +1,253 @@ +# +# Copyright 2020 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::volumes; + +use base qw(centreon::plugins::templates::counter); + +use strict; +use warnings; +use centreon::plugins::templates::catalog_functions qw(catalog_status_threshold); + +sub custom_status_output { + my ($self, %options) = @_; + + return 'state: ' . $self->{result_values}->{state}; +} + +sub custom_usage_output { + my ($self, %options) = @_; + + my ($total_size_value, $total_size_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{total_space}); + my ($total_used_value, $total_used_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{used_space}); + my ($total_free_value, $total_free_unit) = $self->{perfdata}->change_bytes(value => $self->{result_values}->{free_space}); + return sprintf( + 'space usage total: %s used: %s (%.2f%%) free: %s (%.2f%%)', + $total_size_value . " " . $total_size_unit, + $total_used_value . " " . $total_used_unit, $self->{result_values}->{prct_used_space}, + $total_free_value . " " . $total_free_unit, $self->{result_values}->{prct_free_space} + ); +} + +sub prefix_volume_output { + my ($self, %options) = @_; + + return "Volume '" . $options{instance_value}->{display} . "' "; +} + +sub set_counters { + my ($self, %options) = @_; + + $self->{maps_counters_type} = [ + { name => 'volumes', type => 1, cb_prefix_output => 'prefix_volume_output', message_multiple => 'All volumes are ok' } + ]; + + $self->{maps_counters}->{volumes} = [ + { label => 'status', threshold => 0, set => { + key_values => [ { name => 'state' }, { name => 'display' } ], + closure_custom_output => $self->can('custom_status_output'), + closure_custom_perfdata => sub { return 0; }, + closure_custom_threshold_check => \&catalog_status_threshold + } + }, + { label => 'usage', nlabel => 'volume.space.usage.bytes', set => { + key_values => [ { name => 'used_space' }, { name => 'free_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], + closure_custom_output => $self->can('custom_usage_output'), + perfdatas => [ + { template => '%d', min => 0, max => 'total_space', + unit => 'B', cast_int => 1, label_extra_instance => 1 } + ] + } + }, + { label => 'usage-free', nlabel => 'volume.space.free.bytes', display_ok => 0, set => { + key_values => [ { name => 'free_space' }, { name => 'used_space' }, { name => 'prct_used_space' }, { name => 'prct_free_space' }, { name => 'total_space' }, { name => 'display' }, ], + closure_custom_output => $self->can('custom_usage_output'), + perfdatas => [ + { template => '%d', min => 0, max => 'total_space', + unit => 'B', cast_int => 1, label_extra_instance => 1 } + ] + } + }, + { label => 'usage-prct', nlabel => 'pool.space.usage.percentage', display_ok => 0, set => { + key_values => [ { name => 'prct_used_space' }, { name => 'display' } ], + output_template => 'space used: %.2f %%', + perfdatas => [ + { template => '%.2f', min => 0, max => 100, + unit => '%', label_extra_instance => 1 } + ] + } + }, + { label => 'read', nlabel => 'volume.io.read.usage.bytespersecond', display_ok => 0, set => { + key_values => [ { name => 'read' } ], + output_template => 'read: %s %s/s', + output_change_bytes => 1, + perfdatas => [ + { template => '%d', unit => 'B/s' } + ] + } + }, + { label => 'write', nlabel => 'volume.io.write.usage.bytespersecond', display_ok => 0, set => { + key_values => [ { name => 'write' } ], + output_template => 'write: %s %s/s', + output_change_bytes => 1, + perfdatas => [ + { template => '%d', unit => 'B/s', min => 0 } + ] + } + }, + { label => 'read-iops', nlabel => 'system.io.read.usage.iops', set => { + key_values => [ { name => 'read_iops' } ], + output_template => 'read iops: %s', + perfdatas => [ + { template => '%s', unit => 'iops', min => 0 } + ] + } + }, + { label => 'write-iops', nlabel => 'volume.io.write.usage.iops', set => { + key_values => [ { name => 'write_iops' } ], + output_template => 'write iops: %s', + perfdatas => [ + { template => '%s', unit => 'iops', min => 0 } + ] + } + }, + { label => 'read-latency', nlabel => 'volume.io.read.latency.milliseconds', set => { + key_values => [ { name => 'read_latency' } ], + output_template => 'read latency: %s ms', + perfdatas => [ + { template => '%s', unit => 'ms', min => 0 } + ] + } + }, + { label => 'write-latency', nlabel => 'volume.io.write.latency.milliseconds', set => { + key_values => [ { name => 'write_latency' } ], + output_template => 'write latency: %s ms', + perfdatas => [ + { template => '%s', unit => 'ms', min => 0 } + ] + } + } + ]; +} + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + bless $self, $class; + + $options{options}->add_options(arguments => { + 'filter-name:s' => { name => 'filter_name' }, + 'unknown-status:s' => { name => 'unknown_status', default => '' }, + 'warning-status:s' => { name => 'warning_status', default => '' }, + 'critical-status:s' => { name => 'critical_status', default => '%{state} !~ /online/i' } + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::check_options(%options); + + $self->change_macros(macros => ['warning_status', 'critical_status', 'unknown_status']); +} + +sub manage_selection { + my ($self, %options) = @_; + + my $volumes = $options{custom}->request_api(url_path => '/api/storage/volumes?fields=*'); + + $self->{volumes} = {}; + foreach (@{$volumes->{records}}) { + if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && + $_->{name} !~ /$self->{option_results}->{filter_name}/) { + $self->{output}->output_add(long_msg => "skipping volume '" . $_->{name} . "': no matching filter.", debug => 1); + next; + } + + $self->{volumes}->{ $_->{name} } = { + display => $_->{name}, + state => $_->{state}, + + total_space => $_->{space}->{size}, + used_space => $_->{space}->{used}, + free_space => $_->{space}->{available}, + prct_used_space => $_->{space}->{used} * 100 / $_->{space}->{size}, + prct_free_space => $_->{space}->{available} * 100 / $_->{space}->{size}, + + read => $_->{metric}->{throughput}->{read}, + write => $_->{metric}->{throughput}->{write}, + read_iops => $_->{metric}->{iops}->{read}, + write_iops => $_->{metric}->{iops}->{write}, + read_latency => $_->{metric}->{latency}->{read}, + write_latency => $_->{metric}->{latency}->{write} + }; + } + + if (scalar(keys %{$self->{volumes}}) <= 0) { + $self->{output}->add_option_msg(short_msg => "No volume found"); + $self->{output}->option_exit(); + } +} + +1; + +__END__ + +=head1 MODE + +Check volumes. + +=over 8 + +=item B<--filter-counters> + +Only display some counters (regexp can be used). +Example: --filter-counters='^usage$' + +=item B<--filter-name> + +Filter volume name (can be a regexp). + +=item B<--unknown-status> + +Set unknown threshold for status. +Can used special variables like: %{state}, %{display} + +=item B<--warning-status> + +Set warning threshold for status. +Can used special variables like: %{state}, %{display} + +=item B<--critical-status> + +Set critical threshold for status (Default: '%{state} !~ /online/i'). +Can used special variables like: %{state}, %{display} + +=item B<--warning-*> B<--critical-*> + +Thresholds. +Can be: 'usage' (B), 'usage-free' (B), 'usage-prct' (%), +'read' (B/s), 'read-iops', 'write' (B/s), 'write-iops', +'read-latency' (ms), 'write-latency' (ms). + +=back + +=cut diff --git a/centreon-plugins/storage/netapp/ontap/restapi/plugin.pm b/centreon-plugins/storage/netapp/ontap/restapi/plugin.pm index f9e1a1b1c..c91f12773 100644 --- a/centreon-plugins/storage/netapp/ontap/restapi/plugin.pm +++ b/centreon-plugins/storage/netapp/ontap/restapi/plugin.pm @@ -31,7 +31,9 @@ sub new { $self->{version} = '0.1'; $self->{modes} = { - 'hardware' => 'storage::netapp::ontap::restapi::mode::hardware' + 'hardware' => 'storage::netapp::ontap::restapi::mode::hardware', + 'list-volumes' => 'storage::netapp::ontap::restapi::mode::listvolumes', + 'volumes' => 'storage::netapp::ontap::restapi::mode::volumes' }; $self->{custom_modes}{api} = 'storage::netapp::ontap::restapi::custom::api';