]> git.proxmox.com Git - pve-manager.git/commitdiff
api2/cluster: add 'metricserver' api endpoints
authorDominik Csapak <d.csapak@proxmox.com>
Fri, 20 Nov 2020 14:12:27 +0000 (15:12 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 21 Nov 2020 19:39:33 +0000 (20:39 +0100)
modeled after our typical api endpoints for sectionschema configs

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
PVE/API2/Cluster.pm
PVE/API2/Cluster/Makefile
PVE/API2/Cluster/MetricServerConfig.pm [new file with mode: 0644]

index e768cbc6552a87d82887ff0c4b4e2b5a2655026a..4b570e75ab6dba95d08af7af9c0b2c1f928eee11 100644 (file)
@@ -25,6 +25,7 @@ use PVE::API2::ACMEPlugin;
 use PVE::API2::Backup;
 use PVE::API2::BackupInfo;
 use PVE::API2::Cluster::Ceph;
+use PVE::API2::Cluster::MetricServerConfig;
 use PVE::API2::ClusterConfig;
 use PVE::API2::Firewall::Cluster;
 use PVE::API2::HAConfig;
@@ -43,6 +44,11 @@ __PACKAGE__->register_method ({
     path => 'replication',
 });
 
+__PACKAGE__->register_method ({
+    subclass => "PVE::API2::Cluster::MetricServerConfig",
+    path => 'metricserver',
+});
+
 __PACKAGE__->register_method ({
     subclass => "PVE::API2::ClusterConfig",
     path => 'config',
@@ -132,6 +138,7 @@ __PACKAGE__->register_method ({
            { name => 'config' },
            { name => 'acme' },
            { name => 'ceph' },
+           { name => 'metricserver' },
            ];
 
        if ($have_sdn) {
index 8d8388c784f3eaae0c2d87710829643a70f59154..3f11006f07e0e4f26ac10c88e295ea230bc5dcf1 100644 (file)
@@ -3,6 +3,7 @@ include ../../../defines.mk
 # for node independent, cluster-wide applicable, API endpoints
 # ensure we do not conflict with files shipped by pve-cluster!!
 PERLSOURCE=                    \
+       MetricServerConfig.pm   \
        Ceph.pm
 
 all:
diff --git a/PVE/API2/Cluster/MetricServerConfig.pm b/PVE/API2/Cluster/MetricServerConfig.pm
new file mode 100644 (file)
index 0000000..28bb58c
--- /dev/null
@@ -0,0 +1,228 @@
+package PVE::API2::Cluster::MetricServerConfig;
+
+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 => "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 => '{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 => '',
+    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 => '{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 => '{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;