From e07be088149c0f49401e355ecc95119c0405c137 Mon Sep 17 00:00:00 2001 From: Simon Bomm Date: Thu, 8 Sep 2022 10:21:54 +0200 Subject: [PATCH] (plugin) cloud::azure::management::costs - add list-budget mode (#3887) * (plugin) cloud::azure::management::costs - add list-budget mode * + align with convention * Fix typo in foreach --- centreon-plugins/cloud/azure/custom/api.pm | 19 ++++ .../azure/management/costs/mode/budgets.pm | 36 +++--- .../management/costs/mode/listbudgets.pm | 103 ++++++++++++++++++ .../cloud/azure/management/costs/plugin.pm | 3 +- 4 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 centreon-plugins/cloud/azure/management/costs/mode/listbudgets.pm diff --git a/centreon-plugins/cloud/azure/custom/api.pm b/centreon-plugins/cloud/azure/custom/api.pm index 7a7b17a9e..5294a8131 100644 --- a/centreon-plugins/cloud/azure/custom/api.pm +++ b/centreon-plugins/cloud/azure/custom/api.pm @@ -810,6 +810,25 @@ sub azure_get_budget { return $response; } +sub azure_list_budget_set_url { + my ($self, %options) = @_; + + my $url = $self->{management_endpoint} . "/subscriptions/" . $self->{subscription}; + $url .= "/providers/Microsoft.Consumption/budgets"; + $url .= "?api-version=" . $self->{api_version}; + + return $url; +} + +sub azure_list_budget { + my ($self, %options) = @_; + + my $full_url = $self->azure_list_budget_set_url(%options); + my $response = $self->request_api(method => 'GET', full_url => $full_url, hostname => ''); + + return $response; +} + sub azure_get_usagedetails_set_url { my ($self, %options) = @_; diff --git a/centreon-plugins/cloud/azure/management/costs/mode/budgets.pm b/centreon-plugins/cloud/azure/management/costs/mode/budgets.pm index 21a60203e..56b7c4b2f 100644 --- a/centreon-plugins/cloud/azure/management/costs/mode/budgets.pm +++ b/centreon-plugins/cloud/azure/management/costs/mode/budgets.pm @@ -108,11 +108,11 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - "budget-name:s" => { name => 'budget_name' }, - "resource-group:s" => { name => 'resource_group' }, - "lookup-days:s" => { name => 'lookup_days', default => 30 }, - "units:s" => { name => 'units', default => '%' }, - "timeout:s" => { name => 'timeout', default => '60' }, + "budget-name:s" => { name => 'budget_name' }, + "resource-group:s" => { name => 'resource_group' }, + "lookup-days:s" => { name => 'lookup_days', default => 30 }, + "units:s" => { name => 'units', default => '%' }, + "timeout:s" => { name => 'timeout', default => '60' }, }); return $self; @@ -123,8 +123,8 @@ sub check_options { $self->SUPER::check_options(%options); if (!defined($self->{option_results}->{budget_name}) || $self->{option_results}->{budget_name} eq '') { - $self->{output}->add_option_msg(short_msg => "Need to specify --budget-name option"); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "Need to specify --budget-name option"); + $self->{output}->option_exit(); } $self->{lookup_days} = $self->{option_results}->{lookup_days}; @@ -135,36 +135,36 @@ sub manage_selection { my $budget = $options{custom}->azure_get_budget( resource_group => $self->{option_results}->{resource_group}, - budget_name => $self->{option_results}->{budget_name} + budget_name => $self->{option_results}->{budget_name} ); my $usage_start = DateTime->now()->add(days => - $self->{option_results}->{lookup_days} + 1); my $usage_end = DateTime->now(); my $costs = $options{custom}->azure_get_usagedetails( - resource_group => $self->{option_results}->{resource_group}, - usage_start => $usage_start, - usage_end => $usage_end + resource_group => $self->{option_results}->{resource_group}, + usage_start => $usage_start, + usage_end => $usage_end ); my $cost = 0; for (my $i = 0; $costs->[$i]; $i++) { - $cost += $costs->[$i]->{properties}->{cost}; + $cost += $costs->[$i]->{properties}->{cost}; } if (!$budget) { - $self->{output}->add_option_msg(short_msg => "No " . $self->{option_results}->{budget_name} . " found (or missing permissions)"); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "No " . $self->{option_results}->{budget_name} . " found (or missing permissions)"); + $self->{output}->option_exit(); } if (!$costs || $cost < 0.01) { - $self->{output}->add_option_msg(short_msg => "Null or < 0.01 " . $budget->{properties}->{currentSpend}->{unit} . " cost found on the specified scope."); - $self->{output}->option_exit(); + $self->{output}->add_option_msg(short_msg => "Null or < 0.01 " . $budget->{properties}->{currentSpend}->{unit} . " cost found on the specified scope."); + $self->{output}->option_exit(); } $self->{currency} = $budget->{properties}->{currentSpend}->{unit}; $self->{cost} = { - cost => $cost, - budget => $budget->{properties}->{amount}, + cost => $cost, + budget => $budget->{properties}->{amount}, }; } diff --git a/centreon-plugins/cloud/azure/management/costs/mode/listbudgets.pm b/centreon-plugins/cloud/azure/management/costs/mode/listbudgets.pm new file mode 100644 index 000000000..82ca5e2ec --- /dev/null +++ b/centreon-plugins/cloud/azure/management/costs/mode/listbudgets.pm @@ -0,0 +1,103 @@ +# +# Copyright 2021 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 cloud::azure::management::costs::mode::listbudgets; + +use base qw(centreon::plugins::mode); + +use strict; +use warnings; + +sub new { + my ($class, %options) = @_; + my $self = $class->SUPER::new(package => __PACKAGE__, %options); + bless $self, $class; + + $options{options}->add_options(arguments => { + }); + + return $self; +} + +sub check_options { + my ($self, %options) = @_; + $self->SUPER::init(%options); +} + +sub manage_selection { + my ($self, %options) = @_; + + $self->{budget} = $options{custom}->azure_list_budget(); + +} + +sub run { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $budget (@{$self->{budget}->{value}) { + $self->{output}->output_add( + long_msg => sprintf("[budget = %s][category = %s][amount = %s][timegrain = %s][id = %s]", + $budget->{name}, $budget->{properties}->{category}, $budget->{properties}->{amount}, $budget->{properties}->{timeGrain}, $budget->{id}) + ); + } + + $self->{output}->output_add( + severity => 'OK', + short_msg => 'List budgets:' + ); + $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 => ['id', 'name', 'category', 'amount', 'timegrain']); +} + +sub disco_show { + my ($self, %options) = @_; + + $self->manage_selection(%options); + foreach my $budget (@{$self->{budget}->value}) { + $self->{output}->add_disco_entry( + name => $budget->{name}, + category => $budget->{properties}->{category}, + amount => $budget->{properties}->{amount}, + timegrain => $budget->{properties}->{timeGrain}, + id => $budget->{id} + ); + } +} + +1; + +__END__ + +=head1 MODE + +List Azure budgets. + +=over 8 + +=back + +=cut \ No newline at end of file diff --git a/centreon-plugins/cloud/azure/management/costs/plugin.pm b/centreon-plugins/cloud/azure/management/costs/plugin.pm index 134690fd1..f51a01728 100644 --- a/centreon-plugins/cloud/azure/management/costs/plugin.pm +++ b/centreon-plugins/cloud/azure/management/costs/plugin.pm @@ -31,7 +31,8 @@ sub new { $self->{version} = '0.1'; %{ $self->{modes} } = ( - 'budgets' => 'cloud::azure::management::costs::mode::budgets' + 'budgets' => 'cloud::azure::management::costs::mode::budgets', + 'list-budgets' => 'cloud::azure::management::costs::mode::listbudgets' ); $self->{custom_modes}{api} = 'cloud::azure::custom::api';