]> git.proxmox.com Git - pve-manager.git/blob - test/replication_test5.pl
Fix #352: Limit the length of backup logs for mails
[pve-manager.git] / test / replication_test5.pl
1 #!/usr/bin/perl
2
3 # Note:
4 # 1.) Start replication job with single disk
5 # 2.) add non-existent disk (replication fails)
6 # 3.) create disk (replication continues).
7 # 4.) remove job
8
9 use strict;
10 use warnings;
11 use JSON;
12
13 use lib ('.', '../..');
14
15 use Data::Dumper;
16
17 use Test::MockModule;
18 use ReplicationTestEnv;
19
20 use PVE::Tools;
21
22 $ReplicationTestEnv::mocked_nodename = 'node1';
23
24 use PVE::INotify;
25 use PVE::Cluster;
26 use PVE::QemuConfig;
27 use PVE::QemuServer;
28 use PVE::LXC::Config;
29 use PVE::LXC;
30 use PVE::Storage;
31
32 my $replicated_volume_status = {};
33
34 my $mocked_remote_prepare_local_job = sub {
35 my ($ssh_info, $jobid, $vmid, $volumes, $storeid_list, $last_sync, $parent_snapname, $force) = @_;
36
37 my $target = $ssh_info->{node};
38
39 my $last_snapshots = {};
40
41 return $last_snapshots if !defined($replicated_volume_status->{$target});
42
43 my $last_sync_snapname = PVE::ReplicationState::replication_snapshot_name($jobid, $last_sync);
44
45 foreach my $volid (keys %{$replicated_volume_status->{$target}}) {
46 if (!grep { $_ eq $volid } @$volumes) {
47 delete $replicated_volume_status->{$target}->{$volid};
48 next;
49 }
50 my $snapname = $replicated_volume_status->{$target}->{$volid};
51
52 $last_snapshots->{$volid}->{$snapname} = 1 if $last_sync_snapname eq $snapname;
53 }
54
55 return $last_snapshots;
56 };
57
58 my $mocked_remote_finalize_local_job = sub {
59 my ($ssh_info, $jobid, $vmid, $volumes, $last_sync) = @_;
60
61 # do nothing
62 };
63
64 my $mocked_replicate_volume = sub {
65 my ($ssh_info, $storecfg, $volid, $base_snapshot, $sync_snapname) = @_;
66
67 my $target = $ssh_info->{node};
68
69 $replicated_volume_status->{$target}->{$volid} = $sync_snapname;
70 };
71
72 my $mocked_delete_job = sub {
73 my ($jobid) = @_;
74
75 delete $ReplicationTestEnv::mocked_replication_jobs->{$jobid};
76 };
77
78 my $pve_replication_config_module = Test::MockModule->new('PVE::ReplicationConfig');
79 $pve_replication_config_module->mock(delete_job => $mocked_delete_job);
80
81 my $pve_replication_module = Test::MockModule->new('PVE::Replication');
82 $pve_replication_module->mock(
83 remote_prepare_local_job => $mocked_remote_prepare_local_job,
84 remote_finalize_local_job => $mocked_remote_finalize_local_job,
85 replicate_volume => $mocked_replicate_volume);
86
87 my $testjob = {
88 'type' => 'local',
89 'target' => 'node1',
90 'guest' => 900,
91 };
92
93 $ReplicationTestEnv::mocked_replication_jobs = {
94 job_900_to_node2 => {
95 'type' => 'local',
96 'target' => 'node2',
97 'guest' => 900,
98 },
99 };
100
101 $ReplicationTestEnv::mocked_vm_configs = {
102 900 => {
103 node => 'node1',
104 snapshots => {},
105 ide0 => 'local-zfs:vm-900-disk-1,size=4G',
106 memory => 512,
107 ide2 => 'none,media=cdrom',
108 },
109 };
110
111 ReplicationTestEnv::setup();
112
113 ReplicationTestEnv::register_mocked_volid('local-zfs:vm-900-disk-1');
114
115 my $ctime = 1000;
116
117 my $status;
118
119 ReplicationTestEnv::openlog();
120
121 for (my $i = 0; $i < 15; $i++) {
122 ReplicationTestEnv::track_jobs($ctime);
123 $ctime += 60;
124 }
125
126 # add a new, disk (but disk does not exist, so replication fails)
127 $ReplicationTestEnv::mocked_vm_configs->{900}->{ide1} = 'local-zfs:vm-900-disk-2,size=4G';
128 for (my $i = 0; $i < 15; $i++) {
129 ReplicationTestEnv::track_jobs($ctime);
130 $ctime += 60;
131 }
132
133 # register disk, so replication should succeed
134 ReplicationTestEnv::register_mocked_volid('local-zfs:vm-900-disk-2');
135 for (my $i = 0; $i < 15; $i++) {
136 ReplicationTestEnv::track_jobs($ctime);
137 $ctime += 60;
138 }
139
140 # mark job for removal
141 $ReplicationTestEnv::mocked_replication_jobs->{job_900_to_node2}->{remove_job} = 'full';
142 for (my $i = 0; $i < 15; $i++) {
143 ReplicationTestEnv::track_jobs($ctime);
144 $ctime += 60;
145 }
146
147
148
149 ReplicationTestEnv::commit_log();
150
151 exit(0);