--- /dev/null
+#! /usr/bin/perl
+=head1 NAME
+
+S3Lib.pm - Perl Module that contains the functions used by S3 test scripts for testing Rados gateway.
+
+=cut
+
+package S3Lib;
+use Cwd;
+use Exporter;
+@ISA = 'Exporter';
+@EXPORT_OK = qw(get_user_info $rgw_user delete_user _write_log_entry _exit_result);
+
+#==variables ===
+my $rgw_user = "qa_user";
+
+#Function that executes the CLI commands and returns the output of the command
+
+sub get_command_output {
+ my $cmd_output = shift;
+ open( FH, ">>$test_log" );
+ print FH "\"$cmd_output\"\n";
+ my $exec_cmd = `$cmd_output 2>&1`;
+ print FH "$exec_cmd\n";
+ close(FH);
+ return $exec_cmd;
+}
+
+# Function that enters the given msg to log.txt
+
+sub _write_log_entry {
+ my $logmsg = shift;
+ open(TC,'>>log.txt');
+ print TC "[Log] $logmsg\n";
+ close(TC);
+}
+
+# Function that creates the test_completed.txt as required by xstudio run at the end of the test
+
+sub _exit_result {
+ my $exit_status = shift;
+ open (TCOMP, '>>test_completed.txt');
+ close (TCOMP);
+ exit($exit_status);
+}
+
+# Function to create the user "qa_user" and extract the user access_key and secret_key of the user
+
+sub get_user_info
+{
+ my $cmd = "sudo radosgw-admin user create --uid=$rgw_user --display-name=$rgw_user";
+ my $cmd_op = get_command_output($cmd);
+ if ($cmd_op !~ /keys/){
+ _write_log_entry( "user $rgw_user NOT created" );
+ return (0,0);
+ }
+ _write_log_entry( "user $rgw_user created" );
+ my @get_user = (split/,/,$cmd_op);
+ foreach (@get_user) {
+ if ($_ =~ /access_key/ ){
+ $get_acc_key = $_;
+ } elsif ($_ =~ /secret_key/ ){
+ $get_sec_key = $_;
+ }
+ }
+ my $access_key = $get_acc_key;
+ my $acc_key = (split /:/, $access_key)[1];
+ $acc_key =~ s/\\//g;
+ $acc_key =~ s/ //g;
+ $acc_key =~ s/"//g;
+ my $secret_key = $get_sec_key;
+ my $sec_key = (split /:/, $secret_key)[1];
+ chop($sec_key);
+ chop($sec_key);
+ $sec_key =~ s/\\//g;
+ $sec_key =~ s/ //g;
+ $sec_key =~ s/"//g;
+ print "print $acc_key $sec_key \n";
+ return ($acc_key, $sec_key);
+}
+
+# Function that deletes the user $rgw_user and write to logfile.
+sub delete_user
+{
+ my $cmd = "sudo radosgw-admin user rm --uid=$rgw_user";
+ my $cmd_op = get_command_output($cmd);
+ if ($cmd_op !~ /aborting/){
+ _write_log_entry( "user $rgw_user deleted" );
+ } else {
+ _write_log_entry( "user $rgw_user NOT deleted" );
+ }
+}
--- /dev/null
+#!/usr/bin/perl
+use Amazon::S3;
+use Data::Dumper;
+use strict;
+use IO::File;
+use Getopt::Long;
+use Digest::MD5;
+
+use S3Lib qw(get_user_info $rgw_user delete_user _write_log_entry _exit_result);
+
+my $exit_status=0;
+my $tc;
+my $mytestfilename;
+my $logmsg;
+my $kruft;
+my $sec;
+my $min;
+my $hour;
+my $mon;
+my $year;
+my $mday;
+my $wday;
+my $yday;
+my $isdst;
+my $s3;
+sub get_timestamp {
+ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ if ($mon < 10) { $mon = "0$mon"; }
+ if ($hour < 10) { $hour = "0$hour"; }
+ if ($min < 10) { $min = "0$min"; }
+ if ($sec < 10) { $sec = "0$sec"; }
+ $year=$year+1900;
+
+ return $year . '_' . $mon . '_' . $mday . '__' . $hour . '_' . $min . '_' . $sec;
+}
+
+#
+# one time write to log with ceph version
+#
+open (TC,'>>log.txt');
+print TC "[Log] ";
+system ("ceph -v >> log.txt");
+
+#Retrieve test case index
+$tc=$ARGV[0];
+print "$tc\n";
+
+
+ if ($tc == 1) { system ("dd if=/dev/zero of=/tmp/10MBfile bs=10485760 count=1");
+$mytestfilename = '10MBfile'; }
+ elsif ($tc == 2) { system ("dd if=/dev/zero of=/tmp/100MBfile bs=10485760 count=10");
+$mytestfilename = '100MBfile'; }
+ elsif ($tc == 3) { system ("dd if=/dev/zero of=/tmp/500MBfile bs=10485760 count=50");
+$mytestfilename = '500MBfile'; }
+ elsif ($tc == 4) { system ("dd if=/dev/zero of=/tmp/1GBfile bs=10485760 count=100");
+$mytestfilename = '1GBfile'; }
+ elsif ($tc == 5) { system ("dd if=/dev/zero of=/tmp/2GBfile bs=10485760 count=200");
+$mytestfilename = '2GBfile'; }
+
+ else { open (TCOMP, '>>test_completed.txt');
+ close (TCOMP);
+ exit(2)
+ }
+
+my $testfileloc = "/tmp/".$mytestfilename;
+print "Test file = $testfileloc\n";
+#**************************************************************************
+# Modify access keys to suit the target account
+#my $aws_access_key_id = 'YTK5QR2XKATOSU5D9462';
+#my $aws_secret_access_key = 'i6xbrQs+edkWBdG8dY7e2DGjCZNfUwLjgEXzQw0B';
+
+my ($access_key, $secret_key) = get_user_info();
+if ( ($access_key) && ($secret_key) ) {
+
+# Make S3 connection
+# modify the host name if this test is run outside of QA.
+
+ $s3 = Amazon::S3->new(
+ { aws_access_key_id => $access_key,
+ aws_secret_access_key => $secret_key,
+ host => 'burnupi60.front.sepia.ceph.com',
+ secure => 0,
+ retry => 1,
+ }
+ );
+
+}
+#**************************************************************************
+
+ # List the existing buckets
+ my $response = $s3->buckets;
+ foreach my $bucket ( @{ $response->{buckets} } ) {
+ print "You have a bucket: " . $bucket->bucket . "\n";
+ }
+
+ # create a new bucket (the test bucket)
+
+ my $bucketname = 'kftestbucket' . get_timestamp();
+ print "Attempting to create bucket = $bucketname\n";
+ my $bucket = $s3->add_bucket( { bucket => $bucketname } )
+ or die $s3->err . $s3->errstr;
+ print "Bucket Created: $bucketname\n";
+ $logmsg = "Bucket Created: $bucketname";
+ _write_log_entry($logmsg);
+
+ # or use an existing bucket
+ #$bucket = $s3->bucket($bucketname);
+
+ # upload a file to the bucket
+print "adding file to bucket: $mytestfilename\n";
+ $bucket->add_key_filename( $mytestfilename, $testfileloc,
+ { content_type => 'text/plain', },
+ ) or die $s3->err . ": " . $s3->errstr;
+ $logmsg = "$mytestfilename uploaded";
+ _write_log_entry($logmsg);
+
+
+ # store a value in the bucket
+ $bucket->add_key( 'reminder.txt', 'this is text via add_key' )
+ or die $s3->err . ": " . $s3->errstr;
+ $logmsg = "Text value stored in file";
+ _write_log_entry($logmsg);
+
+ # copy a file inthe bucket
+
+
+ # list files in the bucket
+ $response = $bucket->list_all
+ or die $s3->err . ": " . $s3->errstr;
+ foreach my $key ( @{ $response->{keys} } ) {
+ my $key_name = $key->{key};
+ my $key_size = $key->{size};
+ print "Bucket contains key '$key_name' of size $key_size\n";
+ }
+
+ # fetch file from the bucket
+print "Downloading $mytestfilename to temp file: /tmp/downloadfilepurgeme...";
+ $response = $bucket->get_key_filename( $mytestfilename, 'GET', '/tmp/downloadfilepurgeme' )
+ or die $s3->err . ": " . $s3->errstr;
+ $logmsg = "file dowloaded";
+ _write_log_entry($logmsg);
+
+
+ # fetch value from the bucket
+ $response = $bucket->get_key('reminder.txt')
+ or die $s3->err . ": " . $s3->errstr;
+ print "reminder.txt:\n";
+ print " content length: " . $response->{content_length} . "\n";
+ print " content type: " . $response->{content_type} . "\n";
+ print " etag: " . $response->{content_type} . "\n";
+ print " content: " . $response->{value} . "\n";
+#
+# check the original file against the downloaded file to see if the file has been
+# corrupted.
+#
+
+my $md5 = Digest::MD5->new;
+my $check = 1;
+my $File = $testfileloc;
+my $dlfile = "/tmp/downloadfilepurgeme";
+open(FILE, $File) or die "Error: Could not open $File for MD5 checksum...";
+open(DLFILE, $dlfile) or die "Error: Could not open $dlfile for MD5 checksum.";
+ binmode(FILE);
+ binmode(DLFILE);
+ my $md5sum = $md5->addfile(*FILE)->hexdigest;
+ my $md5sumdl = $md5->addfile(*DLFILE)->hexdigest;
+close FILE;
+close DLFILE;
+
+print "\n";
+ print "Finished MD5 Checksum for $File:\n";
+ print "$md5sum\n";
+ print "Finished MD5 Checksum for $dlfile:\n";
+ print "$md5sumdl\n";
+ print "\n";
+
+#Compare
+if ( $md5sum eq $md5sumdl) {
+ print "Checksums are equal\n";
+ $logmsg = "Checksums are equal";
+ _write_log_entry($logmsg);
+ }
+else {
+ print "Checksums are not equal\n";
+ $exit_status=2;
+ $logmsg = "[Failure] Checksums are not equal";
+ _write_log_entry($logmsg);
+
+ }
+
+ # Negative test: try deleting the bucket which still contains objects
+ # the method should return false
+ if (!$bucket->delete_bucket) {
+ $logmsg= "Negative test - delete full bucket - Pass"}
+ else {
+ $logmsg = " Negative test - delete full bucket - Fail";
+ $exit_status = 3;
+ }
+ _write_log_entry($logmsg);
+
+ # delete keys
+ $bucket->delete_key('reminder.txt') or die $s3->err . ": " . $s3->errstr;
+ $bucket->delete_key($mytestfilename) or die $s3->err . ": " . $s3->errstr;
+ $bucket->delete_key('bogusfile') or die $s3->err . ": " . $s3->errstr;
+ # and finally delete the bucket
+ $bucket->delete_bucket or die $s3->err . ": " . $s3->errstr;
+
+delete_user();
+
+if ($exit_status == 0){
+ open(TC,'>>log.txt');
+ print TC "[Success]\n";
+ close(TC);
+ _exit_result();
+} else {
+ open(TC,'>>log.txt');
+ print TC "[Failure]\n";
+ close(TC);
+ _exit_result($exit_status);
+}
+