[pve-devel] [PATCH pve-manager 14/18] pvesr finalize-local-job: add helper to cleanup job
Fabian Grünbichler
f.gruenbichler at proxmox.com
Mon May 29 08:12:51 CEST 2017
this is a one to one copy of the prepare path with some bits inbetween
missing - IMHO the common parts should be shared?
On Tue, May 23, 2017 at 09:08:53AM +0200, Dietmar Maurer wrote:
> This will be called after replication on the target node. For now, this
> just removes old snapshots.
>
> Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
> ---
> PVE/CLI/pvesr.pm | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 69 insertions(+)
>
> diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm
> index 78d69747..f1c54a6b 100644
> --- a/PVE/CLI/pvesr.pm
> +++ b/PVE/CLI/pvesr.pm
> @@ -120,6 +120,74 @@ __PACKAGE__->register_method ({
> }});
>
> __PACKAGE__->register_method ({
> + name => 'finalize_local_job',
> + path => 'finalize_local_job',
> + method => 'POST',
> + description => "Finalize a replication job. This removes all replications snapshots with timestamps different than <last_sync>.",
> + parameters => {
> + additionalProperties => 0,
> + properties => {
> + id => get_standard_option('pve-replication-id'),
> + vmid => get_standard_option('pve-vmid', { completion => \&PVE::Cluster::complete_vmid }),
> + 'extra-args' => get_standard_option('extra-args', {
> + description => "The list of volume IDs to consider." }),
> + last_sync => {
> + description => "Time (UNIX epoch) of last successful sync. If not specified, all replication snapshots gets removed.",
> + type => 'integer',
> + minimum => 0,
> + optional => 1,
> + },
> + },
> + },
> + returns => { type => 'null' },
> + code => sub {
> + my ($param) = @_;
> +
> + my $jobid = $param->{id};
> + my $vmid = $param->{vmid};
> + my $last_sync = $param->{last_sync} // 0;
> +
> + my $local_node = PVE::INotify::nodename();
> +
> + my $vms = PVE::Cluster::get_vmlist();
> + die "guest '$vmid' is on local node\n"
> + if $vms->{ids}->{$vmid} && $vms->{ids}->{$vmid}->{node} eq $local_node;
> +
> + my $storecfg = PVE::Storage::config();
> +
> + my $volids = [];
> +
> + die "no volumes specified\n" if !scalar(@{$param->{'extra-args'}});
> +
> + foreach my $volid (@{$param->{'extra-args'}}) {
> +
> + my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid);
> + my $scfg = PVE::Storage::storage_check_enabled($storecfg, $storeid, $local_node);
> + die "storage '$storeid' is a shared storage\n" if $scfg->{shared};
> +
> + my ($vtype, undef, $ownervm) = PVE::Storage::parse_volname($storecfg, $volid);
> + die "volume '$volid' has wrong vtype ($vtype != 'images')\n"
> + if $vtype ne 'images';
> + die "volume '$volid' has wrong owner\n"
> + if !$ownervm || $vmid != $ownervm;
> +
> + push @$volids, $volid;
> + }
> +
> + $volids = [ sort @$volids ];
> +
> + my $logfunc = sub {
> + my ($start_time, $msg) = @_;
> + print STDERR "$msg\n";
> + };
> +
> + my $last_snapshots = PVE::Replication::prepare(
> + $storecfg, $volids, $jobid, $last_sync, undef, $logfunc);
> +
> + return undef;
> + }});
> +
> +__PACKAGE__->register_method ({
> name => 'run',
> path => 'run',
> method => 'POST',
> @@ -269,6 +337,7 @@ our $cmddef = {
> disable => [ __PACKAGE__, 'disable', ['id'], {}],
>
> 'prepare-local-job' => [ __PACKAGE__, 'prepare_local_job', ['id', 'vmid', 'extra-args'], {} ],
> + 'finalize-local-job' => [ __PACKAGE__, 'finalize_local_job', ['id', 'vmid', 'extra-args'], {} ],
>
> run => [ __PACKAGE__ , 'run'],
> };
> --
> 2.11.0
>
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
More information about the pve-devel
mailing list