Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / workunits / rgw / s3_user_quota.pl
1 #! /usr/bin/perl
2
3 =head1 NAME
4
5 s3_user_quota.pl - Script to test the rgw user quota functionality using s3 interface.
6
7 =head1 SYNOPSIS
8
9 Use:
10         perl s3_user_quota.pl [--help]
11
12 Examples:
13         perl s3_user_quota.pl
14         or
15         perl s3_user_quota.pl  --help
16
17 =head1 DESCRIPTION
18
19 This script intends to test the rgw user quota funcionality using s3 interface
20 and reports the test results
21
22 =head1 ARGUMENTS
23
24 s3_user_quota.pl takes the following arguments:
25    --help
26    (optional) Displays the usage message.
27
28 =cut
29
30 use Amazon::S3;
31 use Data::Dumper;
32 use IO::File;
33 use Getopt::Long;
34 use Digest::MD5;
35 use Pod::Usage();
36 use FindBin;
37 use lib $FindBin::Bin;
38 use s3_utilities;
39 use Net::Domain qw(hostfqdn);
40
41 my $help;
42
43 Getopt::Long::GetOptions(
44     'help' => \$help
45 );
46 Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
47
48 #== local variables ===
49 our $mytestfilename;
50 my $mytestfilename1;
51 my $logmsg;
52 my $kruft;
53 my $s3;
54 my $hostdom  = $ENV{RGW_FQDN}||hostfqdn();
55 my $port     = $ENV{RGW_PORT}||7280;
56 our $hostname = "$hostdom:$port";
57 our $testfileloc;
58 our $cnt;
59
60 sub quota_set_max_size_per_user {
61     my ($maxsize, $size1,$rgw_user) = @_;
62     run_s3($rgw_user);
63     my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
64     if (($set_quota !~ /./)&&($maxsize == 0)){
65       my $ret = test_max_objs($size1, $rgw_user);
66       if ($ret == 1){
67          pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
68       }else {
69          fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
70       }
71     } elsif (($set_quota !~ /./) && ($maxsize != 0)) {
72       my $ret = test_max_objs($size1, $rgw_user);
73       if ($ret == 0){
74          pass("quota set for user: $rgw_user with max_size=$maxsize passed" );
75       }else {
76          fail("quota set for user: $rgw_user with max_size=$maxsize failed" );
77       }
78     }
79     delete_keys($mytestfilename);
80     purge_data($rgw_user);
81     return 0;
82 }
83
84 sub max_size_per_user {
85     my ($maxsize, $size1,$rgw_user) = @_;
86     run_s3($rgw_user);
87     my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-size=$maxsize`;
88     if (($set_quota !~ /./) && ($maxsize != 0)) {
89       my $ret = test_max_objs($size1, $rgw_user);
90       if ($ret == 0){
91          $cnt++;
92       }
93     }
94     return $cnt;
95 }
96
97 sub quota_set_max_obj_per_user {
98     # set max objects
99     my ($maxobjs, $size1, $rgw_user) = @_;
100     run_s3($rgw_user);
101     my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=user --max-objects=$maxobjs`;
102     if (($set_quota !~ /./) && ($maxobjs == 0)){
103       my $ret = test_max_objs($size1, $rgw_user);
104       if ($ret == 1){
105          pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
106       }else {
107          fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
108       }
109     } elsif (($set_quota !~ /./) && ($maxobjs == 1)) {
110       my $ret = test_max_objs($size1, $rgw_user);
111       if ($ret == 0){
112          pass("quota set for user: $rgw_user with max_objects=$maxobjs passed" );
113       }else {
114          fail("quota set for user: $rgw_user with max_objects=$maxobjs failed" );
115       }
116     }
117     delete_keys($mytestfilename);
118     purge_data($rgw_user);
119 }
120  
121 sub quota_enable_user {
122     my ($rgw_user) = @_;
123     my $en_quota = `$radosgw_admin quota enable --uid=$rgw_user --quota-scope=user`;
124     if ($en_quota !~ /./){
125       print "quota enabled for the user $rgw_user \n";
126     } else {
127       print "quota enable failed for the user $rgw_user \n";
128       exit 1;
129     }
130     return 0;
131 }
132
133 sub quota_disable_user {
134     my $dis_quota = `$radosgw_admin quota disable --uid=$rgw_user --quota-scope=user`;
135     if ($dis_quota !~ /./){
136       print "quota disabled for the user $rgw_user \n";
137     } else {
138       print "quota disable failed for the user $rgw_user \n";
139       exit 1;
140     }
141     return 0;
142 }
143
144 # upload a file to the bucket
145 sub upload_file {
146     print "adding file to bucket $bucketname: $mytestfilename\n";
147     ($bucket->add_key_filename( $mytestfilename, $testfileloc,
148         { content_type => 'text/plain', },
149     ) and (print "upload file successful\n" ) and return 0 ) or (return 1);
150 }
151
152 # delete the bucket
153 sub delete_bucket {
154    ($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
155 }
156
157 #Function to upload the given file size to bucket and verify
158 sub test_max_objs {
159     my ($size, $rgw_user) = @_;
160     create_file($size);
161     quota_enable_user($rgw_user);
162     my $ret_value = upload_file();
163     return $ret_value;
164 }
165
166 # set user quota and ensure it is validated
167 sub test_user_quota_max_size{
168     my ($max_buckets,$size, $fsize) = @_;
169     my $usr = rand();
170     foreach my $i (1..$max_buckets){
171        my $ret_value = max_size_per_user($size, $fsize, $usr );
172     }
173     if ($ret_value == $max_buckets){
174        fail( "user quota max size for $usr failed on $max_buckets buckets" );
175     } else {
176        pass( "user quota max size for $usr passed on $max_buckets buckets" );
177     }
178     delete_keys($mytestfilename);
179     purge_data($usr);
180 }
181
182 #== Main starts here===
183 ceph_os_info();
184 check();
185 quota_set_max_obj_per_user('0', '10Mb', 'usr1');
186 quota_set_max_obj_per_user('1', '10Mb', 'usr2');
187 quota_set_max_size_per_user(0, '10Mb', 'usr1');
188 quota_set_max_size_per_user(1048576000, '1Gb', 'usr2');
189 test_user_quota_max_size(3,1048576000,'100Mb');
190 test_user_quota_max_size(2,1048576000, '1Gb');
191 print "OK";