Hi,

the attached test cases show some small problems with uninitialized values.
Please use them only in a test environment. It might destroy pools, VMs or 
backup jobs.

On Thu, Dec 12, 2019 at 11:27:44AM +0100, Aaron Lauterer wrote:
> +     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};
> +     }
Maybe something like s/$jobs/$cronjobs/ or required_id=$param->{id}? If we 
could make
the difference between j, job, jobs, $vzconf->{jobs} a little clearer that 
would be nice.
> +     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'));
> +     }
When reading this I would have to know the whole context to know why there is 
no else.
I personally would rather write

if ($job->{pool}) {
        ...
} else {
        # now $job->{vmid} is defined
}

or as you did further below

if () {
} elsif () {
} else {
 # must not happen, throw some error
}
> +
> +     # 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};
> +             }
Same question as elsif above

> +         }
> +     }
> +
> +     @vmids = sort {$a <=> $b} @vmids;
> +
> +     # prepare API response
This is already clear from the variable name for me.

> +     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";
Neither ... nor ... ?
Nontheless, this is whole section is very clearly written IMO :)
> +         }
> +
> +         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
> 
_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to