From e0992d57e17b594f4a346b2aed9a2b9e03802e08 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Fri, 5 May 2017 10:31:51 +0200 Subject: [PATCH] pvesr: rename list => jobs, call API to avoid code duplication. I also removed the functioanlity to query jobs on other nodes, because it is clumsy and not really needed. --- PVE/API2/Storage/Replication.pm | 19 ++----- PVE/CLI/pvesr.pm | 87 ++++++--------------------------- PVE/ReplicationTools.pm | 55 ++++++--------------- 3 files changed, 33 insertions(+), 128 deletions(-) diff --git a/PVE/API2/Storage/Replication.pm b/PVE/API2/Storage/Replication.pm index a33d5cc..9123f22 100644 --- a/PVE/API2/Storage/Replication.pm +++ b/PVE/API2/Storage/Replication.pm @@ -43,7 +43,7 @@ __PACKAGE__->register_method ({ name => 'jobs', path => 'jobs', method => 'GET', - description => "List of all replication jobs.", + description => "List replication jobs.", permissions => { user => 'all', }, @@ -53,26 +53,13 @@ __PACKAGE__->register_method ({ additionalProperties => 0, properties => { node => get_standard_option('pve-node'), - nodes => get_standard_option('pve-node-list' , - {description => "Notes where the jobs is located.", - optional => 1}), }, }, returns => { type => 'object' }, code => sub { my ($param) = @_; - if ($param->{nodes}) { - foreach my $node (PVE::Tools::split_list($param->{nodes})) { - die "Node: $node does not exists.\n" if - !PVE::Cluster::check_node_exists($node); - } - } - - my $nodes = $param->{nodes} ? - $param->{nodes} : $param->{node}; - - return PVE::ReplicationTools::get_all_jobs($nodes); -}}); + return PVE::ReplicationTools::get_all_jobs(); + }}); 1; diff --git a/PVE/CLI/pvesr.pm b/PVE/CLI/pvesr.pm index 59321e2..0f4f5c7 100644 --- a/PVE/CLI/pvesr.pm +++ b/PVE/CLI/pvesr.pm @@ -21,28 +21,23 @@ sub setup_environment { PVE::RPCEnvironment->setup_default_cli_env(); } -my $print_list = sub { - my ($conf, $json) = @_; +my $print_job_list = sub { + my ($conf) = @_; - if (defined($json)) { - print JSON::encode_json($conf); - } else { - printf("%-10s%-20s%-20s%-5s%-10s%-5s\n", - "VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL"); + printf("%-10s%-20s%-20s%-5s%-10s%-5s\n", + "VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL"); - foreach my $vmid (sort keys %$conf) { - my $job = $conf->{$vmid}; - my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync})); + foreach my $vmid (sort keys %$conf) { + my $job = $conf->{$vmid}; + my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync})); - printf("%-9s ", $vmid); - printf("%-19s ", $job->{tnode}); - printf("%-19s ", $timestr); - printf("%-4s ", $job->{interval}); - printf("%-9s ", $job->{state}); - printf("%-9s\n", $job->{fail}); - } + printf("%-9s ", $vmid); + printf("%-19s ", $job->{tnode}); + printf("%-19s ", $timestr); + printf("%-4s ", $job->{interval}); + printf("%-9s ", $job->{state}); + printf("%-9s\n", $job->{fail}); } - }; sub set_list { @@ -157,63 +152,11 @@ __PACKAGE__->register_method ({ }}); -__PACKAGE__->register_method ({ - name => 'list', - path => 'list', - method => 'GET', - description => "List of all replication jobs.", - permissions => { - user => 'all' - }, - protected => 1, - parameters => { - additionalProperties => 0, - properties => { - vmid => { - type => 'string', format => 'pve-vmid', - description => "The VMID of the guest.", - completion => \&PVE::Cluster::complete_local_vmid, - }, - }, - }, - protected => 1, - proxyto => 'node', - parameters => { - additionalProperties => 0, - properties => { - node => get_standard_option('pve-node'), - nodes => get_standard_option('pve-node-list' , - {description => "Notes where the jobs is located.", - optional => 1}), - json => { - optional => 1, - type => 'boolean', - description => "Output in JSON format.", - }, - }, - }, - returns => { type => 'string' }, - code => sub { - my ($param) = @_; - - if ($param->{nodes}) { - foreach my $node (PVE::Tools::split_list($param->{nodes})) { - die "Node: $node does not exists.\n" if - !PVE::Cluster::check_node_exists($node); - } - } - - my $nodes = $param->{nodes} ? - $param->{nodes} : $param->{node}; - - my $list = PVE::ReplicationTools::get_all_jobs($nodes); - - &$print_list($list, $param->{json}); -}}); our $cmddef = { - list => [ __PACKAGE__ , 'list' , [], {node => $nodename}], + jobs => [ 'PVE::API2::Storage::Replication', 'jobs' , [], + {node => $nodename}, $print_job_list ], run => [ __PACKAGE__ , 'run'], destroyjob => [ __PACKAGE__ , 'destroyjob', ['vmid']], }; diff --git a/PVE/ReplicationTools.pm b/PVE/ReplicationTools.pm index 7b6590c..86f7e01 100644 --- a/PVE/ReplicationTools.pm +++ b/PVE/ReplicationTools.pm @@ -85,57 +85,32 @@ sub get_node_ip { } sub get_all_jobs { - my ($nodes) = @_; - - my @nodelist = PVE::Tools::split_list($nodes); my $vms = PVE::Cluster::get_vmlist(); + my $state = read_state(); + my $jobs = {}; - my $outfunc = sub { - my $line = shift; + foreach my $vmid (keys %{$vms->{ids}}) { + next if $vms->{ids}->{$vmid}->{node} ne $local_node; - my $remote_jobs = JSON::decode_json($line); - foreach my $vmid (keys %$remote_jobs) { - $jobs->{$vmid} = $remote_jobs->{$vmid}; - } - }; + my $vm_state = $state->{$vmid}; + next if !defined($vm_state); - foreach my $node (@nodelist) { - if ($local_node ne $node) { + my $job = {}; - my $ip = get_node_ip($node); - $ip = [$ip] if Net::IP::ip_is_ipv6($ip); + $job->{limit} = $vm_state->{limit}; + $job->{interval} = $vm_state->{interval}; + $job->{tnode} = $vm_state->{tnode}; + $job->{lastsync} = $vm_state->{lastsync}; + $job->{state} = $vm_state->{state}; + $job->{fail} = $vm_state->{fail}; - my @cmd = ('ssh', '-o', 'Batchmode=yes', "root\@$ip", '--', - 'pvesr', 'list', '--json'); - - run_command([@cmd], outfunc=>$outfunc) - - } else { - - foreach my $vmid (keys %{$vms->{ids}}) { - - next if !($vms->{ids}->{$vmid}->{node} eq $local_node); - next if !defined($state->{$vmid}); - my $vm_state = $state->{$vmid}; - my $job = {}; - - $job->{limit} = $vm_state->{limit}; - $job->{interval} = $vm_state->{interval}; - $job->{tnode} = $vm_state->{tnode}; - $job->{lastsync} = $vm_state->{lastsync}; - $job->{state} = $vm_state->{state}; - $job->{fail} = $vm_state->{fail}; - - $jobs->{$vmid} = $job; - } - - } + $jobs->{$vmid} = $job; } - return ($jobs); + return $jobs; } sub sync_guest {