]>
Commit | Line | Data |
---|---|---|
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 | |
9 | use strict; | |
10 | use warnings; | |
11 | use JSON; | |
12 | ||
13 | use lib ('.', '../..'); | |
14 | ||
7f6ff9dd DM |
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 { | |
91ee6a2f | 33 | my ($ssh_info, $jobid, $vmid, $volumes, $storeid_list, $last_sync, $parent_snapname, $force) = @_; |
7f6ff9dd DM |
34 | |
35 | my $target = $ssh_info->{node}; | |
36 | ||
37 | my $last_snapshots = {}; | |
38 | ||
39 | return $last_snapshots if !defined($replicated_volume_status->{$target}); | |
40 | ||
9b24b5d4 | 41 | my $last_sync_snapname = PVE::ReplicationState::replication_snapshot_name($jobid, $last_sync); |
7f6ff9dd DM |
42 | |
43 | foreach my $volid (keys %{$replicated_volume_status->{$target}}) { | |
20f5ac24 DM |
44 | if (!grep { $_ eq $volid } @$volumes) { |
45 | delete $replicated_volume_status->{$target}->{$volid}; | |
46 | next; | |
47 | } | |
7f6ff9dd DM |
48 | my $snapname = $replicated_volume_status->{$target}->{$volid}; |
49 | ||
91ee6a2f | 50 | $last_snapshots->{$volid}->{$snapname} = 1 if $last_sync_snapname eq $snapname; |
7f6ff9dd DM |
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 | ||
20f5ac24 DM |
70 | my $mocked_delete_job = sub { |
71 | my ($jobid) = @_; | |
72 | ||
73 | delete $ReplicationTestEnv::mocked_replication_jobs->{$jobid}; | |
74 | }; | |
75 | ||
d092dc4f DM |
76 | my $pve_replication_config_module = Test::MockModule->new('PVE::ReplicationConfig'); |
77 | $pve_replication_config_module->mock(delete_job => $mocked_delete_job); | |
78 | ||
7f6ff9dd DM |
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 | ||
20f5ac24 DM |
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 | ||
7f6ff9dd DM |
147 | ReplicationTestEnv::commit_log(); |
148 | ||
149 | exit(0); |