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.
This commit is contained in:
@ -43,7 +43,7 @@ __PACKAGE__->register_method ({
|
|||||||
name => 'jobs',
|
name => 'jobs',
|
||||||
path => 'jobs',
|
path => 'jobs',
|
||||||
method => 'GET',
|
method => 'GET',
|
||||||
description => "List of all replication jobs.",
|
description => "List replication jobs.",
|
||||||
permissions => {
|
permissions => {
|
||||||
user => 'all',
|
user => 'all',
|
||||||
},
|
},
|
||||||
@ -53,26 +53,13 @@ __PACKAGE__->register_method ({
|
|||||||
additionalProperties => 0,
|
additionalProperties => 0,
|
||||||
properties => {
|
properties => {
|
||||||
node => get_standard_option('pve-node'),
|
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' },
|
returns => { type => 'object' },
|
||||||
code => sub {
|
code => sub {
|
||||||
my ($param) = @_;
|
my ($param) = @_;
|
||||||
|
|
||||||
if ($param->{nodes}) {
|
return PVE::ReplicationTools::get_all_jobs();
|
||||||
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);
|
|
||||||
}});
|
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|||||||
@ -21,28 +21,23 @@ sub setup_environment {
|
|||||||
PVE::RPCEnvironment->setup_default_cli_env();
|
PVE::RPCEnvironment->setup_default_cli_env();
|
||||||
}
|
}
|
||||||
|
|
||||||
my $print_list = sub {
|
my $print_job_list = sub {
|
||||||
my ($conf, $json) = @_;
|
my ($conf) = @_;
|
||||||
|
|
||||||
if (defined($json)) {
|
printf("%-10s%-20s%-20s%-5s%-10s%-5s\n",
|
||||||
print JSON::encode_json($conf);
|
"VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL");
|
||||||
} else {
|
|
||||||
printf("%-10s%-20s%-20s%-5s%-10s%-5s\n",
|
|
||||||
"VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL");
|
|
||||||
|
|
||||||
foreach my $vmid (sort keys %$conf) {
|
foreach my $vmid (sort keys %$conf) {
|
||||||
my $job = $conf->{$vmid};
|
my $job = $conf->{$vmid};
|
||||||
my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync}));
|
my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync}));
|
||||||
|
|
||||||
printf("%-9s ", $vmid);
|
printf("%-9s ", $vmid);
|
||||||
printf("%-19s ", $job->{tnode});
|
printf("%-19s ", $job->{tnode});
|
||||||
printf("%-19s ", $timestr);
|
printf("%-19s ", $timestr);
|
||||||
printf("%-4s ", $job->{interval});
|
printf("%-4s ", $job->{interval});
|
||||||
printf("%-9s ", $job->{state});
|
printf("%-9s ", $job->{state});
|
||||||
printf("%-9s\n", $job->{fail});
|
printf("%-9s\n", $job->{fail});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
sub set_list {
|
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 = {
|
our $cmddef = {
|
||||||
list => [ __PACKAGE__ , 'list' , [], {node => $nodename}],
|
jobs => [ 'PVE::API2::Storage::Replication', 'jobs' , [],
|
||||||
|
{node => $nodename}, $print_job_list ],
|
||||||
run => [ __PACKAGE__ , 'run'],
|
run => [ __PACKAGE__ , 'run'],
|
||||||
destroyjob => [ __PACKAGE__ , 'destroyjob', ['vmid']],
|
destroyjob => [ __PACKAGE__ , 'destroyjob', ['vmid']],
|
||||||
};
|
};
|
||||||
|
|||||||
@ -85,57 +85,32 @@ sub get_node_ip {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub get_all_jobs {
|
sub get_all_jobs {
|
||||||
my ($nodes) = @_;
|
|
||||||
|
|
||||||
my @nodelist = PVE::Tools::split_list($nodes);
|
|
||||||
|
|
||||||
my $vms = PVE::Cluster::get_vmlist();
|
my $vms = PVE::Cluster::get_vmlist();
|
||||||
|
|
||||||
my $state = read_state();
|
my $state = read_state();
|
||||||
|
|
||||||
my $jobs = {};
|
my $jobs = {};
|
||||||
|
|
||||||
my $outfunc = sub {
|
foreach my $vmid (keys %{$vms->{ids}}) {
|
||||||
my $line = shift;
|
next if $vms->{ids}->{$vmid}->{node} ne $local_node;
|
||||||
|
|
||||||
my $remote_jobs = JSON::decode_json($line);
|
my $vm_state = $state->{$vmid};
|
||||||
foreach my $vmid (keys %$remote_jobs) {
|
next if !defined($vm_state);
|
||||||
$jobs->{$vmid} = $remote_jobs->{$vmid};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach my $node (@nodelist) {
|
my $job = {};
|
||||||
if ($local_node ne $node) {
|
|
||||||
|
|
||||||
my $ip = get_node_ip($node);
|
$job->{limit} = $vm_state->{limit};
|
||||||
$ip = [$ip] if Net::IP::ip_is_ipv6($ip);
|
$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", '--',
|
$jobs->{$vmid} = $job;
|
||||||
'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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($jobs);
|
return $jobs;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub sync_guest {
|
sub sync_guest {
|
||||||
|
|||||||
Reference in New Issue
Block a user