pve-manager/PVE/API2/Cluster/MetricServer.pm
Thomas Lamprecht d57f8d9482 ui/api: metrics: move server to subpath, post to path with ID
We actually wanted to use that scheme for more new API paths, lets
see if it is really fitting starting with this.

Use the new widget-toolkit submitUrl helper to add the ID on create.

And unify the edit/create window creation, which may fit better in a
separate commit, it's quite small and was to cumbersome to untangle,
so just go against my one rules here... :(

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2020-11-21 20:53:05 +01:00

258 lines
5.7 KiB
Perl

package PVE::API2::Cluster::MetricServer;
use warnings;
use strict;
use PVE::Tools qw(extract_param);
use PVE::Exception qw(raise_perm_exc raise_param_exc);
use PVE::JSONSchema qw(get_standard_option);
use PVE::RPCEnvironment;
use PVE::ExtMetric;
use PVE::RESTHandler;
use base qw(PVE::RESTHandler);
__PACKAGE__->register_method ({
name => 'index',
path => '',
method => 'GET',
description => "Metrics index.",
permissions => { user => 'all' },
parameters => {
additionalProperties => 0,
properties => {},
},
returns => {
type => 'array',
items => {
type => "object",
properties => {},
},
links => [ { rel => 'child', href => "{name}" } ],
},
code => sub {
my ($param) = @_;
my $result = [
{ name => 'server' },
];
return $result;
}
});
__PACKAGE__->register_method ({
name => 'server_index',
path => 'server',
method => 'GET',
description => "List configured metric servers.",
permissions => {
check => ['perm', '/', ['Sys.Audit']],
},
parameters => {
additionalProperties => 0,
properties => {},
},
returns => {
type => 'array',
items => {
type => "object",
properties => {
id => {
description => "The ID of the entry.",
type => 'string'
},
disable => {
description => "Flag to disable the plugin.",
type => 'boolean',
},
type => {
description => "Plugin type.",
type => 'string',
},
server => {
description => "Server dns name or IP address",
type => 'string',
},
port => {
description => "Server network port",
type => 'integer',
},
},
},
links => [ { rel => 'child', href => "{id}" } ],
},
code => sub {
my ($param) = @_;
my $res = [];
my $status_cfg = PVE::Cluster::cfs_read_file('status.cfg');
for my $id (sort keys %{$status_cfg->{ids}}) {
my $plugin_config = $status_cfg->{ids}->{$id};
push @$res, {
id => $id,
disable => $plugin_config->{disable} // 0,
type => $plugin_config->{type},
server => $plugin_config->{server},
port => $plugin_config->{port},
};
}
return $res;
}});
__PACKAGE__->register_method ({
name => 'read',
path => 'server/{id}',
method => 'GET',
description => "Read metric server configuration.",
permissions => {
check => ['perm', '/', ['Sys.Audit']],
},
parameters => {
additionalProperties => 0,
properties => {
id => {
type => 'string',
format => 'pve-configid',
},
},
},
returns => { type => 'object' },
code => sub {
my ($param) = @_;
my $status_cfg = PVE::Cluster::cfs_read_file('status.cfg');
my $id = $param->{id};
if (!defined($status_cfg->{ids}->{$id})) {
die "status server entry '$id' does not exist\n";
}
return $status_cfg->{ids}->{$id};
}});
__PACKAGE__->register_method ({
name => 'create',
path => 'server/{id}',
protected => 1,
method => 'POST',
description => "Create a new external metric server config",
permissions => {
check => ['perm', '/', ['Sys.Modify']],
},
parameters => PVE::Status::Plugin->createSchema(),
returns => { type => 'null' },
code => sub {
my ($param) = @_;
my $type = extract_param($param, 'type');
my $plugin = PVE::Status::Plugin->lookup($type);
my $id = extract_param($param, 'id');
PVE::Cluster::cfs_lock_file('status.cfg', undef, sub {
my $cfg = PVE::Cluster::cfs_read_file('status.cfg');
die "Metric server '$id' already exists\n"
if $cfg->{ids}->{$id};
my $opts = $plugin->check_config($id, $param, 1, 1);
$cfg->{ids}->{$id} = $opts;
PVE::Cluster::cfs_write_file('status.cfg', $cfg);
});
die $@ if $@;
return;
}});
__PACKAGE__->register_method ({
name => 'update',
protected => 1,
path => 'server/{id}',
method => 'PUT',
description => "Update metric server configuration.",
permissions => {
check => ['perm', '/', ['Sys.Modify']],
},
parameters => PVE::Status::Plugin->updateSchema(),
returns => { type => 'null' },
code => sub {
my ($param) = @_;
my $id = extract_param($param, 'id');
my $digest = extract_param($param, 'digest');
my $delete = extract_param($param, 'delete');
PVE::Cluster::cfs_lock_file('status.cfg', undef, sub {
my $cfg = PVE::Cluster::cfs_read_file('status.cfg');
PVE::SectionConfig::assert_if_modified($cfg, $digest);
my $data = $cfg->{ids}->{$id};
die "no such server '$id'\n" if !$data;
my $plugin = PVE::Status::Plugin->lookup($data->{type});
my $opts = $plugin->check_config($id, $param, 0, 1);
for my $k (keys %$opts) {
$data->{$k} = $opts->{$k};
}
if ($delete) {
my $options = $plugin->private()->{options}->{$data->{type}};
for my $k (PVE::Tools::split_list($delete)) {
my $d = $options->{$k} || die "no such option '$k'\n";
die "unable to delete required option '$k'\n" if !$d->{optional};
die "unable to delete fixed option '$k'\n" if $d->{fixed};
delete $data->{$k};
}
}
PVE::Cluster::cfs_write_file('status.cfg', $cfg);
});
die $@ if $@;
return;
}});
__PACKAGE__->register_method ({
name => 'delete',
protected => 1,
path => 'server/{id}',
method => 'DELETE',
description => "Remove Metric server.",
permissions => {
check => ['perm', '/', ['Sys.Modify']],
},
parameters => {
additionalProperties => 0,
properties => {
id => {
type => 'string',
format => 'pve-configid',
},
}
},
returns => { type => 'null' },
code => sub {
my ($param) = @_;
PVE::Cluster::cfs_lock_file('status.cfg', undef, sub {
my $cfg = PVE::Cluster::cfs_read_file('status.cfg');
my $id = $param->{id};
delete $cfg->{ids}->{$id};
PVE::Cluster::cfs_write_file('status.cfg', $cfg);
});
die $@ if $@;
return;
}});
1;