ceph/qa/workunits/rgw/s3_user_quota.pl
Warren Usui b2fcc6e195 Remove code duplication from s3 tests.
A new module, s3_utilities.pm has been created.  It contains
subroutines common to at least two of the workunits in this
directory. Code was moved here from the other pl files, and
some minor changes (paramers and scope changes) were needed.

Fixes: 7472
Signed-off-by: Warren Usui <warren.usui@inktank.com>
2014-03-14 21:52:37 -07:00

189 lines
5.3 KiB
Perl
Executable File

#! /usr/bin/perl
=head1 NAME
s3_user_quota.pl - Script to test the rgw user quota functionality using s3 interface.
=head1 SYNOPSIS
Use:
perl s3_user_quota.pl [--help]
Examples:
perl s3_user_quota.pl
or
perl s3_user_quota.pl --help
=head1 DESCRIPTION
This script intends to test the rgw user quota funcionality using s3 interface
and reports the test results
=head1 ARGUMENTS
s3_user_quota.pl takes the following arguments:
--help
(optional) Displays the usage message.
=cut
use Amazon::S3;
use Data::Dumper;
use IO::File;
use Getopt::Long;
use Digest::MD5;
use Pod::Usage();
use s3_utilities;
my $help;
Getopt::Long::GetOptions(
'help' => \$help
);
Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
#== local variables ===
our $mytestfilename;
my $mytestfilename1;
my $logmsg;
my $kruft;
my $s3;
my $domain = "front.sepia.ceph.com";
my $host = get_hostname();
our $hostname = "$host.$domain:7280";
our $testfileloc;
our $cnt;
sub quota_set_max_size_per_user {
my ($maxsize, $size1,$rgw_user) = @_;
run_s3($rgw_user);
my $set_quota = `sudo radosgw-admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
if (($set_quota !~ /./)&&($maxsize == 0)){
my $ret = test_max_objs($size1, $rgw_user);
if ($ret == 1){
pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
}else {
fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
}
} elsif (($set_quota !~ /./) && ($maxsize != 0)) {
my $ret = test_max_objs($size1, $rgw_user);
if ($ret == 0){
pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
}else {
fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
}
}
delete_keys($mytestfilename);
purge_data($rgw_user);
return 0;
}
sub max_size_per_user {
my ($maxsize, $size1,$rgw_user) = @_;
run_s3($rgw_user);
my $set_quota = `sudo radosgw-admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
if (($set_quota !~ /./) && ($maxsize != 0)) {
my $ret = test_max_objs($size1, $rgw_user);
if ($ret == 0){
$cnt++;
}
}
return $cnt;
}
sub quota_set_max_obj_per_user {
# set max objects
my ($maxobjs, $size1, $rgw_user) = @_;
run_s3($rgw_user);
my $set_quota = `sudo radosgw-admin quota set --uid=$rgw_user --quota-scope=user --max-objects=$maxobjs`;
if (($set_quota !~ /./) && ($maxobjs == 0)){
my $ret = test_max_objs($size1, $rgw_user);
if ($ret == 1){
pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
}else {
fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
}
} elsif (($set_quota !~ /./) && ($maxobjs == 1)) {
my $ret = test_max_objs($size1, $rgw_user);
if ($ret == 0){
pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
}else {
fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
}
}
delete_keys($mytestfilename);
purge_data($rgw_user);
}
sub quota_enable_user {
my ($rgw_user) = @_;
my $en_quota = `sudo radosgw-admin quota enable --uid=$rgw_user --quota-scope=user`;
if ($en_quota !~ /./){
print "quota enabled for the user $rgw_user \n";
} else {
print "quota enable failed for the user $rgw_user \n";
exit 1;
}
return 0;
}
sub quota_disable_user {
my $dis_quota = `sudo radosgw-admin quota disable --uid=$rgw_user --quota-scope=user`;
if ($dis_quota !~ /./){
print "quota disabled for the user $rgw_user \n";
} else {
print "quota disable failed for the user $rgw_user \n";
exit 1;
}
return 0;
}
# upload a file to the bucket
sub upload_file {
print "adding file to bucket $bucketname: $mytestfilename\n";
($bucket->add_key_filename( $mytestfilename, $testfileloc,
{ content_type => 'text/plain', },
) and (print "upload file successful\n" ) and return 0 ) or (return 1);
}
# delete the bucket
sub delete_bucket {
($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
}
#Function to upload the given file size to bucket and verify
sub test_max_objs {
my ($size, $rgw_user) = @_;
create_file($size);
quota_enable_user($rgw_user);
my $ret_value = upload_file();
return $ret_value;
}
# set user quota and ensure it is validated
sub test_user_quota_max_size{
my ($max_buckets,$size, $fsize) = @_;
my $usr = rand();
foreach my $i (1..$max_buckets){
my $ret_value = max_size_per_user($size, $fsize, $usr );
}
if ($ret_value == $max_buckets){
fail( "user quota max size for $usr failed on $max_buckets buckets" );
} else {
pass( "user quota max size for $usr passed on $max_buckets buckets" );
}
delete_keys($mytestfilename);
purge_data($usr);
}
#== Main starts here===
ceph_os_info();
check();
quota_set_max_obj_per_user('0', '10Mb', 'usr1');
quota_set_max_obj_per_user('1', '10Mb', 'usr2');
quota_set_max_size_per_user(0, '10Mb', 'usr1');
quota_set_max_size_per_user(1048576000, '1Gb', 'usr2');
test_user_quota_max_size(3,1048576000,'100Mb');
test_user_quota_max_size(2,1048576000, '1Gb');
print "OK";