]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
S3 test scripts
authortamil <tamil@ubuntu.(none)>
Thu, 18 Oct 2012 21:51:51 +0000 (14:51 -0700)
committertamil <tamil@ubuntu.(none)>
Thu, 18 Oct 2012 21:52:11 +0000 (14:52 -0700)
Signed-off-by: tamil <tamil.muthamizhan@inktank.com
qa/qa_scripts/S3Lib.pm [new file with mode: 0644]
qa/qa_scripts/s3-file-test.pl [new file with mode: 0755]

diff --git a/qa/qa_scripts/S3Lib.pm b/qa/qa_scripts/S3Lib.pm
new file mode 100644 (file)
index 0000000..12dd983
--- /dev/null
@@ -0,0 +1,92 @@
+#! /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" );
+    }
+}
diff --git a/qa/qa_scripts/s3-file-test.pl b/qa/qa_scripts/s3-file-test.pl
new file mode 100755 (executable)
index 0000000..b3ee5e1
--- /dev/null
@@ -0,0 +1,221 @@
+#!/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);
+}
+