2016-03-31 10:10:23 +03:00
#!/usr/bin/perl
2018-08-28 17:40:31 +03:00
use lib '..' ;
2016-03-31 10:10:23 +03:00
use strict ;
use warnings ;
2018-08-28 17:40:31 +03:00
2016-03-31 10:10:23 +03:00
use Data::Dumper qw( Dumper ) ;
use PVE::Storage ;
use PVE::Cluster ;
use PVE::Tools qw( run_command ) ;
use Cwd ;
$ Data:: Dumper:: Sortkeys = 1 ;
my $ verbose = undef ;
my $ storagename = "zfstank99" ;
my $ subvol = 'regressiontest' ;
2019-11-18 13:45:38 +03:00
my $ mountpoint = "${subvol}_mnt" ;
2016-03-31 10:10:23 +03:00
#volsize in GB
my $ volsize = 1 ;
my $ vmdisk = "vm-102-disk-1" ;
my $ vmbase = "base-100-disk-1" ;
my $ vmlinked = "vm-101-disk-1" ;
my $ ctdisk = "subvol-202-disk-1" ;
my $ ctbase = "basevol-200-disk-1" ;
my $ ctlinked = "subvol-201-disk-1" ;
my $ basesnap = '@__base__' ;
my $ tests = { } ;
2017-05-17 12:42:33 +03:00
#create zfs subvol for testing
2016-03-31 10:10:23 +03:00
my $ pool = undef ;
my $ zpath = undef ;
my $ cfg = undef ;
my $ scfg = undef ;
my $ count = 0 ;
2016-04-04 14:58:33 +03:00
my $ testnum = 19 ;
2016-04-04 14:58:32 +03:00
my $ end_test = $ testnum ;
my $ start_test = 1 ;
if ( @ ARGV == 2 ) {
$ end_test = $ ARGV [ 1 ] ;
$ start_test = $ ARGV [ 0 ] ;
} elsif ( @ ARGV == 1 ) {
$ start_test = $ ARGV [ 0 ] ;
$ end_test = $ ARGV [ 0 ] ;
}
2016-04-04 14:58:33 +03:00
my $ test19 = sub {
print "\nrun test19 \"path\"\n" ;
my @ res ;
my $ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$vmdisk" ) ;
if ( $ res [ 0 ] ne "\/dev\/zvol\/regressiontest\/$vmdisk" ) {
$ count + + ;
$ fail = 1 ;
warn "Test 19 a: path is not correct: expected \'\/dev\/zvol\/regressiontest\/$vmdisk'\ get \'$res[0]\'" ;
}
if ( $ res [ 1 ] ne "102" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 a: owner is not correct: expected \'102\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 a: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 a: $@" ;
}
@ res = undef ;
$ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$vmbase" ) ;
if ( $ res [ 0 ] ne "\/dev\/zvol\/regressiontest\/$vmbase" ) {
$ count + + ;
$ fail = 1 ;
warn "Test 19 b: path is not correct: expected \'\/dev\/zvol\/regressiontest\/$vmbase'\ get \'$res[0]\'" ;
}
if ( $ res [ 1 ] ne "100" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 b: owner is not correct: expected \'100\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 b: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 b: $@" ;
}
@ res = undef ;
$ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ;
if ( $ res [ 0 ] ne "\/dev\/zvol\/regressiontest\/$vmlinked" ) {
$ count + + ;
$ fail = 1 ;
warn "Test 19 c: path is not correct: expected \'\/dev\/zvol\/regressiontest\/$vmlinked'\ get \'$res[0]\'" ;
}
if ( $ res [ 1 ] ne "101" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 c: owner is not correct: expected \'101\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 c: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 c: $@" ;
}
@ res = undef ;
$ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$ctdisk" ) ;
2019-11-18 13:45:38 +03:00
if ( $ res [ 0 ] ne "\/$mountpoint\/$ctdisk" ) {
2016-04-04 14:58:33 +03:00
$ count + + ;
$ fail = 1 ;
2019-11-18 13:45:38 +03:00
warn "Test 19 d: path is not correct: expected \'\/$mountpoint\/$ctdisk'\ get \'$res[0]\'" ;
2016-04-04 14:58:33 +03:00
}
if ( $ res [ 1 ] ne "202" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 d: owner is not correct: expected \'202\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 d: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 d: $@" ;
}
@ res = undef ;
$ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$ctbase" ) ;
2019-11-18 13:45:38 +03:00
if ( $ res [ 0 ] ne "\/$mountpoint\/$ctbase" ) {
2016-04-04 14:58:33 +03:00
$ count + + ;
$ fail = 1 ;
2019-11-18 13:45:38 +03:00
warn "Test 19 e: path is not correct: expected \'\/$mountpoint\/$ctbase'\ get \'$res[0]\'" ;
2016-04-04 14:58:33 +03:00
}
if ( $ res [ 1 ] ne "200" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 e: owner is not correct: expected \'200\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 e: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 e: $@" ;
}
@ res = undef ;
$ fail = 0 ;
eval {
@ res = PVE::Storage:: path ( $ cfg , "$storagename:$ctbase\/$ctlinked" ) ;
2019-11-18 13:45:38 +03:00
if ( $ res [ 0 ] ne "\/$mountpoint\/$ctlinked" ) {
2016-04-04 14:58:33 +03:00
$ count + + ;
$ fail = 1 ;
2019-11-18 13:45:38 +03:00
warn "Test 19 f: path is not correct: expected \'\/$mountpoint\/$ctlinked'\ get \'$res[0]\'" ;
2016-04-04 14:58:33 +03:00
}
if ( $ res [ 1 ] ne "201" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 f: owner is not correct: expected \'201\' get \'$res[1]\'" ;
}
if ( $ res [ 2 ] ne "images" ) {
if ( ! $ fail ) {
$ count + + ;
$ fail = 1 ;
}
warn "Test 19 f: owner is not correct: expected \'images\' get \'$res[2]\'" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 19 f: $@" ;
}
} ;
$ tests - > { 19 } = $ test19 ;
2016-03-31 10:10:23 +03:00
my $ test18 = sub {
2017-05-17 12:42:33 +03:00
print "\nrun test18 \"scan_zfs\"\n" ;
2016-03-31 10:10:23 +03:00
my $ res ;
eval {
$ res = PVE::Storage:: scan_zfs ( $ cfg , $ storagename ) ;
my $ exists = 0 ;
foreach my $ subvol ( @$ res ) {
if ( $ subvol - > { pool } eq 'regressiontest' ) {
$ exists + + ;
}
}
if ( ! $ exists ) {
$ count + + ;
warn "Test 18 a: not pool" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 18 a: $@" ;
}
$ res = undef ;
eval {
$ res = PVE::Storage:: scan_zfs ( $ cfg , $ storagename ) ;
foreach my $ subvol ( @$ res ) {
if ( $ subvol - > { pool } eq 'zfspool/subvol' ) {
$ count + + ;
warn "Test 18 b:" ;
}
}
foreach my $ subvol ( @$ res ) {
if ( $ subvol - > { pool } eq 'zfspool/basevol' ) {
$ count + + ;
warn "Test 18 c" ;
}
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test 18 a: $@" ;
}
} ;
$ tests - > { 18 } = $ test18 ;
my $ test17 = sub {
print "\nrun test17 \"deactivate_storage\"\n" ;
eval {
PVE::Storage:: activate_storage ( $ cfg , $ storagename ) ;
2017-05-17 12:42:28 +03:00
PVE::Storage:: deactivate_storage ( $ cfg , $ storagename ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( $@ ) {
$ count + + ;
warn "Test 17 a: $@" ;
}
} ;
$ tests - > { 17 } = $ test17 ;
my $ test16 = sub {
print "\nrun test16 \"activate_storage\"\n" ;
eval {
PVE::Storage:: activate_storage ( $ cfg , $ storagename ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test 16 a: $@" ;
}
} ;
$ tests - > { 16 } = $ test16 ;
my $ test15 = sub {
print "\nrun test15 \"template_list and vdisk_list\"\n" ;
my $ hash = Dumper { } ;
my $ res = Dumper PVE::Storage:: template_list ( $ cfg , $ storagename , "vztmpl" ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 a failed\n" ;
}
$ res = undef ;
$ res = Dumper PVE::Storage:: template_list ( $ cfg , $ storagename , "iso" ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 b failed\n" ;
}
$ res = undef ;
$ res = Dumper PVE::Storage:: template_list ( $ cfg , $ storagename , "backup" ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 c failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > undef ,
'volid' = > 'zfstank99:base-100-disk-1' ,
'name' = > 'base-100-disk-1' ,
'vmid' = > '100' ,
'size' = > 1073741824 ,
'format' = > 'raw'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 100 , [ "$storagename:$vmbase" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 d failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > undef ,
'volid' = > 'zfstank99:vm-102-disk-1' ,
'name' = > 'vm-102-disk-1' ,
'vmid' = > '102' ,
'size' = > 1073741824 ,
'format' = > 'raw'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 102 , [ "$storagename:$vmdisk" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 e failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > 'base-100-disk-1@__base__' ,
'volid' = > "$storagename:$vmbase\/$vmlinked" ,
'name' = > 'vm-101-disk-1' ,
'vmid' = > '101' ,
'size' = > 1073741824 ,
'format' = > 'raw'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 101 , [ "$storagename:$vmbase\/$vmlinked" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 f failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > undef ,
'volid' = > 'zfstank99:basevol-200-disk-1' ,
'name' = > 'basevol-200-disk-1' ,
'vmid' = > '200' ,
'size' = > 1073741824 ,
'format' = > 'subvol'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 200 , [ "$storagename:$ctbase" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 g failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > undef ,
'volid' = > 'zfstank99:subvol-202-disk-1' ,
'name' = > 'subvol-202-disk-1' ,
'vmid' = > '202' ,
'size' = > 1073741824 ,
'format' = > 'subvol'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 202 , [ "$storagename:$ctdisk" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 h failed\n" ;
}
$ res = undef ;
$ hash = Dumper { 'zfstank99' = > [
{
'parent' = > 'basevol-200-disk-1@__base__' ,
'volid' = > "$storagename:$ctbase\/$ctlinked" ,
'name' = > 'subvol-201-disk-1' ,
'vmid' = > '201' ,
'size' = > 1073741824 ,
'format' = > 'subvol'
}
] } ;
$ res = Dumper PVE::Storage:: vdisk_list ( $ cfg , $ storagename , 201 , [ "$storagename:$ctbase\/$ctlinked" ] ) ;
if ( $ hash ne $ res ) {
$ count + + ;
warn "Test 15 i failed\n" ;
}
} ;
$ tests - > { 15 } = $ test15 ;
my $ test14 = sub {
print "\nrun test14 \"vdisk_free\"\n" ;
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$vmdisk" ) ;
eval {
run_command ( "zfs list $zpath\/$vmdisk" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 a: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 a: $@" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$vmbase" ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 b: free vdisk should not work\n" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ;
eval {
run_command ( "zfs list $zpath\/$vmlinked" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 c: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 c: $@" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$ctdisk" ) ;
eval {
run_command ( "zfs list $zpath\/$ctdisk" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 d: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 d: $@" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$ctbase" ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 e: free vdisk should not work\n" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$ctbase\/$ctlinked" ) ;
eval {
run_command ( "zfs list $zpath\/$ctlinked" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 f: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 f: $@" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$vmbase" ) ;
eval {
run_command ( "zfs list $zpath\/$vmbase" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 g: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 g: $@" ;
}
eval {
PVE::Storage:: vdisk_free ( $ cfg , "$storagename:$ctbase" ) ;
eval {
run_command ( "zfs list $zpath\/$ctbase" , outfunc = > sub { } , errfunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test14 h: vdisk still exists\n" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test14 h: $@" ;
}
} ;
$ tests - > { 14 } = $ test14 ;
my $ test13 = sub {
print "\nrun test13 \"vdisk_alloc\"\n" ;
eval {
my $ tmp_volid = PVE::Storage:: vdisk_alloc ( $ cfg , $ storagename , "112" , "raw" , undef , 1024 * 1024 ) ;
2018-09-10 11:07:44 +03:00
if ( $ tmp_volid ne "$storagename:vm-112-disk-0" ) {
2016-03-31 10:10:23 +03:00
die "volname:$tmp_volid don't match\n" ;
}
eval {
2018-09-10 11:07:44 +03:00
run_command ( "zfs get -H volsize $zpath\/vm-112-disk-0" , outfunc = >
2016-03-31 10:10:23 +03:00
sub { my $ tmp = shift ;
2018-09-10 11:07:44 +03:00
if ( $ tmp !~ m/^$zpath\/vm-112-disk-0.*volsize.*1G.*$/ ) {
2016-03-31 10:10:23 +03:00
die "size don't match\n" ;
}
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 a: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 a: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_alloc ( $ cfg , $ storagename , "112" , "raw" , undef , 2048 * 1024 ) ;
2018-09-10 11:07:44 +03:00
if ( $ tmp_volid ne "$storagename:vm-112-disk-1" ) {
2016-03-31 10:10:23 +03:00
die "volname:$tmp_volid don't match\n" ;
}
eval {
2018-09-10 11:07:44 +03:00
run_command ( "zfs get -H volsize $zpath\/vm-112-disk-1" , outfunc = >
2016-03-31 10:10:23 +03:00
sub { my $ tmp = shift ;
2018-09-10 11:07:44 +03:00
if ( $ tmp !~ m/^$zpath\/vm-112-disk-1.*volsize.*2G.*$/ ) {
2016-03-31 10:10:23 +03:00
die "size don't match\n" ;
}
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 b: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 b: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_alloc ( $ cfg , $ storagename , "113" , "subvol" , undef , 1024 * 1024 ) ;
2018-09-10 11:07:44 +03:00
if ( $ tmp_volid ne "$storagename:subvol-113-disk-0" ) {
2016-03-31 10:10:23 +03:00
die "volname:$tmp_volid don't match\n" ;
}
eval {
2018-09-10 11:07:44 +03:00
run_command ( "zfs get -H refquota $zpath\/subvol-113-disk-0" , outfunc = >
2016-03-31 10:10:23 +03:00
sub { my $ tmp = shift ;
2018-09-10 11:07:44 +03:00
if ( $ tmp !~ m/^$zpath\/subvol-113-disk-0.*refquota.*1G.*$/ ) {
2016-03-31 10:10:23 +03:00
die "size don't match\n" ;
}
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 c: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 c: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_alloc ( $ cfg , $ storagename , "113" , "subvol" , undef , 2048 * 1024 ) ;
2018-09-10 11:07:44 +03:00
if ( $ tmp_volid ne "$storagename:subvol-113-disk-1" ) {
2016-03-31 10:10:23 +03:00
die "volname:$tmp_volid don't match\n" ;
}
eval {
2018-09-10 11:07:44 +03:00
run_command ( "zfs get -H refquota $zpath\/subvol-113-disk-1" , outfunc = >
2016-03-31 10:10:23 +03:00
sub { my $ tmp = shift ;
2018-09-10 11:07:44 +03:00
if ( $ tmp !~ m/^$zpath\/subvol-113-disk-1.*refquota.*G.*$/ ) {
2016-03-31 10:10:23 +03:00
die "size don't match\n" ;
}
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test13 d: $@" ;
}
} ;
$ tests - > { 13 } = $ test13 ;
my $ test12 = sub {
print "\nrun test12 \"vdisk_create_base\"\n" ;
eval {
my $ tmp_volid = PVE::Storage:: vdisk_create_base ( $ cfg , "$storagename:$vmdisk" ) ;
if ( $ tmp_volid ne "$storagename:base-102-disk-1" ) {
die ;
}
eval {
run_command ( "zfs list $zpath\/base-102-disk-1" , outfunc = > sub { } ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 a: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 a: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_create_base ( $ cfg , "$storagename:$vmlinked" ) ;
if ( $ tmp_volid ne "$storagename:base-101-disk-1" ) {
die ;
}
eval {
run_command ( "zfs list $zpath\/base-101-disk-1" , outfunc = > sub { } ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 b: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 b: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_create_base ( $ cfg , "$storagename:$ctdisk" ) ;
if ( $ tmp_volid ne "$storagename:basevol-202-disk-1" ) {
die ;
}
eval {
run_command ( "zfs list $zpath\/basevol-202-disk-1" , outfunc = > sub { } ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 c: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 c: $@" ;
}
eval {
my $ tmp_volid = PVE::Storage:: vdisk_create_base ( $ cfg , "$storagename:$ctlinked" ) ;
if ( $ tmp_volid ne "$storagename:basevol-201-disk-1" ) {
die ;
}
eval {
run_command ( "zfs list $zpath\/basevol-201-disk-1" , outfunc = > sub { } ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test12 d: $@" ;
}
} ;
$ tests - > { 12 } = $ test12 ;
my $ test11 = sub {
print "\nrun test11 \"volume_is_base\"\n" ;
eval {
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$vmdisk" , 110 ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test11 a: clone_image only works on base images" ;
}
eval {
2018-09-10 11:07:44 +03:00
if ( "$storagename:$vmbase\/vm-110-disk-0" ne
2016-03-31 10:10:23 +03:00
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$vmbase" , 110 , '__base__' ) ) {
$ count + + ;
warn "Test11 b" ;
}
2018-09-10 11:07:44 +03:00
run_command ( "zfs list -H -o volsize $zpath\/vm-110-disk-0" , outfunc = > sub {
2016-03-31 10:10:23 +03:00
my $ line = shift ;
chomp ( $ line ) ;
warn "Test11 b not correct volsize" if $ line !~ m/$volsize/ ;
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test11 b: $@" ;
}
eval {
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 111 ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test11 c: clone_image only works on base images" ;
}
eval {
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$ctdisk" , 110 ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test11 d: clone_image only works on base images" ;
}
eval {
2018-09-10 11:07:44 +03:00
if ( "$storagename:$ctbase\/subvol-210-disk-0" ne
2016-03-31 10:10:23 +03:00
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$ctbase" , 210 , '__base__' ) ) {
$ count + + ;
warn "Test11 e" ;
}
2018-09-10 11:07:44 +03:00
run_command ( "zfs list -H -o refquota $zpath\/subvol-210-disk-0" , outfunc = > sub {
2016-03-31 10:10:23 +03:00
my $ line = shift ;
chomp ( $ line ) ;
warn "Test11 e not correct volsize" if $ line !~ m/$volsize/ ;
} ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test11 e: $@" ;
}
eval {
PVE::Storage:: vdisk_clone ( $ cfg , "$storagename:$ctbase\/$ctlinked" , 211 ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test11 f: clone_image only works on base images" ;
}
} ;
$ tests - > { 11 } = $ test11 ;
my $ test10 = sub {
print "\nrun test10 \"volume_is_base\"\n" ;
eval {
2016-09-15 14:17:44 +03:00
if ( 1 == volume_is_base ( $ cfg , "$storagename:$vmdisk" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 a: is no base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 a: $@" ;
}
eval {
2016-09-15 14:17:44 +03:00
if ( 0 == volume_is_base ( $ cfg , "$storagename:$vmbase" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 b: is base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 b: $@" ;
}
eval {
2016-09-15 14:17:44 +03:00
if ( 1 == volume_is_base ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 c: is no base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 c: $@" ;
}
eval {
2016-09-15 14:17:44 +03:00
if ( 1 == volume_is_base ( $ cfg , "$storagename:$ctdisk" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 d: is no base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 d: $@" ;
}
eval {
2016-09-15 14:17:44 +03:00
if ( 0 == volume_is_base ( $ cfg , "$storagename:$ctbase" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 e: is base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 e: $@" ;
}
eval {
2016-09-15 14:17:44 +03:00
if ( 1 == volume_is_base ( $ cfg , "$storagename:$ctbase\/$ctlinked" ) ) {
2016-03-31 10:10:23 +03:00
$ count + + ;
warn "Test10 f: is no base" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test10 f: $@" ;
}
} ;
$ tests - > { 10 } = $ test10 ;
my $ test9 = sub {
2017-05-17 12:42:29 +03:00
print "\nrun test9 \"parse_volume_id\"\n" ;
2016-03-31 10:10:23 +03:00
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$vmdisk" ) ;
if ( $ store ne $ storagename || $ disk ne $ vmdisk ) {
$ count + + ;
warn "Test9 a: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 a: $@" ;
}
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$vmbase" ) ;
if ( $ store ne $ storagename || $ disk ne $ vmbase ) {
$ count + + ;
warn "Test9 b: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 b: $@" ;
}
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$vmbase\/$vmlinked" ) ;
if ( $ store ne $ storagename || $ disk ne "$vmbase\/$vmlinked" ) {
$ count + + ;
warn "Test9 c: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 c: $@" ;
}
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$ctdisk" ) ;
if ( $ store ne $ storagename || $ disk ne $ ctdisk ) {
$ count + + ;
warn "Test9 d: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 d: $@" ;
}
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$ctbase" ) ;
if ( $ store ne $ storagename || $ disk ne $ ctbase ) {
$ count + + ;
warn "Test9 e: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 e: $@" ;
}
eval {
my ( $ store , $ disk ) = PVE::Storage:: parse_volume_id ( "$storagename:$ctbase\/$ctlinked" ) ;
if ( $ store ne $ storagename || $ disk ne "$ctbase\/$ctlinked" ) {
$ count + + ;
warn "Test9 f: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test9 f: $@" ;
}
} ;
$ tests - > { 9 } = $ test9 ;
my $ test8 = sub {
print "\nrun test8 \"parse_volname\"\n" ;
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$vmdisk" ) ;
if ( $ vtype ne 'images' || $ vmid ne '102' || $ name ne $ vmdisk ||
2016-04-04 09:50:12 +03:00
defined ( $ basename ) || defined ( $ basevmid ) || $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'raw' ) {
$ count + + ;
warn "Test8 a: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 a: $@" ;
}
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$vmbase" ) ;
if ( $ vtype ne 'images' || $ vmid ne '100' || $ name ne $ vmbase ||
2016-04-04 09:50:12 +03:00
defined ( $ basename ) || defined ( $ basevmid ) || ! $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'raw' ) {
$ count + + ;
warn "Test8 b: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 b: $@" ;
}
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ;
if ( $ vtype ne 'images' || $ name ne $ vmlinked || $ vmid ne '101' ||
2016-04-04 09:50:12 +03:00
$ basename ne $ vmbase || $ basevmid ne '100' || $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'raw' ) {
$ count + + ;
warn "Test8 c: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 c: $@" ;
}
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$ctdisk" ) ;
if ( $ vtype ne 'images' || $ vmid ne '202' || $ name ne $ ctdisk ||
2016-04-04 09:50:12 +03:00
defined ( $ basename ) || defined ( $ basevmid ) || $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'subvol' ) {
$ count + + ;
warn "Test8 d: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 d: $@" ;
}
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$ctbase" ) ;
if ( $ vtype ne 'images' || $ vmid ne '200' || $ name ne $ ctbase ||
2016-04-04 09:50:12 +03:00
defined ( $ basename ) || defined ( $ basevmid ) || ! $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'subvol' ) {
$ count + + ;
warn "Test8 e: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 e: $@" ;
}
eval {
my ( $ vtype , $ name , $ vmid , $ basename , $ basevmid , $ isBase , $ format ) = PVE::Storage:: parse_volname ( $ cfg , "$storagename:$ctbase\/$ctlinked" ) ;
if ( $ vtype ne 'images' || $ name ne $ ctlinked || $ vmid ne '201' ||
2016-04-04 09:50:12 +03:00
$ basename ne $ ctbase || $ basevmid ne '200' || $ isBase ||
2016-03-31 10:10:23 +03:00
$ format ne 'subvol' ) {
$ count + + ;
warn "Test8 f: parsing wrong" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test8 f: $@" ;
}
} ;
$ tests - > { 8 } = $ test8 ;
my $ test7 = sub {
print "\nrun test7 \"volume_rollback\"\n" ;
my $ tmp_guid ;
my $ parse_guid = sub {
my ( $ line ) = shift ;
if ( $ line =~ m/^Disk identifier \(GUID\)\: (.*)$/ ) {
$ tmp_guid = $ 1 ;
}
} ;
eval {
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmdisk" ] ) ;
2016-03-31 10:10:23 +03:00
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmdisk" , outfunc = > $ parse_guid ) ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmdisk" , outfunc = > $ parse_guid ) ;
my $ old_guid = $ tmp_guid ;
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ;
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmdisk" , outfunc = > $ parse_guid ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ;
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmdisk" ] ) ;
2016-03-31 10:10:23 +03:00
$ tmp_guid = undef ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmdisk" , outfunc = > $ parse_guid ) ;
if ( $ old_guid ne $ tmp_guid ) {
$ count + + ;
warn "Test7 a: Zvol makes no rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 a: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 a: $@" ;
}
$ tmp_guid = undef ;
eval {
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmbase" ] ) ;
2016-03-31 10:10:23 +03:00
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmbase" , outfunc = > $ parse_guid ) ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmbase" , outfunc = > $ parse_guid ) ;
my $ old_guid = $ tmp_guid ;
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ;
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmbase" , outfunc = > $ parse_guid ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ;
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmbase" ] ) ;
2016-03-31 10:10:23 +03:00
$ tmp_guid = undef ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmbase" , outfunc = > $ parse_guid ) ;
if ( $ old_guid ne $ tmp_guid ) {
$ count + + ;
warn "Test7 b: Zvol makes no rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 b: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 b: $@" ;
}
$ tmp_guid = undef ;
eval {
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmbase/$vmlinked" ] ) ;
2016-03-31 10:10:23 +03:00
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmlinked" , outfunc = > $ parse_guid ) ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmlinked" , outfunc = > $ parse_guid ) ;
my $ old_guid = $ tmp_guid ;
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap1' ) ;
run_command ( "sgdisk --randomize-guids \/dev\/zvol\/$zpath\/$vmlinked" , outfunc = > $ parse_guid ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap1' ) ;
2019-07-31 11:58:04 +03:00
PVE::Storage:: activate_volumes ( $ cfg , [ "$storagename:$vmbase/$vmlinked" ] ) ;
2016-03-31 10:10:23 +03:00
$ tmp_guid = undef ;
run_command ( "sgdisk -p \/dev\/zvol\/$zpath\/$vmlinked" , outfunc = > $ parse_guid ) ;
if ( $ old_guid ne $ tmp_guid ) {
$ count + + ;
warn "Test7 c: Zvol makes no rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 c: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 c: $@" ;
}
$ tmp_guid = undef ;
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ;
2019-11-18 13:45:38 +03:00
run_command ( "touch \/$mountpoint\/$ctdisk\/test.txt" , outfunc = > $ parse_guid ) ;
2016-03-31 10:10:23 +03:00
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ;
eval {
2019-11-18 13:45:38 +03:00
run_command ( "ls \/$mountpoint\/$ctdisk\/test.txt" , errofunc = > sub { } ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 d: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ;
2019-11-18 13:45:38 +03:00
run_command ( "touch \/$mountpoint\/$ctbase\/test.txt" , outfunc = > $ parse_guid ) ;
2016-03-31 10:10:23 +03:00
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ;
eval {
2019-11-18 13:45:38 +03:00
run_command ( "ls \/$mountpoint\/$ctbase\/test.txt" , errofunc = > sub { } ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 e: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 e: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 f: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase/$ctlinked" , 'snap1' ) ;
2019-11-18 13:45:38 +03:00
run_command ( "touch \/$mountpoint\/$ctlinked\/test.txt" , outfunc = > $ parse_guid ) ;
2016-03-31 10:10:23 +03:00
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctbase/$ctlinked" , 'snap1' ) ;
eval {
run_command ( "ls \/$zpath\/$ctlinked\/test.txt" , errofunc = > sub { } ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 g: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 g: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 g: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmdisk" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 h: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 h: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 i: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 i: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 j: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 j: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctdisk" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 k: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 k: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 l: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 l: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase/$ctlinked" , 'snap2' ) ;
eval {
PVE::Storage:: volume_snapshot_rollback ( $ cfg , "$storagename:$ctbase/$ctlinked" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test7 m: Not allowed to rollback" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test7 m: $@" ;
}
} ;
$ tests - > { 7 } = $ test7 ;
my $ test6 = sub {
print "\nrun test6 \"volume_rollback_is_possible\"\n" ;
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ) {
$ count + + ;
warn "Test6 a: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 a: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ) {
$ count + + ;
warn "Test6 b: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 b: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmlinked" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap1' ) ) {
$ count + + ;
warn "Test6 c: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 c: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ) {
$ count + + ;
warn "Test6 d: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 d: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ) {
$ count + + ;
warn "Test6 e: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 e: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctlinked" , 'snap1' ) ;
if ( 1 !=
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctbase\/$ctlinked" , 'snap1' ) ) {
$ count + + ;
warn "Test6 f: Rollback sould possible"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test6 f: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmdisk" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmdisk" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 g: Rollback should not possible" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmbase" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 h: Rollback should not possible" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmlinked" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 j: Rollback should not possible" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctdisk" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctdisk" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 k: Rollback should not possible" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctbase" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 l: Rollback should not possible" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctlinked" , 'snap2' ) ;
PVE::Storage:: volume_rollback_is_possible ( $ cfg , "$storagename:$ctbase\/$ctlinked" , 'snap1' ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test6 m: Rollback should not possible" ;
}
} ;
$ tests - > { 6 } = $ test6 ;
my $ test5 = sub {
print "\nrun test5 \"volume_snapshot_delete\"\n" ;
my $ out = sub { my $ tmp = shift ; } ;
eval {
run_command ( "zfs snapshot $zpath\/$vmdisk\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$vmdisk" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmdisk\@snap" , errfunc = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 a: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE a: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 a: $@" ;
}
eval {
run_command ( "zfs snapshot $zpath\/$vmbase\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$vmbase" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmbase\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 b: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE b: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 b: $@" ;
}
eval {
run_command ( "zfs snapshot $zpath\/$vmlinked\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmlinked\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 c: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE c: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 c: $@" ;
}
eval {
run_command ( "zfs snapshot $zpath\/$ctdisk\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$ctdisk" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctdisk\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 d: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 d: $@" ;
}
eval {
run_command ( "zfs snapshot $zpath\/$ctbase\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$ctbase" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctbase\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 e: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE e: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 e: $@" ;
}
eval {
run_command ( "zfs snapshot $zpath\/$ctlinked\@snap" ) ;
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$ctbase\/$ctlinked" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctlinked\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 f: snapshot still exists" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 PVE f: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 f: $@" ;
}
2017-05-17 12:42:33 +03:00
print "######Ignore Output if no Test5 g: is included######\n" ;
2016-03-31 10:10:23 +03:00
eval {
PVE::Storage:: volume_snapshot_delete ( $ cfg , "$storagename:$vmbase" , '__base__' ) ;
eval {
run_command ( "zfs list $zpath\/$vmbase\@__base__" , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test5 g: $@" ;
}
} ;
if ( ! $@ ) {
$ count + + ;
warn "Test5 PVE g: snapshot __base__ can be erased" ;
}
2017-05-17 12:42:33 +03:00
print "######End Ignore#######\n" ;
2016-03-31 10:10:23 +03:00
} ;
$ tests - > { 5 } = $ test5 ;
my $ test4 = sub {
print "\nrun test4 \"volume_snapshot\"\n" ;
my $ out = sub { } ;
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmdisk" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmdisk\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 a: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 a: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmbase\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 b: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 c: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$vmbase\/$vmlinked" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$vmdisk\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 c: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 c: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctdisk" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctdisk\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 d: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 d: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctbase\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 e: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 e: $@" ;
}
eval {
PVE::Storage:: volume_snapshot ( $ cfg , "$storagename:$ctbase\/$ctlinked" , 'snap' ) ;
eval {
run_command ( "zfs list $zpath\/$ctdisk\@snap" , errmsg = > $ out , outfunc = > $ out ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 f: $@" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test4 f: $@" ;
}
} ;
$ tests - > { 4 } = $ test4 ;
my $ test3 = sub {
print "\nrun test3 \"volume_has_feature\"\n" ;
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 a failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 a: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 b failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 b: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmbase\/$vmlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 c failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 c: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 d failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 d: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 e failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 e: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctbase\/$ctlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 f failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 f: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 g failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 g: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 h failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 h: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmbase\/$vmlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 h failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 h: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 i failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 i: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 j failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 j: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctbase\/$ctlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 k failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 k: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 l failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 l: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 m failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 m: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmbase\/$vmlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 n failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 n: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 o failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 o: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 p failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 p: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctbase\/$ctlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 q failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 q: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 r failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 r: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 s failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 s: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmbase\/$vmlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 t failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 t: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 u failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 u: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 v failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 v: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctbase\/$ctlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 w failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 w: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 x failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 x: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 y failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 y: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmbase\/$vmlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 z failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 z: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctdisk" , undef , 0 ) ) {
$ count + + ;
warn "Test3 A failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 A: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctbase" , undef , 0 ) ) {
$ count + + ;
warn "Test3 B failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 B: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctbase\/$ctlinked" , undef , 0 ) ) {
$ count + + ;
warn "Test3 C failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 C: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 a1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 a1: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 b1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 b1: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$vmbase\/$vmlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 c1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 c1: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 d1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 d1: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 e1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 e1: $@" ;
}
eval {
if ( ! PVE::Storage:: volume_has_feature ( $ cfg , 'snapshot' , "$storagename:$ctbase\/$ctlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 f1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 f1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 g1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 g1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 h1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 h1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$vmbase\/$vmlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 h1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 h1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 i1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 i1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 j1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 j1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'clone' , "$storagename:$ctbase\/$ctlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 k1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 k1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 l1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 l1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 m1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 m1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$vmbase\/$vmlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 n1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 n1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 o1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 o1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 p1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 p1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'template' , "$storagename:$ctbase\/$ctlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 q1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 q1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 r1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 r1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 s1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 s1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$vmbase\/$vmlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 t1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 t1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 u1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 u1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 v1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 v1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'copy' , "$storagename:$ctbase\/$ctlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 w1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 w1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 x1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 x1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 y1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 y1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$vmbase\/$vmlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 z1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 z1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctdisk" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 A1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 A1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctbase" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 B1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 B1: $@" ;
}
eval {
if ( PVE::Storage:: volume_has_feature ( $ cfg , 'sparseinit' , "$storagename:$ctbase\/$ctlinked" , 'test' , 0 ) ) {
$ count + + ;
warn "Test3 C1 failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test3 C1: $@" ;
}
} ;
$ tests - > { 3 } = $ test3 ;
my $ test2 = sub {
print "\nrun test2 \"volume_resize\"\n" ;
my $ newsize = ( $ volsize + 1 ) * 1024 * 1024 * 1024 ;
eval {
if ( ( $ newsize / 1024 ) !=
PVE::Storage:: volume_resize ( $ cfg , "$storagename:$vmdisk" , $ newsize , 0 ) ) {
$ count + + ;
warn "Test2 a failed" ;
}
if ( $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmdisk" ) ) {
$ count + + ;
warn "Test2 a failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 a: $@" ;
}
eval {
warn "Test2 b failed" if ( $ newsize / 1024 ) != PVE::Storage:: volume_resize ( $ cfg , "$storagename:$vmbase" , $ newsize , 0 ) ;
warn "Test2 b failed" if $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmbase" ) ;
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 b: $@" ;
}
eval {
if ( ( $ newsize / 1024 ) != PVE::Storage:: volume_resize ( $ cfg , "$storagename:$vmbase\/$vmlinked" , $ newsize , 0 ) ) {
$ count + + ;
warn "Test2 c failed" ;
}
if ( $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ) {
$ count + + ;
warn "Test2 c failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 c: $@" ;
}
eval {
if ( ( $ newsize / 1024 ) != PVE::Storage:: volume_resize ( $ cfg , "$storagename:$ctdisk" , $ newsize , 0 ) ) {
$ count + + ;
warn "Test2 d failed" ;
}
if ( $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$ctdisk" ) ) {
$ count + + ;
warn "Test2 d failed"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 d: $@" ;
}
eval {
if ( ( $ newsize / 1024 ) !=
PVE::Storage:: volume_resize ( $ cfg , "$storagename:$ctbase" , $ newsize , 0 ) ) {
$ count + + ;
warn "Test2 e failed" ;
}
if ( $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$ctbase" ) ) {
$ count + + ;
warn "Test2 e failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 e: $@" ;
}
eval {
if ( ( $ newsize / 1024 ) !=
PVE::Storage:: volume_resize ( $ cfg , "$storagename:$ctbase\/$ctlinked" , $ newsize , 0 ) ) {
$ count + + ;
warn "Test2 f failed" ;
}
if ( $ newsize !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$ctbase\/$ctlinked" ) ) {
$ count + + ;
warn "Test2 f failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test2 f: $@" ;
}
} ;
$ tests - > { 2 } = $ test2 ;
my $ test1 = sub {
print "\nrun test1 \"volume_size_info\"\n" ;
my $ size = ( $ volsize * 1024 * 1024 * 1024 ) ;
eval {
if ( $ size != PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmdisk" ) ) {
$ count + + ;
warn "Test1 a failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 a : $@" ;
}
eval {
if ( $ size != PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmbase" ) ) {
$ count + + ;
warn "Test1 b failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 b : $@" ;
}
eval {
if ( $ size !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ) {
$ count + + ;
warn "Test1 c failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 c : $@" ;
}
eval {
if ( $ size !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$ctdisk" ) ) {
$ count + + ;
warn "Test1 d failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 d : $@" ;
}
eval {
if ( $ size !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$ctbase" ) ) {
$ count + + ;
warn "Test1 e failed" ;
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 e : $@" ;
}
eval {
if ( $ size !=
PVE::Storage:: volume_size_info ( $ cfg , "$storagename:$vmbase\/$vmlinked" ) ) {
$ count + + ;
warn "Test1 f failed"
}
} ;
if ( $@ ) {
$ count + + ;
warn "Test1 f : $@" ;
}
} ;
$ tests - > { 1 } = $ test1 ;
sub setup_zfs {
#create VM zvol
print "create zvol $vmdisk\n" if $ verbose ;
run_command ( "zfs create -V${volsize}G $zpath\/$vmdisk" ) ;
print "create zvol $vmbase\n" if $ verbose ;
run_command ( "zfs create -V${volsize}G $zpath\/$vmbase" ) ;
run_command ( "zfs snapshot $zpath\/$vmbase$basesnap" ) ;
print "create linked clone $vmlinked\n" if $ verbose ;
run_command ( "zfs clone $zpath\/$vmbase$basesnap $zpath\/$vmlinked" ) ;
#create CT subvol
print "create subvol $ctdisk\n" if $ verbose ;
run_command ( "zfs create -o refquota=${volsize}G $zpath\/$ctdisk" ) ;
2019-07-31 11:58:04 +03:00
print "create subvol $ctbase\n" if $ verbose ;
2016-03-31 10:10:23 +03:00
run_command ( "zfs create -o refquota=${volsize}G $zpath\/$ctbase" ) ;
run_command ( "zfs snapshot $zpath\/$ctbase$basesnap" ) ;
2019-07-31 11:58:04 +03:00
print "create linked clone $ctlinked\n" if $ verbose ;
2016-03-31 10:10:23 +03:00
run_command ( "zfs clone $zpath\/$ctbase$basesnap $zpath\/$ctlinked -o refquota=${volsize}G" ) ;
2019-07-31 11:58:04 +03:00
my $ vollist = [
"$storagename:$vmdisk" ,
"$storagename:$vmbase" ,
"$storagename:$vmbase/$vmlinked" ,
"$storagename:$ctdisk" ,
"$storagename:$ctbase" ,
"$storagename:$ctbase/$ctlinked" ,
] ;
PVE::Storage:: activate_volumes ( $ cfg , $ vollist ) ;
2016-03-31 10:10:23 +03:00
}
sub cleanup_zfs {
print "destroy $pool\/$subvol\n" if $ verbose ;
2017-05-17 12:42:31 +03:00
eval { run_command ( "zfs destroy $zpath -r" ) ; } ;
if ( $@ ) {
print "cleanup failed: $@\nretrying once\n" if $ verbose ;
eval { run_command ( "zfs destroy $zpath -r" ) ; } ;
if ( $@ ) {
clean_up_zpool ( ) ;
setup_zpool ( ) ;
}
}
2016-03-31 10:10:23 +03:00
}
sub setup_zpool {
2017-05-17 12:42:31 +03:00
unlink 'zpool.img' ;
2016-03-31 10:10:23 +03:00
eval {
2017-05-17 12:42:32 +03:00
run_command ( "truncate -s 8G zpool.img" ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( $@ ) {
clean_up_zpool ( ) ;
}
my $ pwd = cwd ( ) ;
eval {
2019-11-18 13:45:38 +03:00
run_command ( "zpool create -m \/$mountpoint $subvol $pwd\/zpool.img" ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( $@ ) {
clean_up_zpool ( ) ;
}
}
sub clean_up_zpool {
eval {
2018-03-13 17:11:01 +03:00
run_command ( "zpool destroy -f $subvol" ) ;
2016-03-31 10:10:23 +03:00
} ;
if ( $@ ) {
warn $@ ; }
unlink 'zpool.img' ;
}
2016-09-15 14:17:44 +03:00
sub volume_is_base {
my ( $ cfg , $ volid ) = @ _ ;
my ( undef , undef , undef , undef , undef , $ isBase , undef ) = PVE::Storage:: parse_volname ( $ cfg , $ volid ) ;
return $ isBase ;
}
2018-07-23 16:10:06 +03:00
if ( $> != 0 ) { #EUID
warn "not root, skipping zfs tests\n" ;
exit 0 ;
}
2017-05-17 12:42:35 +03:00
eval { run_command ( "zpool status" ) ; } ;
if ( $@ ) {
warn "zpool status failed, not running tests: $@\n" ;
exit 0 ;
}
2016-09-15 14:17:44 +03:00
2016-03-31 10:10:23 +03:00
setup_zpool ( ) ;
my $ time = time ;
print "Start tests for ZFSPoolPlugin\n" ;
$ cfg = { 'ids' = > {
$ storagename = > {
'content' = > {
'images' = > 1 ,
'rootdir' = > 1
} ,
'pool' = > $ subvol ,
2019-11-18 13:45:38 +03:00
'mountpoint' = > "\/$mountpoint" ,
2016-03-31 10:10:23 +03:00
'type' = > 'zfspool'
} ,
} ,
'order' = > { 'zfstank99' = > 1 , }
} ;
$ zpath = $ subvol ;
2016-04-04 14:58:32 +03:00
for ( my $ i = $ start_test ; $ i <= $ end_test ; $ i + + ) {
2016-03-31 10:10:23 +03:00
setup_zfs ( ) ;
eval {
$ tests - > { $ i } ( ) ;
} ;
warn $@ if $@ ;
cleanup_zfs ( ) ;
}
clean_up_zpool ( ) ;
$ time = time - $ time ;
print "Stop tests for ZFSPoolPlugin\n" ;
print "$count tests failed\n" ;
print "Time: ${time}s\n" ;
2017-05-17 12:42:36 +03:00
exit - 1 if $ count > 0 ;