From: Aaron Lauterer <a.lauterer@proxmox.com>
To: pve-devel@pve.proxmox.com
Subject: [pve-devel] [PATCH v4 manager 4/5] fix #2609 api: backupinfo: add non job specific endpoint
Date: Tue, 7 Jul 2020 11:49:01 +0200 [thread overview]
Message-ID: <20200707094902.24712-5-a.lauterer@proxmox.com> (raw)
In-Reply-To: <20200707094902.24712-1-a.lauterer@proxmox.com>
Adds a new api endpoint at cluster/backupinfo for cluster wide backup
stuff. This is necessary because cluster/backup expects a backup job ID
at the next level and thus other endpoints are hard to impossible to
implement under that hierarchy.
The only api endpoint available for now is the `not_backed_up` which
returns a list of all guests which are not covered by any backup job.
The top level index endpoint is left unsused for now to be available for
a more generic summary endpoint in the future.
Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
---
v2 -> v4: (v3 was skipped to align version number to the rest of the
series)
* renamed from `backupsummary` to `backupinfo`
* changed endpoint from `included_status` to `not_backed_up` as we only
need to show guests not covered by any job instead of all guests and
their status
* incorporated a few code style changes such as creating the object to
be pushed to the return array at the push operation instead of way
before
v1->v2:
* incorporated feedback for the other API endpoint that is also valid
here
* changed double negative for permissions `not_all_permissions` to
`permissions_for_all`
* adapted to latest changes in return value of `get_included_guests`
* created two new method which merge and flatten the info from all
backup jobs
* renamed some vars to more descriptive names
* return VMIDs as int
* reworded some API descriptions
* added stub endpoint for root endpoint
PVE/API2/BackupInfo.pm | 145 +++++++++++++++++++++++++++++++++++++++++
PVE/API2/Cluster.pm | 6 ++
PVE/API2/Makefile | 1 +
3 files changed, 152 insertions(+)
create mode 100644 PVE/API2/BackupInfo.pm
diff --git a/PVE/API2/BackupInfo.pm b/PVE/API2/BackupInfo.pm
new file mode 100644
index 00000000..909a5de1
--- /dev/null
+++ b/PVE/API2/BackupInfo.pm
@@ -0,0 +1,145 @@
+package PVE::API2::BackupInfo;
+
+use strict;
+use warnings;
+use Digest::SHA;
+
+use PVE::SafeSyslog;
+use PVE::Tools qw(extract_param);
+use PVE::Cluster qw(cfs_lock_file cfs_read_file cfs_write_file);
+use PVE::RESTHandler;
+use PVE::RPCEnvironment;
+use PVE::JSONSchema;
+use PVE::Storage;
+use PVE::Exception qw(raise_param_exc);
+use PVE::VZDump;
+use PVE::VZDump::Common;
+
+use base qw(PVE::RESTHandler);
+
+sub map_job_vmids {
+ my ($job_included_guests, $included_vmids) = @_;
+
+ for my $node_vmids (values %{$job_included_guests}) {
+ for my $vmid (@{$node_vmids}) {
+ $included_vmids->{$vmid} = 1;
+ }
+ }
+
+ return $included_vmids;
+}
+
+sub get_included_vmids {
+ my $included_vmids = {};
+ my $vzconf = cfs_read_file('vzdump.cron');
+
+ my $all_jobs = $vzconf->{jobs} || [];
+
+ for my $job (@$all_jobs) {
+ my $job_included_guests = PVE::VZDump::get_included_guests($job);
+ $included_vmids = map_job_vmids($job_included_guests, $included_vmids);
+ }
+
+ return $included_vmids;
+}
+
+__PACKAGE__->register_method({
+ name => 'get_backupinfo',
+ path => '',
+ method => 'GET',
+ protected => 1,
+ description => "Stub, waits for future use.",
+ parameters => {
+ additionalProperties => 0,
+ properties => {},
+ },
+ returns => {
+ type => 'string',
+ description => 'Shows stub message',
+ },
+ code => sub {
+ return "Stub endpoint. There is nothing here yet.";
+ }});
+
+__PACKAGE__->register_method({
+ name => 'get_guests_not_in_backup',
+ path => 'not_backed_up',
+ method => 'GET',
+ protected => 1,
+ description => "Shows all guests which are not covered by any backup job.",
+ permissions => {
+ check => ['perm', '/', ['Sys.Audit']],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {},
+ },
+ returns => {
+ type => 'array',
+ description => 'Contains the guest objects.',
+ items => {
+ type => 'object',
+ properties => {
+ vmid => {
+ type => 'integer',
+ description => 'VMID of the guest.',
+ },
+ name => {
+ type => 'string',
+ description => 'Name of the guest',
+ optional => 1,
+ },
+ type => {
+ type => 'string',
+ description => 'Type of the guest.',
+ enum => ['qemu', 'lxc'],
+ },
+ },
+ },
+ },
+ code => sub {
+ my $rpcenv = PVE::RPCEnvironment::get();
+ my $user = $rpcenv->get_user();
+ my $rrd = PVE::Cluster::rrd_dump();
+ my $included_vmids = get_included_vmids();
+ my $vmlist = PVE::Cluster::get_vmlist();
+ my @vmids = ( keys %{$vmlist->{ids}} );
+
+ # remove VMIDs to which the user has no permission to not leak infos
+ # like the guest name
+ my @allowed_vmids = grep {
+ $rpcenv->check($user, "/vms/$_", [ 'VM.Audit' ], 1);
+ } @vmids;
+
+ my $result = [];
+
+ for my $vmid (@allowed_vmids) {
+
+ next if $included_vmids->{$vmid};
+
+ my $type = $vmlist->{ids}->{$vmid}->{type};
+ my $node = $vmlist->{ids}->{$vmid}->{node};
+
+ my $conf;
+ my $name = "";
+
+ if ($type eq 'qemu') {
+ $conf = PVE::QemuConfig->load_config($vmid, $node);
+ $name = $conf->{name};
+ } elsif ($type eq 'lxc') {
+ $conf = PVE::LXC::Config->load_config($vmid, $node);
+ $name = $conf->{hostname};
+ } else {
+ die "VMID $vmid is neither Qemu nor LXC guest\n";
+ }
+
+ push @{$result}, {
+ vmid => int($vmid),
+ name => $name,
+ type => $type,
+ };
+ }
+
+ return $result;
+ }});
+1;
diff --git a/PVE/API2/Cluster.pm b/PVE/API2/Cluster.pm
index 062ca849..e768cbc6 100644
--- a/PVE/API2/Cluster.pm
+++ b/PVE/API2/Cluster.pm
@@ -23,6 +23,7 @@ use PVE::Tools qw(extract_param);
use PVE::API2::ACMEAccount;
use PVE::API2::ACMEPlugin;
use PVE::API2::Backup;
+use PVE::API2::BackupInfo;
use PVE::API2::Cluster::Ceph;
use PVE::API2::ClusterConfig;
use PVE::API2::Firewall::Cluster;
@@ -57,6 +58,11 @@ __PACKAGE__->register_method ({
path => 'backup',
});
+__PACKAGE__->register_method ({
+ subclass => "PVE::API2::BackupInfo",
+ path => 'backupinfo',
+});
+
__PACKAGE__->register_method ({
subclass => "PVE::API2::HAConfig",
path => 'ha',
diff --git a/PVE/API2/Makefile b/PVE/API2/Makefile
index 28ecc070..bc5ccc36 100644
--- a/PVE/API2/Makefile
+++ b/PVE/API2/Makefile
@@ -10,6 +10,7 @@ PERLSOURCE = \
Subscription.pm \
VZDump.pm \
Backup.pm \
+ BackupInfo.pm \
Cluster.pm \
HAConfig.pm \
Nodes.pm \
--
2.20.1
next prev parent reply other threads:[~2020-07-07 9:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-07 9:48 [pve-devel] [PATCH v4 manager 0/5] add backup detail and not backed up view Aaron Lauterer
2020-07-07 9:48 ` [pve-devel] [PATCH v4 manager 1/5] api: backup: add endpoint to list included guests and volumes Aaron Lauterer
2020-07-08 7:11 ` Thomas Lamprecht
2020-07-08 7:21 ` Aaron Lauterer
2020-07-07 9:48 ` [pve-devel] [PATCH v4 manager 2/5] gui: dc/backup: move renderers to Utils.js Aaron Lauterer
2020-07-07 9:49 ` [pve-devel] [PATCH v4 manager 3/5] gui: dc/backup: add new backup job detail view Aaron Lauterer
2020-07-07 9:49 ` Aaron Lauterer [this message]
2020-07-07 9:49 ` [pve-devel] [PATCH v4 manager 5/5] fix #2609 gui: backup: add window for not backed guests Aaron Lauterer
2020-07-09 18:06 ` [pve-devel] applied-series: Re: [PATCH v4 manager 0/5] add backup detail and not backed up view Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200707094902.24712-5-a.lauterer@proxmox.com \
--to=a.lauterer@proxmox.com \
--cc=pve-devel@pve.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal