diff --git a/qa/qa_scripts/RbdLib.pm b/qa/qa_scripts/RbdLib.pm new file mode 100755 index 00000000000..0d0c0e05412 --- /dev/null +++ b/qa/qa_scripts/RbdLib.pm @@ -0,0 +1,373 @@ +#! /usr/bin/perl +=head1 NAME + +RbdLib.pm - Perl Module that contains the functions used by CLI and functionality scripts for testing RBD + +=cut + +package RbdLib; +use Cwd; +use Exporter; +@ISA = 'Exporter'; +@EXPORT_OK = qw(perform_action create_image resize_image rename_image copy_image list_image info_image export_image import_image remove_image create_snapshots rollback_snapshots purge_snapshots list_snapshots remove_snapshot rbd_map rbd_unmap rbd_showmapped display_result _clean_up _create_rados_pool display_ceph_os_info $RADOS_MKPOOL $RADOS_RMPOOL $RBD_CREATE $RBD_RESIZE $RBD_INFO $RBD_REMOVE $RBD_RENAME $RBD_MV $RBD_LS $RBD_LIST $RBD_CLONE $RBD_EXPORT $RBD_IMPORT $RBD_CP $RBD_COPY $SNAP_CREATE $SNAP_LS $SNAP_LIST $SNAP_ROLLBACK $SNAP_PURGE $SNAP_REMOVE $POOL_RM_SUCCESS $POOL_MK_SUCCESS $RBD_EXISTS_ERR $RBD_WATCH $RBD_MAP $RBD_UNMAP $RBD_SHOWMAPPED get_command_output debug_msg ); +use Pod::Usage(); +use Getopt::Long(); + +use strict; +#use warnings; +$|=1; + +# variables +our $TC_CNT = " "; +our $PASS_CNT = 0; +our $FAIL_CNT = 0; +our $RADOS_MKPOOL = "rados mkpool"; +our $RADOS_RMPOOL = "rados rmpool"; +our $RBD_CREATE = "rbd create"; +our $RBD_RESIZE = "rbd resize"; +our $RBD_INFO = "rbd info"; +our $RBD_REMOVE = "rbd rm"; +our $RBD_RENAME = "rbd rename"; +our $RBD_MV = "rbd mv"; +our $RBD_LS = "rbd ls"; +our $RBD_LIST = "rbd list"; +our $RBD_CLONE = "rbd clone"; +our $RBD_EXPORT = "rbd export"; +our $RBD_IMPORT = "rbd import"; +our $RBD_COPY = "rbd copy"; +our $RBD_CP = "rbd cp"; +our $SNAP_CREATE = "rbd snap create"; +our $SNAP_LIST = "rbd snap list"; +our $SNAP_LS = "rbd snap ls"; +our $SNAP_ROLLBACK = "rbd snap rollback"; +our $SNAP_REMOVE = "rbd snap rm"; +our $SNAP_PURGE = "rbd snap purge"; +our $RBD_WATCH = "rbd watch"; +our $RBD_MAP = "sudo rbd map"; +our $RBD_UNMAP = "sudo rbd unmap"; +our $RBD_SHOWMAPPED = "rbd showmapped"; + +#====Error messages======================== + +our $RBD_RM_ERROR = "image name was not specified"; +our $SNAP_LS_ERROR = "snap name was not specified"; +our $SNAP_RM_ERROR = "remove failed"; +our $SNAP_ROLLBACK_ERR = "rollback failed"; +our $RBD_CP_ERROR = "error: destination image name"; +our $RBD_EXISTS_ERR = "exists"; +our $RBD_RENAME_ERROR = "rename error"; +our $RBD_DELETE_ERROR = "delete error"; +our $RBD_NO_IMAGE = "error opening image"; +our $RBD_POOL_ERROR = "error opening pool"; +our $RBD_INT_ERR = "expected integer"; +our $RBD_ARG_ERR = "requires an argument"; +our $RBD_EXP_ERR = "export error"; +our $RBD_IMP_ERR = "import failed"; +our $RBD_MAP_ERR = "add failed"; +our $RBD_UNMAP_ERR = "remove failed"; +our $RBD_INFO_SNAP_ERR = "error setting snapshot context"; + +#=======Success messages======================= + +our $POOL_MK_SUCCESS = "successfully created pool"; +our $POOL_RM_SUCCESS = "successfully deleted pool"; +our $RBD_RM_SUCCESS = "Removing image: 100%"; +our $RBD_CP_SUCCESS = "Image copy: 100%"; +our $RBD_RESIZE_SUCCESS = "Resizing image: 100%"; +our $RBD_EXP_SUCCESS = "Exporting image: 100%"; +our $RBD_IMP_SUCCESS = "Importing image: 100%"; +our $SNAP_ROLLBACK_SUCCESS = "Rolling back to snapshot: 100%"; +our $SNAP_PURGE_SUCCESS = "Removing all snapshots: 100%"; + +#===========Variables used in the script======== +our $test_log = "logfile.txt"; +our $success = "test_completed.txt"; +our $fail = "log.txt"; +our $exec_cmd; +our $PASS_FLAG; +our $MSG; +our $pool_name; +our $rbd_imp_file = "test_file"; +our $exp_file = "rbd_test_file1"; +our $exp_file1 = "rbd_test_file2"; +our $rbd_imp_test = "new_test_file"; +our $img_name = "test_img"; + +sub _clean_up { + my $exec_cmd = get_command_output( +"rm $img_name $rbd_imp_file $rbd_imp_test $exp_file $exp_file1" + ); +} + +sub perform_action { + my ( $action, $cmd_args, $option ) = @_; + my $command = frame_command( $action, $cmd_args, $option ); + my $cmd_op = get_command_output($command); + validate_cmd_output( $cmd_op, $action, $cmd_args, $option ); +} + +sub pass { + my ($comment) = @_; + print "Comment required." unless length $comment; + chomp $comment; + print_border2(); + print "Test case: $TC_CNT PASSED - $comment \n"; + print_border2(); + $PASS_CNT++; + $PASS_FLAG = "TRUE"; + $MSG = "$comment"; +} + +sub fail { + my ($comment) = @_; + print "Comment required." unless length $comment; + chomp $comment; + print_border2(); + print "Test case: $TC_CNT FAILED - $comment \n"; + print_border2(); + $FAIL_CNT++; + $PASS_FLAG = "FALSE"; + $MSG = "$comment"; +} + +sub debug_msg { + my ($comment,$is_debug) = @_; + print "Comment required." unless length $comment; + chomp $comment; + print_border3(); + if (!$is_debug){ + print "DEBUG: $comment \n"; + } else { + print "$comment \n"; + } + print_border3(); +} + +sub print_border { + print "=" x 70 . "\n"; +} + +sub print_border2 { + print "~" x 70 . "\n"; +} + +sub print_border3 { + print "+" x 70 . "\n"; +} + +sub banner { + my ($string) = @_; + chomp $string; + print_border(); + print $string, "\n"; + print_border(); +} + +sub display_result { + banner("TEST RESULTS"); + banner( +"No. of test cases passed:$PASS_CNT\nNo. of test cases failed:$FAIL_CNT\n" + ); +} + +sub get_command_output { + my $cmd_output = shift; + open( FH, ">>$test_log" ); + print "\"$cmd_output\"\n"; + my $exec_cmd = `$cmd_output 2>&1`; + print "$exec_cmd\n"; + print FH "$exec_cmd\n"; + close(FH); + return $exec_cmd; +} + +sub frame_command { + my ( $action, $cmd_args, $option ) = @_; + my @command_set = split( /,/, $cmd_args ); + my $command = join( ' --', @command_set ); + $command = "$action $command"; + return $command; +} + +sub check_if_listed { + my ( $chk_cmd, $check_arg, $cmd, $args ) = @_; + my $check_op = get_command_output($chk_cmd); + if ( $check_op =~ /$check_arg/ ) { + pass("$cmd $args passed"); + } + else { + fail("$cmd $args failed"); + } +} + +sub check_if_not_listed { + my ( $chk_cmd, $check_arg, $cmd, $args ) = @_; + my $check_op = get_command_output($chk_cmd); + if ( $check_op =~ /$check_arg/ ) { + fail("$cmd $args failed"); + } + else { + pass("$cmd $args passed"); + } +} + +sub validate_cmd_output { + $TC_CNT++; + $PASS_FLAG = "FALSE"; + $MSG = " "; + my ( $arg, $snap, $arg1 ); + my $snaps; + my ( $cmd_op, $act, $args, $test_flag ) = @_; + if ( !$test_flag ) { + if ( ( $act =~ /$RBD_CREATE/ ) && ( !$cmd_op ) ) { + $arg = ( split /,/, $args )[0]; + check_if_listed( "$RBD_LS $pool_name", $arg, $act , $args); + } + elsif (( ( $act =~ /$RBD_RENAME/ ) || ( $act =~ /$RBD_MV/ ) ) + && ( !$cmd_op ) ) + { + $arg = ( split /\//, $args )[-1]; + check_if_listed( "$RBD_LS $pool_name", $arg, $act, $args ); + } + elsif ( ( $act =~ /$SNAP_CREATE/ ) && ( !$cmd_op ) ) { + $snaps = ( split / /, $args )[1]; + $arg = ( split /\//, $args )[-1]; + check_if_listed( "$SNAP_LS $arg", $snaps, $act, $args ); + } + elsif ( ( $act =~ /$SNAP_REMOVE/ ) && ( !$cmd_op ) ) { + $snaps = ( split /\@/, $args )[-1]; + $arg1 = ( split /\@/, $args )[-2]; + $arg = ( split /\//, $arg1 )[-1]; + check_if_not_listed( "$SNAP_LS $arg", $snaps , $act, $args); + } + elsif (( $act =~ /$SNAP_PURGE/ ) + && ( $cmd_op =~ /$SNAP_PURGE_SUCCESS/ ) ) + { + pass("$act $args passed"); + } + elsif ( $act =~ /$RBD_INFO/ ) { + $arg = ( split /\//, $args )[-1]; + my $rbd_img_quoted = "\'$arg\'"; + pass("$act $args passed") + if ( $cmd_op =~ /rbd image $rbd_img_quoted/ ); + } + elsif ( ( $act =~ /$RBD_REMOVE/ ) && ( $cmd_op =~ /$RBD_RM_SUCCESS/ ) ) + { + check_if_not_listed( "$RBD_LS $pool_name", $args, $act ); + } + elsif (( $act =~ /$RBD_RESIZE/ ) + && ( $cmd_op =~ /$RBD_RESIZE_SUCCESS/ ) ) + { + pass("$act $args passed"); + } + elsif (( ( $act =~ /$RBD_COPY/ ) || ( $act =~ /$RBD_CP/ ) ) + && ( $cmd_op =~ /$RBD_CP_SUCCESS/ ) ) + { + pass("$act $args passed"); + } + elsif ( + ( $act =~ /$RBD_EXPORT/ ) + && ( ( $cmd_op =~ /$RBD_EXP_SUCCESS/ ) + || ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) ) + ) + { + pass("$act $args passed"); + } + elsif ( + ( $act =~ /$RBD_IMPORT/ ) + && ( ( $cmd_op =~ /$RBD_IMP_SUCCESS/ ) + || ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) ) + ) + { + pass("$act $args passed"); + } + elsif (( $act =~ /$SNAP_ROLLBACK/ ) + && ( $cmd_op =~ /$SNAP_ROLLBACK_SUCCESS/ ) ) + { + pass("$act $args passed"); + } + elsif ( ( $act =~ /$RBD_SHOWMAPPED/ ) && ( $cmd_op =~ /$img_name/ ) ) { + pass("$act $args passed"); + } + elsif ( ( $act =~ /$RBD_MAP/ ) && ( $cmd_op !~ /./ ) ) { + pass("$act $args passed"); + } + elsif ( ( $act =~ /$RBD_UNMAP/ ) && ( $cmd_op !~ /$RBD_UNMAP_ERR/ ) ) { + pass("$act $args passed"); + } + else { + if ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) { + pass("$act $args $RBD_EXISTS_ERR"); + } + else { + fail("$act $args failed"); + } + } + } + elsif ( ( $test_flag == 1 ) && ( $cmd_op =~ /$RBD_EXISTS_ERR/ ) ) { + pass("Already exists: $act $args passed"); + } + elsif ( + ( $test_flag == 2 ) + && ( ( $cmd_op =~ /$RBD_RENAME_ERROR/ ) + || ( $cmd_op =~ /$RBD_DELETE_ERROR/ ) + || ( $cmd_op =~ /$RBD_NO_IMAGE/ ) + || ( $cmd_op =~ /$RBD_POOL_ERROR/ ) + || ( $cmd_op =~ /$RBD_INT_ERR/ ) + || ( $cmd_op =~ /$RBD_ARG_ERR/ ) + || ( $cmd_op =~ /$RBD_RM_ERROR/ ) + || ( $cmd_op =~ /$SNAP_LS_ERROR/ ) + || ( $cmd_op =~ /$SNAP_RM_ERROR/ ) + || ( $cmd_op =~ /$RBD_CP_ERROR/ ) + || ( $cmd_op =~ /$RBD_EXP_ERR/ ) + || ( $cmd_op =~ /$RBD_IMP_ERR/ ) + || ( $cmd_op =~ /$SNAP_ROLLBACK_ERR/ ) + || ( $cmd_op =~ /$RBD_MAP_ERR/ ) + || ( $cmd_op =~ /$RBD_UNMAP_ERR/ ) + || ( $cmd_op =~ /$RBD_INFO_SNAP_ERR/ ) ) + ) + { + pass("negative case: $act $args passed"); + } + elsif ( ( $test_flag == 3 ) && ( $cmd_op =~ /usage/ ) ) { + pass("negative case: $act $args passed"); + } + else { + fail("negative case:$act $args failed"); + } + log_results(); +} + +# Test Script execution result +sub log_results +{ + if ( $PASS_FLAG eq "TRUE" ) { + open( TC, '>>test_completed.txt' ); + print TC "[Test Case $TC_CNT: Success] $MSG\n"; + close(TC); + open( TC, '>>log.txt' ); + print TC "[Test Case $TC_CNT: Success] $MSG\n"; + close(TC); + } + else { + open( TC, '>>test_completed.txt' ); + print TC "[Test Case $TC_CNT: Failure] $MSG\n"; + close(TC); + open( TC, '>>log.txt' ); + print TC "[Test Case $TC_CNT: Failure] $MSG\n"; + close(TC); + } +} + +sub display_ceph_os_info +{ + my $ceph_v = get_command_output ( "ceph -v" ); + my @ceph_arr = split(" ",$ceph_v); + $ceph_v = "Ceph Version: $ceph_arr[2]"; + my $msg = "The Tests are running on"; + my $os_distro = get_command_output ( "lsb_release -d" ); + my @os_arr = split(":",$os_distro); + $os_distro = "Linux Flavor:$os_arr[1]"; + debug_msg ( "$msg\n$os_distro$ceph_v",1 ); +} +1; diff --git a/qa/qa_scripts/cephscrub.sh b/qa/qa_scripts/cephscrub.sh new file mode 100755 index 00000000000..e28a52e929c --- /dev/null +++ b/qa/qa_scripts/cephscrub.sh @@ -0,0 +1,27 @@ +sudo apt-get -y purge ceph +sudo apt-get -y purge ceph-dbg +sudo apt-get -y purge ceph-mds +sudo apt-get -y purge ceph-mds-dbg +sudo apt-get -y purge ceph-fuse +sudo apt-get -y purge ceph-fuse-dbg +sudo apt-get -y purge ceph-common +sudo apt-get -y purge ceph-common-dbg +sudo apt-get -y purge ceph-fs-common +sudo apt-get -y purge ceph-fs-common-dbg +sudo apt-get -y purge ceph-resource-agents +sudo apt-get -y purge librados2 +sudo apt-get -y purge librados2-dbg +sudo apt-get -y purge librados-dev +sudo apt-get -y purge librbd1 +sudo apt-get -y purge librbd1-dbg +sudo apt-get -y purge librbd-dev +sudo apt-get -y purge libcephfs1 +sudo apt-get -y purge libcephfs1-dbg +sudo apt-get -y purge libcephfs-dev +sudo apt-get -y purge radosgw +sudo apt-get -y purge radosgw-dbg +sudo apt-get -y purge rest-bench +sudo apt-get -y purge rest-bench-dbg +sudo apt-get -y purge obsync +sudo apt-get -y purge python-ceph + diff --git a/qa/qa_scripts/rbd_cli_tests.pl b/qa/qa_scripts/rbd_cli_tests.pl new file mode 100755 index 00000000000..b95c3240601 --- /dev/null +++ b/qa/qa_scripts/rbd_cli_tests.pl @@ -0,0 +1,313 @@ +#! /usr/bin/perl + +=head1 NAME + +rbd_cli_tests.pl - Script to test the RBD CLI commands and report the +test results + +=head1 SYNOPSIS + +Use: + perl rbd_cli_tests.pl [--pool pool_name][--help] + +Examples: + perl rbd_cli_tests.pl --pool test_pool + or + perl rbd_cli_tests.pl --help + +=head1 DESCRIPTION + +This script intends to test the RBD CLI commands for the scenarios mentioned below +and reports the test results + +Positive cases +Negative cases +-- Boundary value testing +-- Incorrect Parameter values/ Incorrect field values +-- Insufficient parameters / Extra parameters + +=head1 ARGUMENTS + +rbd_cli_tests.pl takes the following arguments: + --pool + (optional) If not specified, rbd pool is used. + --help + (optional) Displays the usage message. + +=cut + +use Cwd; +use RbdLib qw(perform_action create_image resize_image rename_image copy_image list_image info_image export_image import_image remove_image create_snapshots rollback_snapshots purge_snapshots list_snapshots remove_snapshot rbd_map rbd_unmap rbd_showmapped display_result _clean_up _create_rados_pool display_ceph_os_info $RADOS_MKPOOL $RADOS_RMPOOL $RBD_CREATE $RBD_RESIZE $RBD_INFO $RBD_REMOVE $RBD_RENAME $RBD_MV $RBD_LS $RBD_LIST $RBD_CLONE $RBD_EXPORT $RBD_IMPORT $RBD_CP $RBD_COPY $SNAP_CREATE $SNAP_LS $SNAP_LIST $SNAP_ROLLBACK $SNAP_PURGE $SNAP_REMOVE $POOL_RM_SUCCESS $POOL_MK_SUCCESS $RBD_EXISTS_ERR $RBD_WATCH $RBD_MAP $RBD_UNMAP $RBD_SHOWMAPPED get_command_output debug_msg ); + +use Pod::Usage(); +use Getopt::Long(); + +use strict; +my ( $help, $pool ); + +Getopt::Long::GetOptions( + 'pool=s' => \$pool, + 'help' => \$help +); + +Pod::Usage::pod2usage( -verbose => 1 ) if ($help); + +our $pool_name = "rbd"; +$pool_name = $pool if ($pool); + +RbdLib::banner ("Starting Test Execution"); + +#===========Variables used in the script======== + +our $img_name = "test_img"; +our $snap_name = "snap1"; +our $snap_name2 = "snap2"; +our $snap_name3 = "snap3"; +our $snap_name4 = "snap4"; +our $new_rbd_img = "new_rbd_img"; +our $non_existing_img = "rbdimage"; +our $cp_new = "new"; +our $exp_file = "rbd_test_file1"; +our $exp_file1 = "rbd_test_file2"; +our $exp_file2 = "rbd_test_file3"; +our $rbd_imp_file = "test_file"; +our $rbd_imp_image = "new_imp_img"; +our $content = "This is a test file"; +our $rbd_snap_new = "new"; +our $neg_img_name = "neg_img"; +our $new_img_name = "new_img"; +our $max_img_name = "max_img"; +our $img_name1 = "test_img1"; +our $rbd_imp_test = "new_test_file"; +our $non_pool_name = "no_pool"; +our $no_snap = "no_snap"; +our $img_name_mv = "new_img_mv"; +our $test_log = "logfile.txt"; +our $success = "test_completed.txt"; +our $fail = "log.txt"; +our $exec_cmd; +our $PASS_FLAG; +our $MSG; +our $pool_name; + +print "rbd $RBD_CREATE \n"; +# Tests for create image +sub create_image { + perform_action ( $RBD_CREATE, "$img_name,pool $pool_name,size 1024", 0 ); + + perform_action( $RBD_CREATE, "$img_name_mv,pool $pool_name,size 1024", 0 ); + perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size 0,order 22", + 3 ); + perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size 0", 3 ); + perform_action( $RBD_CREATE, "$neg_img_name,pool $pool_name,size -1", 3 ); + perform_action( $RBD_CREATE, "$img_name1 pool $pool_name", 3 ); + perform_action( $RBD_CREATE, "--size 1024", 3 ); + perform_action( $RBD_CREATE, + "$max_img_name,pool $pool_name,size 1024000000000", 0 ); + perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size 2048,order", + 2 ); + perform_action( $RBD_CREATE, "$img_name1,pool $pool_name,size,order 22", + 2 ); + perform_action( $RBD_CREATE, + "$new_img_name,pool $pool_name,size 1024,new-format", 0 ); + +} + +#Tests to create snapshot +sub create_snapshots { + perform_action( $SNAP_CREATE, "--snap $snap_name $pool_name\/$img_name", + 0 ); + perform_action( $SNAP_CREATE, "--snap $snap_name $pool_name\/$img_name", + 1 ); + perform_action( $SNAP_CREATE, "$snap_name", 2 ); + + perform_action($SNAP_CREATE,"--snap $snap_name2 $pool_name\/$img_name",0); + perform_action( $SNAP_CREATE, "--snap $snap_name3 $pool_name\/$img_name", + 0 ); + perform_action( $SNAP_CREATE, "--snap $snap_name4 $pool_name\/$img_name", + 0 ); +} + +#Tests to rollback snapshot +sub rollback_snapshot { + perform_action( $SNAP_ROLLBACK, "--snap $snap_name2 $pool_name\/$img_name", + 0 ); + perform_action( $SNAP_ROLLBACK, + "--snap $rbd_snap_new $pool_name\/$img_name", 2 ); + perform_action( $SNAP_ROLLBACK, + "--snap $snap_name $pool_name\/$new_rbd_img", 2 ); +} + +#Tests to purge snapshots +sub purge_snapshots { + perform_action( $SNAP_PURGE, "$pool_name\/$img_name", 0 ); + perform_action( $SNAP_PURGE, "$pool_name\/$new_rbd_img", 2 ); +} + +#Tests to list snapshots for an image +sub list_snapshots { + perform_action( $SNAP_LIST, "$pool_name\/$non_existing_img", 2 ); +} + +# Tests for remove snapshots +sub remove_snapshot { + perform_action( $SNAP_REMOVE, "$pool_name\/$img_name\@$snap_name", 0 ); + perform_action( $SNAP_REMOVE, "$non_pool_name\/$img_name\@$snap_name3", 2 ); + perform_action( $SNAP_REMOVE, "$pool_name\/$img_name\@$snap_name2", 0 ); + perform_action( $SNAP_REMOVE, "$pool_name\/$non_existing_img", 2 ); + perform_action( $SNAP_REMOVE, " ", 2 ); +} + +# Tests for resize image +sub resize_image { + perform_action( $RBD_RESIZE, "$img_name,size 1024,pool $pool_name", 0 ); + perform_action( $RBD_RESIZE, "$non_existing_img,size 1024,pool $pool_name", + 2 ); +} + +# Tests for list rbd image +sub list_image { + perform_action( $RBD_LIST, "$non_pool_name", 2 ); +} + +# Tests to copy rbd image +sub copy_image { + perform_action( $RBD_CP, "$pool_name\/$img_name $pool_name\/$cp_new", 0 ); + perform_action( $RBD_CP, "$pool_name\/$non_existing_img", 2 ); +} + +#Tests for rbd info +sub info_image { + perform_action( $RBD_INFO, "$pool_name\/$img_name", 0 ); + perform_action( $RBD_INFO, "--snap $snap_name $pool_name\/$img_name_mv", + 2 ); + perform_action( $RBD_INFO, "--snap $no_snap $pool_name\/$img_name", 2 ); + perform_action( $RBD_INFO, "$pool_name\/$non_existing_img", 2 ); +} + +#Tests for rename image +sub rename_image { + perform_action( $RBD_RENAME, + "$pool_name\/$img_name_mv $pool_name\/$new_rbd_img", 0 ); + perform_action( $RBD_MV, + "$pool_name\/$new_rbd_img $pool_name\/$img_name_mv", 0 ); +} + +# Tests for remove image +sub remove_image { + perform_action( $RBD_REMOVE,"$pool_name\/$img_name",0); + perform_action( $RBD_REMOVE, "$pool_name\/$new_rbd_img", 2 ); + perform_action( $RBD_REMOVE, "--pool $pool_name $rbd_imp_image", 0 ); + perform_action( $RBD_REMOVE, "-p $pool_name $cp_new", 0 ); + perform_action( $RBD_REMOVE, " ", 2 ); +} + +# Tests for export rbd image +sub export_image { + perform_action( $RBD_EXPORT, "$pool_name\/$img_name $exp_file", 0 ); + perform_action( $RBD_EXPORT, "$pool_name\/$img_name .", 2 ); + perform_action( $RBD_EXPORT, "$pool_name\/$img_name", 2 ); + perform_action( $RBD_EXPORT, + "--snap $snap_name $pool_name\/$img_name $exp_file1", 0 ); + perform_action( $RBD_EXPORT, + "--snap $no_snap $pool_name\/$img_name $exp_file1", 2 ); + perform_action( $RBD_EXPORT, + "--snap $snap_name $pool_name\/$non_existing_img $exp_file2", 2 ); +} + +#Tests for import file to rbd image +sub import_image { + my $i = create_test_file( $rbd_imp_file, $content ); + if ( $i == 0 ) { + perform_action( $RBD_IMPORT, "$rbd_imp_file $rbd_imp_image", 0 ); + } + create_test_file( "$rbd_imp_test", 0 ); + perform_action( $RBD_IMPORT, "$rbd_imp_test $pool_name\/$rbd_imp_image", + 2 ); + perform_action( $RBD_IMPORT, "$exp_file $pool_name\/$rbd_imp_image", 2 ); +} + +#To map rbd image to device +sub rbd_map { + + # Execute "modprobe rbd" + my $cmd = get_command_output("sudo modprobe rbd"); + if ( !$cmd ) { + perform_action( $RBD_MAP, "$pool_name\/$img_name", 0 ); + rbd_showmapped(); + perform_action( $RBD_MAP, "$pool_name\/$non_existing_img", 2 ); + } +} + +# To list rbd map +sub rbd_showmapped { + perform_action( $RBD_SHOWMAPPED, "", 0 ); +} + +# To unmap rbd device +sub rbd_unmap { + perform_action( $RBD_UNMAP, "/dev/rbd0", 0 ); + sleep(10); + perform_action( $RBD_UNMAP, "/dev/rbd10", 2 ); +} + +# To create a test file and write to it +sub create_test_file { + my ( $test_arg, $content ) = @_; + my $command = "touch $test_arg"; + my $cmd = get_command_output($command); + if ( ( !$cmd ) && ($content) ) { + $command = "echo $content > $test_arg"; + $cmd = get_command_output($command); + if ( !$cmd ) { + my $cmd = get_command_output("ls -l $test_arg"); + } + else { + return 1; + } + } + else { + return 1; + } + return 0; +} + +sub _create_rados_pool { + $exec_cmd = get_command_output("$RADOS_RMPOOL $pool_name"); + if ( ( $exec_cmd =~ /$POOL_RM_SUCCESS/ ) + || ( $exec_cmd =~ /does not exist/ ) ) + { + debug_msg("Pool $pool_name deleted"); + } + $exec_cmd = get_command_output("$RADOS_MKPOOL $pool_name"); + if ( ( $exec_cmd =~ /$POOL_MK_SUCCESS/ ) + || ( $exec_cmd =~ /$RBD_EXISTS_ERR/ ) ) + { + debug_msg("Pool $pool_name created"); + } +} + +#main() starts here + +display_ceph_os_info(); +_create_rados_pool(); +create_image(); +list_image(); +rename_image(); +resize_image(); +info_image(); +create_snapshots(); +export_image(); +import_image(); +list_snapshots(); +rollback_snapshot(); +remove_snapshot(); +purge_snapshots(); +rbd_map(); +rbd_unmap(); +copy_image(); +remove_image(); +display_result(); +_clean_up(); + +