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