]> git.proxmox.com Git - pve-storage.git/blame - PVE/CLI/pvesr.pm
PVE::API2::Storage::Replication->jobs(): return array
[pve-storage.git] / PVE / CLI / pvesr.pm
CommitLineData
663510b8
WL
1package PVE::CLI::pvesr;
2
3use strict;
4use warnings;
76c35814 5use POSIX qw(strftime);
663510b8 6
663510b8
WL
7use PVE::JSONSchema qw(get_standard_option);
8use PVE::INotify;
9use PVE::RPCEnvironment;
10use PVE::Tools qw(extract_param);
11use PVE::SafeSyslog;
12use PVE::CLIHandler;
76c35814
DM
13
14use PVE::API2::Storage::Replication;
663510b8
WL
15
16use base qw(PVE::CLIHandler);
17
18my $nodename = PVE::INotify::nodename();
19
20sub setup_environment {
21 PVE::RPCEnvironment->setup_default_cli_env();
22}
23
e0992d57 24my $print_job_list = sub {
339ca30a 25 my ($list) = @_;
e0992d57
DM
26
27 printf("%-10s%-20s%-20s%-5s%-10s%-5s\n",
28 "VMID", "DEST", "LAST SYNC","IVAL", "STATE", "FAIL");
29
339ca30a
DM
30 foreach my $job (sort { $a->{vmid} <=> $b->{vmid} } @$list) {
31
e0992d57
DM
32 my $timestr = strftime("%Y-%m-%d_%H:%M:%S", localtime($job->{lastsync}));
33
339ca30a 34 printf("%-9s ", $job->{vmid});
e0992d57
DM
35 printf("%-19s ", $job->{tnode});
36 printf("%-19s ", $timestr);
37 printf("%-4s ", $job->{interval});
38 printf("%-9s ", $job->{state});
39 printf("%-9s\n", $job->{fail});
663510b8 40 }
663510b8
WL
41};
42
43sub set_list {
44 my ($list, $synctime, $vmid) = @_;
45
46 if (defined($list->{$synctime})) {
47 $list = set_list($list,$synctime+1, $vmid);
48 } else {
49 $list->{$synctime} = $vmid;
50 }
51 return $list;
52}
53
54my $get_replica_list = sub {
55
56 my $jobs = PVE::ReplicationTools::read_state();
57 my $list = {};
58
59 foreach my $vmid (keys %$jobs) {
60 my $job = $jobs->{$vmid};
61 my $lastsync = $job->{lastsync};
62
63 # interval in min
64 my $interval = $job->{interval};
65 my $now = time();
66 my $fail = $job->{fail};
67
68 my $synctime = $lastsync + $interval * 60;
69
70 if ($now >= $synctime && $job->{state} eq 'ok') {
71 $list = set_list($list, $synctime, $vmid);
72 } elsif ($job->{state} eq 'sync') {
73
74 my $synctime += $interval * ($job->{fail}+1);
75 $list = set_list($list, $synctime, $vmid)
76 if ($now >= $synctime);
77
78 }
79 }
80
81 return $list;
82};
83
84my $replicate_vms = sub {
85 my ($list) = @_;
86
87 my @sorted_times = reverse sort keys %$list;
88
89 foreach my $synctime (@sorted_times) {
90 eval {
91 PVE::ReplicationTools::sync_guest($list->{$synctime});
92 };
93 if (my $err = $@) {
94 syslog ('err', $err );
95 }
96 }
97};
98
99__PACKAGE__->register_method ({
100 name => 'run',
101 path => 'run',
102 method => 'POST',
103 description => "This method will run by the systemd-timer and sync all jobs",
104 permissions => {
105 description => {
106 check => ['perm', '/', [ 'Sys.Console' ]],
107 },
108 },
109 protected => 1,
110 parameters => {
111 additionalProperties => 0,
112 properties => {
113 },
114 },
115 returns => { type => 'null' },
116 code => sub {
117
118 my $list = &$get_replica_list();
119 &$replicate_vms($list);
120
121 return undef;
122 }});
123
124__PACKAGE__->register_method ({
125 name => 'destroyjob',
126 path => 'destroyjob',
127 method => 'DELETE',
128 description => "Destroy an async replication job",
129 permissions => {
130 description => {
131 check => ['perm', '/storage', ['Datastore.Allocate']],
132 },
133 },
134 protected => 1,
135 parameters => {
136 additionalProperties => 0,
137 properties => {
138 vmid => {
139 type => 'string', format => 'pve-vmid',
140 description => "The VMID of the guest.",
141 completion => \&PVE::Cluster::complete_local_vmid,
142 },
143 },
144 },
145 returns => { type => 'null' },
146 code => sub {
147 my ($param) = @_;
148
149 my $vmid = extract_param($param, 'vmid');
150
151 PVE::ReplicationTools::destroy_replica($vmid);
152
153 }});
154
663510b8
WL
155
156
157our $cmddef = {
e0992d57
DM
158 jobs => [ 'PVE::API2::Storage::Replication', 'jobs' , [],
159 {node => $nodename}, $print_job_list ],
663510b8
WL
160 run => [ __PACKAGE__ , 'run'],
161 destroyjob => [ __PACKAGE__ , 'destroyjob', ['vmid']],
162};
163
1641;