1 package MigrationTest
::Shared
;
8 use Socket
qw(AF_INET);
11 use PVE
::Tools
qw(file_set_contents file_get_contents lock_file_full);
13 my $RUN_DIR_PATH = $ENV{RUN_DIR_PATH
} or die "no RUN_DIR_PATH set\n";
15 my $storage_config = decode_json
(file_get_contents
("${RUN_DIR_PATH}/storage_config"));
16 my $replication_config = decode_json
(file_get_contents
("${RUN_DIR_PATH}/replication_config"));
17 my $fail_config = decode_json
(file_get_contents
("${RUN_DIR_PATH}/fail_config"));
18 my $migrate_params = decode_json
(file_get_contents
("${RUN_DIR_PATH}/migrate_params"));
19 my $test_vmid = $migrate_params->{vmid
};
23 sub add_target_volid
{
26 PVE
::Storage
::parse_volume_id
($volid);
28 lock_file_full
("${RUN_DIR_PATH}/target_volids.lock", undef, 0, sub {
29 my $target_volids = decode_json
(file_get_contents
("${RUN_DIR_PATH}/target_volids"));
30 die "target volid already present " if defined($target_volids->{$volid});
31 $target_volids->{$volid} = 1;
32 file_set_contents
("${RUN_DIR_PATH}/target_volids", to_json
($target_volids));
37 sub remove_target_volid
{
40 PVE
::Storage
::parse_volume_id
($volid);
42 lock_file_full
("${RUN_DIR_PATH}/target_volids.lock", undef, 0, sub {
43 my $target_volids = decode_json
(file_get_contents
("${RUN_DIR_PATH}/target_volids"));
44 die "target volid does not exist " if !defined($target_volids->{$volid});
45 delete $target_volids->{$volid};
46 file_set_contents
("${RUN_DIR_PATH}/target_volids", to_json
($target_volids));
51 my $mocked_cfs_read_file = sub {
54 if ($file eq 'datacenter.cfg') {
56 } elsif ($file eq 'replication.cfg') {
57 return $replication_config;
59 die "cfs_read_file (mocked) - implement me: $file\n";
64 our $cgroup_module = Test
::MockModule-
>new("PVE::CGroup");
71 our $cluster_module = Test
::MockModule-
>new("PVE::Cluster");
72 $cluster_module->mock(
73 cfs_read_file
=> $mocked_cfs_read_file,
74 check_cfs_quorum
=> sub {
79 our $mapping_usb_module = Test
::MockModule-
>new("PVE::Mapping::USB");
80 $mapping_usb_module->mock(
86 our $mapping_pci_module = Test
::MockModule-
>new("PVE::Mapping::PCI");
87 $mapping_pci_module->mock(
93 our $ha_config_module = Test
::MockModule-
>new("PVE::HA::Config");
94 $ha_config_module->mock(
95 vm_is_ha_managed
=> sub {
100 our $qemu_config_module = Test
::MockModule-
>new("PVE::QemuConfig");
101 $qemu_config_module->mock(
102 assert_config_exists_on_node
=> sub {
106 my ($class, $vmid, $node) = @_;
107 die "trying to load wrong config: '$vmid'\n" if $vmid ne $test_vmid;
108 return decode_json
(file_get_contents
("${RUN_DIR_PATH}/vm_config"));
110 lock_config
=> sub { # no use locking here because lock is local to node
111 my ($self, $vmid, $code, @param) = @_;
112 return $code->(@param);
114 write_config
=> sub {
115 my ($class, $vmid, $conf) = @_;
116 die "trying to write wrong config: '$vmid'\n" if $vmid ne $test_vmid;
117 file_set_contents
("${RUN_DIR_PATH}/vm_config", to_json
($conf));
121 our $qemu_server_cloudinit_module = Test
::MockModule-
>new("PVE::QemuServer::Cloudinit");
122 $qemu_server_cloudinit_module->mock(
123 generate_cloudinitconfig
=> sub {
128 our $qemu_server_module = Test
::MockModule-
>new("PVE::QemuServer");
129 $qemu_server_module->mock(
130 clear_reboot_request
=> sub {
133 get_efivars_size
=> sub {
138 our $replication_module = Test
::MockModule-
>new("PVE::Replication");
139 $replication_module->mock(
140 run_replication
=> sub {
141 die "run_replication error" if $fail_config->{run_replication
};
143 my $vm_config = PVE
::QemuConfig-
>load_config($test_vmid);
144 return PVE
::QemuConfig-
>get_replicatable_volumes(
152 our $replication_config_module = Test
::MockModule-
>new("PVE::ReplicationConfig");
153 $replication_config_module->mock(
154 cfs_read_file
=> $mocked_cfs_read_file,
157 our $safe_syslog_module = Test
::MockModule-
>new("PVE::SafeSyslog");
158 $safe_syslog_module->mock(
163 our $storage_module = Test
::MockModule-
>new("PVE::Storage");
164 $storage_module->mock(
165 activate_volumes
=> sub {
168 deactivate_volumes
=> sub {
172 return $storage_config;
174 get_bandwidth_limit
=> sub {
177 cfs_read_file
=> $mocked_cfs_read_file,
180 our $storage_plugin_module = Test
::MockModule-
>new("PVE::Storage::Plugin");
181 $storage_plugin_module->mock(
182 cluster_lock_storage
=> sub {
183 my ($class, $storeid, $shared, $timeout, $func, @param) = @_;
185 mkdir "${RUN_DIR_PATH}/lock";
187 my $path = "${RUN_DIR_PATH}/lock/pve-storage-${storeid}";
188 return PVE
::Tools
::lock_file
($path, $timeout, $func, @param);
192 our $systemd_module = Test
::MockModule-
>new("PVE::Systemd");
193 $systemd_module->mock(
194 wait_for_unit_removed
=> sub {
197 enter_systemd_scope
=> sub {
202 my $migrate_port_counter = 60000;
204 our $tools_module = Test
::MockModule-
>new("PVE::Tools");
206 get_host_address_family
=> sub {
209 next_migrate_port
=> sub {
210 return $migrate_port_counter++;