This endpoint provides information if disks and mountpoints of guests are
included in a VZDump job.

The returned object is formatted to be used with the TreePanel of ExtJS.

Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com>
---

Unfortunately the logic of which disk / mp will be included is deeply
engrained in the LXC and Qemu VZDump plugins and hard to use outside.
Since AFAIU there are not that many cases I implemented the checks
again.

 PVE/API2/Backup.pm | 168 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 168 insertions(+)

diff --git a/PVE/API2/Backup.pm b/PVE/API2/Backup.pm
index 86377c0a..e7baaa3b 100644
--- a/PVE/API2/Backup.pm
+++ b/PVE/API2/Backup.pm
@@ -324,4 +324,172 @@ __PACKAGE__->register_method({
        die "$@" if ($@);
     }});
 
+__PACKAGE__->register_method({
+    name => 'get_disk_status',
+    path => '{id}/included_disks',
+    method => 'GET',
+    protected => 1,
+    description => "Shows included guests and the backup status of their 
disks.",
+    permissions => {
+       check => ['perm', '/', ['Sys.Audit']],
+    },
+    parameters => {
+       additionalProperties => 0,
+       properties => {
+           id => $vzdump_job_id_prop
+       },
+    },
+    returns => {
+       type => 'object',
+       properties => {
+           children => {
+               type => 'array',
+               items => {
+                   type => 'object',
+                   properties => {
+                       id => {
+                           type => 'string',
+                           description => 'ID of the guest.',
+                       },
+                       type => {
+                           type => 'string',
+                           description => 'Type of the guest, VM or CT.',
+                       },
+                       children => {
+                           type => 'array',
+                           description => 'The disks or mount points of the 
guest with the information if they will be included in backups.',
+                           items => {
+                               type => 'object',
+                               properties => {
+                                   id => {
+                                       type => 'string',
+                                       description => 'Name of the disk or 
mount point.',
+                                   },
+                                   status => {
+                                       type => 'string',
+                                       description => 'The included status of 
the disk or mount point.',
+                                   },
+                               },
+                           },
+                       },
+                   },
+               },
+           },
+       },
+    },
+    code => sub {
+       my ($param) = @_;
+
+       my $vzconf = cfs_read_file('vzdump.cron');
+       my $jobs = $vzconf->{jobs} || [];
+       my $job;
+
+       foreach my $j (@$jobs) {
+           $job = $j if $j->{id} eq $param->{id};
+       }
+       raise_param_exc({ id => "No such job '$param->{id}'" }) if !$job;
+
+       my @vmids;
+       my $vmlist = PVE::Cluster::get_vmlist();
+
+       # get VMIDs from pool or selected individual guests
+       if ($job->{pool}) {
+           @vmids = 
@{PVE::API2Tools::get_resource_pool_guest_members($job->{pool})};
+       } elsif ($job->{vmid}) {
+           @vmids = PVE::Tools::split_list(extract_param($job, 'vmid'));
+       }
+
+       # get excluded guests
+       my @exclude = PVE::Tools::split_list(extract_param($job, 'exclude'));
+       @exclude = @{PVE::VZDump::check_vmids(@exclude)};
+       @vmids = @{PVE::VZDump::check_vmids(@vmids)};
+
+       my $excludehash = { map { $_ => 1 } @exclude };
+
+       # no list of guests? (from pool or manually)
+       # get all except excluded
+       if (!@vmids) {
+           if ($job->{all} && $job->{node}) {
+               foreach my $id (keys %{ $vmlist->{ids} }) {
+                   push @vmids, $id
+                       if $vmlist->{ids}->{$id}->{node} eq $job->{node} && 
!$excludehash->{$id};
+               }
+           } elsif ($job->{all}) {
+               foreach my $id (keys %{ $vmlist->{ids} }) {
+                   push @vmids, $id if !$excludehash->{$id};
+               }
+           }
+       }
+
+       @vmids = sort {$a <=> $b} @vmids;
+
+       # prepare API response
+       my $result = {
+           children => [],
+           leaf => 0,
+       };
+
+       foreach (@vmids) {
+           my $id = $_;
+           my $type = $vmlist->{ids}->{$id}->{type};
+           my $node = $vmlist->{ids}->{$id}->{node};
+
+           my $guest = {
+               id => $id,
+               children => [],
+               leaf => 0,
+           };
+
+           if ($type eq 'qemu') {
+               my $conf = PVE::QemuConfig->load_config($id, $node);
+
+               $guest->{id} = $guest->{id} . " " . $conf->{name};
+               $guest->{type} = 'VM';
+
+               PVE::QemuServer::foreach_drive($conf, sub {
+                       my ($key, $attr) = @_;
+
+                       return if PVE::QemuServer::drive_is_cdrom($attr);
+
+                       my $status = 'true';
+
+                       $status = 'false' if (exists($attr->{backup}) && 
!$attr->{backup});
+
+                       my $disk = {
+                           id => $key . ' - '. $attr->{file},
+                           status => $status,
+                           leaf => 1,
+                       };
+                       push @{$guest->{children}}, $disk;
+               });
+           } elsif ($type eq 'lxc') {
+               my $conf = PVE::LXC::Config->load_config($id, $node);
+
+               $guest->{id} = $guest->{id} . " " . $conf->{hostname};
+               $guest->{type} = 'CT';
+
+               PVE::LXC::Config->foreach_mountpoint($conf, sub {
+                       my ($key, $attr) = @_;
+
+                       my $status = 'false';
+
+                       $status = 'true' if ($key eq 'rootfs' || 
(exists($attr->{backup}) && $attr->{backup}));
+                       $status = 'not possible' if ($attr->{type} ne 'volume');
+
+                       my $disk = {
+                           id => $key . ' - '. $attr->{volume},
+                           status => $status,
+                           leaf => 1,
+                       };
+                       push @{$guest->{children}}, $disk;
+               });
+           } else {
+               die "VMID $id is not Qemu nor LXC guest\n";
+           }
+
+           push @{$result->{children}}, $guest;
+       }
+
+       return $result;
+    }});
 1;
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to