]> git.proxmox.com Git - pve-manager.git/blob - test/replication_test5.pl
ui: guest import: fine-tune paddings and heights in advanced tab
[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 Test::MockModule;
16 use ReplicationTestEnv;
17
18 use PVE::Tools;
19
20 $ReplicationTestEnv::mocked_nodename = 'node1';
21
22 use PVE::INotify;
23 use PVE::Cluster;
24 use PVE::QemuConfig;
25 use PVE::QemuServer;
26 use PVE::LXC::Config;
27 use PVE::LXC;
28 use PVE::Storage;
29
30 my $replicated_volume_status = {};
31
32 my $mocked_remote_prepare_local_job = sub {
33 my ($ssh_info, $jobid, $vmid, $volumes, $storeid_list, $last_sync, $parent_snapname, $force) = @_;
34
35 my $target = $ssh_info->{node};
36
37 my $last_snapshots = {};
38
39 return $last_snapshots if !defined($replicated_volume_status->{$target});
40
41 my $last_sync_snapname = PVE::ReplicationState::replication_snapshot_name($jobid, $last_sync);
42
43 foreach my $volid (keys %{$replicated_volume_status->{$target}}) {
44 if (!grep { $_ eq $volid } @$volumes) {
45 delete $replicated_volume_status->{$target}->{$volid};
46 next;
47 }
48 my $snapname = $replicated_volume_status->{$target}->{$volid};
49
50 $last_snapshots->{$volid}->{$snapname} = 1 if $last_sync_snapname eq $snapname;
51 }
52
53 return $last_snapshots;
54 };
55
56 my $mocked_remote_finalize_local_job = sub {
57 my ($ssh_info, $jobid, $vmid, $volumes, $last_sync) = @_;
58
59 # do nothing
60 };
61
62 my $mocked_replicate_volume = sub {
63 my ($ssh_info, $storecfg, $volid, $base_snapshot, $sync_snapname) = @_;
64
65 my $target = $ssh_info->{node};
66
67 $replicated_volume_status->{$target}->{$volid} = $sync_snapname;
68 };
69
70 my $mocked_delete_job = sub {
71 my ($jobid) = @_;
72
73 delete $ReplicationTestEnv::mocked_replication_jobs->{$jobid};
74 };
75
76 my $pve_replication_config_module = Test::MockModule->new('PVE::ReplicationConfig');
77 $pve_replication_config_module->mock(delete_job => $mocked_delete_job);
78
79 my $pve_replication_module = Test::MockModule->new('PVE::Replication');
80 $pve_replication_module->mock(
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
85 my $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
109 ReplicationTestEnv::setup();
110
111 ReplicationTestEnv::register_mocked_volid('local-zfs:vm-900-disk-1');
112
113 my $ctime = 1000;
114
115 my $status;
116
117 ReplicationTestEnv::openlog();
118
119 for (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';
126 for (my $i = 0; $i < 15; $i++) {
127 ReplicationTestEnv::track_jobs($ctime);
128 $ctime += 60;
129 }
130
131 # register disk, so replication should succeed
132 ReplicationTestEnv::register_mocked_volid('local-zfs:vm-900-disk-2');
133 for (my $i = 0; $i < 15; $i++) {
134 ReplicationTestEnv::track_jobs($ctime);
135 $ctime += 60;
136 }
137
138 # mark job for removal
139 $ReplicationTestEnv::mocked_replication_jobs->{job_900_to_node2}->{remove_job} = 'full';
140 for (my $i = 0; $i < 15; $i++) {
141 ReplicationTestEnv::track_jobs($ctime);
142 $ctime += 60;
143 }
144
145
146
147 ReplicationTestEnv::commit_log();
148
149 exit(0);