2017-06-14 07:02:43 +02:00
#!/usr/bin/perl
use strict ;
use warnings ;
use lib ( '..' ) ;
use Data::Dumper ;
use PVE::Storage ;
use PVE::QemuConfig ;
use Test::More ;
my $ storecfg = {
ids = > {
local = > {
type = > 'dir' ,
shared = > 0 ,
content = > {
'iso' = > 1 ,
'backup' = > 1 ,
'images' = > 1 ,
'rootdir' = > 1
} ,
path = > "/var/lib/vz" ,
} ,
'local-zfs' = > {
type = > 'zfspool' ,
pool = > 'nonexistent-testpool' ,
shared = > 0 ,
content = > {
'images' = > 1 ,
'rootdir' = > 1
} ,
} ,
} ,
} ;
my $ vmid = 900 ;
my $ rawconf = "scsi0: non-existent-store:vm-103-disk-1,size=8G\n" ;
my $ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
my $ volumes ;
my $ expect ;
my $ test_name = "test non existent storage" ;
eval { $ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ; } ;
2019-12-13 12:11:58 +01:00
is ( $@ , "storage 'non-existent-store' does not exist\n" , $ test_name ) ;
2017-06-14 07:02:43 +02:00
$ test_name = "test with disk from other VM (not owner)" ;
$ rawconf = "scsi0: local:103/vm-103-disk-1.qcow2,size=8G\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
is_deeply ( $ volumes , { } , $ test_name ) ;
$ test_name = "test missing replicate feature" ;
$ rawconf = "scsi0: local:$vmid/vm-$vmid-disk-1.qcow2,size=8G\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
eval { $ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ; } ;
is ( $@ , "missing replicate feature on volume 'local:900/vm-900-disk-1.qcow2'\n" , $ test_name ) ;
$ test_name = "test raw path disk with replicate enabled" ;
$ rawconf = "scsi0: /dev/disk/abcdefg,size=8G\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
eval { $ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ; } ;
is ( $@ , "unable to replicate local file/device '/dev/disk/abcdefg'\n" , $ test_name ) ;
$ test_name = "test raw path disk with replicate disabled" ;
$ rawconf = "scsi0: /dev/disk/abcdefg,size=8G,replicate=0\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
is_deeply ( $ volumes , { } , $ test_name ) ;
$ test_name = "test CDROM with iso file" ;
$ rawconf = "ide2: local:iso/pve-cd.iso,media=cdrom\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
is_deeply ( $ volumes , { } , $ test_name ) ;
$ test_name = "test CDROM with access to physical 'cdrom' device" ;
$ rawconf = "ide2: cdrom,media=cdrom\n" ;
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
is_deeply ( $ volumes , { } , $ test_name ) ;
$ test_name = "test hidden volid in snapshot" ;
$ rawconf = << __EOD__ ;
memory: 1024
scsi0: local - zfs:vm - $ vmid - disk - 2 , size = 8 G
[ snap1 ]
memory: 512
scsi0: local - zfs:vm - $ vmid - disk - 1 , size = 8 G
__EOD__
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
$ expect = {
"local-zfs:vm-$vmid-disk-1" = > 1 ,
"local-zfs:vm-$vmid-disk-2" = > 1 ,
} ;
is_deeply ( $ volumes , $ expect , $ test_name ) ;
$ test_name = "test volid with different replicate setting in snapshot" ;
$ rawconf = << __EOD__ ;
memory: 1024
scsi0: local - zfs:vm - $ vmid - disk - 1 , size = 8 G , replicate = 0
[ snap1 ]
memory: 512
scsi0: local - zfs:vm - $ vmid - disk - 1 , size = 8 G
__EOD__
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
$ expect = {
"local-zfs:vm-$vmid-disk-1" = > 1 ,
} ;
is_deeply ( $ volumes , $ expect , $ test_name ) ;
$ test_name = "test vm with replicatable unused volumes" ;
$ rawconf = << __EOD__ ;
scsi0: local - zfs:vm - $ vmid - disk - 1 , size = 8 G
unused1: local - zfs:vm - $ vmid - disk - 2
unused5: local - zfs:vm - $ vmid - disk - 3
__EOD__
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
$ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ;
$ expect = {
"local-zfs:vm-$vmid-disk-1" = > 1 ,
"local-zfs:vm-$vmid-disk-2" = > 1 ,
"local-zfs:vm-$vmid-disk-3" = > 1 ,
} ;
is_deeply ( $ volumes , $ expect , $ test_name ) ;
$ test_name = "test vm with non-replicatable unused volumes" ;
$ rawconf = << __EOD__ ;
scsi0: local - zfs:vm - $ vmid - disk - 1 , size = 8 G
unused1: local : $ vmid / vm - $ vmid - disk - 2 . raw
__EOD__
$ conf = PVE::QemuServer:: parse_vm_config ( "/qemu-server/$vmid.conf" , $ rawconf ) ;
eval { $ volumes = PVE::QemuConfig - > get_replicatable_volumes ( $ storecfg , $ vmid , $ conf , 0 , 0 ) ; } ;
is ( $@ , "missing replicate feature on volume 'local:900/vm-900-disk-2.raw'\n" , $ test_name ) ;
done_testing ( ) ;
exit ( 0 ) ;