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