Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / workunits / rgw / s3_bucket_quota.pl
1 #! /usr/bin/perl
2
3 =head1 NAME
4
5 s3_bucket_quota.pl - Script to test the rgw bucket quota functionality using s3 interface. 
6
7 =head1 SYNOPSIS
8
9 Use:
10         perl s3_bucket_quota.pl [--help]
11
12 Examples:
13         perl s3_bucket_quota.pl 
14         or
15         perl s3_bucket_quota.pl  --help
16
17 =head1 DESCRIPTION
18
19 This script intends to test the rgw bucket quota funcionality using s3 interface 
20 and reports the test results
21
22 =head1 ARGUMENTS
23
24 s3_bucket_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 strict;
33 use IO::File;
34 use Getopt::Long;
35 use Digest::MD5;
36 use Pod::Usage();
37 use FindBin;
38 use lib $FindBin::Bin;
39 use s3_utilities;
40 use Net::Domain qw(hostfqdn);
41
42 my $help;
43
44 Getopt::Long::GetOptions(
45     'help' => \$help
46 );
47 Pod::Usage::pod2usage(-verbose => 1) && exit if ($help);
48
49 #== local variables ===
50 our $mytestfilename;
51 my $mytestfilename1;
52 my $logmsg;
53 my $kruft;
54 my $s3;
55 my $hostdom  = $ENV{RGW_FQDN}||hostfqdn();
56 my $port     = $ENV{RGW_PORT}||7280;
57 our $hostname = "$hostdom:$port";
58 our $testfileloc;
59 my $rgw_user = "qa_user";
60
61 # Function that deletes the user $rgw_user and write to logfile. 
62 sub delete_user
63 {
64     my $cmd = "$radosgw_admin user rm --uid=$rgw_user";
65     my $cmd_op = get_command_output($cmd);
66     if ($cmd_op !~ /aborting/){
67         print "user $rgw_user deleted\n";
68     } else {
69         print "user $rgw_user NOT deleted\n";
70         return 1;
71     }
72     return 0;
73 }
74
75 sub quota_set_max_size {
76     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=1048576000`; 
77     if ($set_quota !~ /./){
78       print "quota set for the bucket: $bucketname \n";
79     } else {
80       print "quota set failed for the bucket: $bucketname \n";
81       exit 1;
82     }
83     return 0;
84 }
85
86 sub quota_set_max_size_zero {
87     run_s3($rgw_user);
88     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=0`; 
89     if ($set_quota !~ /./){
90       pass ("quota set for the bucket: $bucketname with max size as zero\n");
91     } else {
92       fail ("quota set with max size 0 failed for the bucket: $bucketname \n");
93     }
94     delete_bucket();
95 }
96
97 sub quota_set_max_objs_zero {
98     run_s3($rgw_user);
99     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=0`; 
100     if ($set_quota !~ /./){
101       pass ("quota set for the bucket: $bucketname with max objects as zero\n");
102     } else {
103       fail ("quota set with max objects 0 failed for the bucket: $bucketname \n");
104     }
105     delete_bucket();
106 }
107
108 sub quota_set_neg_size {
109     run_s3($rgw_user);
110     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-size=-1`; 
111     if ($set_quota !~ /./){
112       pass ("quota set for the bucket: $bucketname with max size -1\n");
113     } else {
114       fail ("quota set failed for the bucket: $bucketname with max size -1 \n");
115     }
116     delete_bucket();
117 }
118
119 sub quota_set_neg_objs {
120     run_s3($rgw_user);
121     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=-1`; 
122     if ($set_quota !~ /./){
123       pass ("quota set for the bucket: $bucketname max objects -1 \n");
124     } else {
125       fail ("quota set failed for the bucket: $bucketname \n with max objects -1");
126     }
127     delete_bucket();
128 }
129
130 sub quota_set_user_objs {
131     my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=bucket`; 
132     my $set_quota1 = `$radosgw_admin quota set --bucket=$bucketname --max-objects=1`; 
133     if ($set_quota1 !~ /./){
134       print "bucket quota max_objs set for the given user: $bucketname \n";
135     } else {
136       print "bucket quota max_objs set failed for the given user: $bucketname \n";
137       exit 1;
138     }
139     return 0;
140 }
141
142 sub quota_set_user_size {
143     my $set_quota = `$radosgw_admin quota set --uid=$rgw_user --quota-scope=bucket`; 
144     my $set_quota1 = `$radosgw_admin quota set --bucket=$bucketname --max-size=1048576000`; 
145     if ($set_quota1 !~ /./){
146       print "bucket quota max size set for the given user: $bucketname \n";
147     } else {
148       print "bucket quota max size set failed for the user: $bucketname \n";
149       exit 1;
150     }
151     return 0;
152 }
153
154 sub quota_set_max_obj {
155     # set max objects 
156     my $set_quota = `$radosgw_admin quota set --bucket=$bucketname --max-objects=1`; 
157     if ($set_quota !~ /./){ 
158       print "quota set for the bucket: $bucketname \n"; 
159     } else {
160       print "quota set failed for the bucket: $bucketname \n"; 
161      exit 1;
162     }
163     return 0;
164 }
165
166 sub quota_enable {
167     my $en_quota = `$radosgw_admin quota enable --bucket=$bucketname`; 
168     if ($en_quota !~ /./){ 
169       print "quota enabled for the bucket: $bucketname \n"; 
170     } else {
171       print "quota enable failed for the bucket: $bucketname \n"; 
172       exit 1;
173     }
174     return 0;
175 }
176
177 sub quota_disable {
178     my $dis_quota = `$radosgw_admin quota disable --bucket=$bucketname`; 
179     if ($dis_quota !~ /./){ 
180       print "quota disabled for the bucket: $bucketname \n"; 
181     } else {
182       print "quota disable failed for the bucket: $bucketname \n"; 
183       exit 1;
184     }
185     return 0;
186 }
187
188 # upload a file to the bucket
189 sub upload_file {
190     print "adding file to bucket: $mytestfilename\n";
191     ($bucket->add_key_filename( $mytestfilename, $testfileloc,
192         { content_type => 'text/plain', },
193     ) and (print "upload file successful\n" ) and return 0 ) or (return 1);
194 }
195
196 # delete the bucket
197 sub delete_bucket {
198    #($bucket->delete_key($mytestfilename1) and print "delete keys on bucket succeeded second time\n" ) or die $s3->err . "delete keys on bucket failed second time\n" . $s3->errstr;
199    ($bucket->delete_bucket) and (print "bucket delete succeeded \n") or die $s3->err . "delete bucket failed\n" . $s3->errstr;
200 }
201
202 # set bucket quota with max_objects and verify 
203 sub test_max_objects {
204     my $size = '10Mb';
205     create_file($size);
206     run_s3($rgw_user);
207     quota_set_max_obj();
208     quota_enable();
209     my $ret_value = upload_file();
210     if ($ret_value == 0){
211         pass ( "Test max objects passed" );
212     } else {
213         fail ( "Test max objects failed" );
214     }
215     delete_user();
216     delete_keys($mytestfilename);
217     delete_bucket();
218 }
219
220 # Set bucket quota for specific user and ensure max objects set for the user is validated
221 sub test_max_objects_per_user{
222     my $size = '10Mb';
223     create_file($size);
224     run_s3($rgw_user);
225     quota_set_user_objs();
226     quota_enable();
227     my $ret_value = upload_file();
228     if ($ret_value == 0){
229         pass ( "Test max objects for the given user passed" );
230     } else {
231         fail ( "Test max objects for the given user failed" );
232     }
233     delete_user();
234     delete_keys($mytestfilename);
235     delete_bucket();
236 }
237
238 # set bucket quota with max_objects and try to exceed the max_objects and verify 
239 sub test_beyond_max_objs {
240     my $size = "10Mb";
241     create_file($size);
242     run_s3($rgw_user);
243     quota_set_max_obj();
244     quota_enable();
245     upload_file();
246     my $ret_value = readd_file();
247     if ($ret_value == 1){
248         pass ( "set max objects and test beyond max objects passed" );
249     } else {
250         fail ( "set max objects and test beyond max objects failed" );
251     }
252     delete_user();
253     delete_keys($mytestfilename);
254     delete_bucket();
255 }
256
257 # set bucket quota for a user with max_objects and try to exceed the max_objects and verify 
258 sub test_beyond_max_objs_user {
259     my $size = "10Mb";
260     create_file($size);
261     run_s3($rgw_user);
262     quota_set_user_objs();
263     quota_enable();
264     upload_file();
265     my $ret_value = readd_file();
266     if ($ret_value == 1){
267         pass ( "set max objects for a given user and test beyond max objects passed" );
268     } else {
269         fail ( "set max objects for a given user and test beyond max objects failed" );
270     }
271     delete_user();
272     delete_keys($mytestfilename);
273     delete_bucket();
274 }
275
276 # set bucket quota for max size and ensure it is validated
277 sub test_quota_size {
278     my $ret_value;
279     my $size = "2Gb";
280     create_file($size);
281     run_s3($rgw_user);
282     quota_set_max_size();    
283     quota_enable();
284     my $ret_value = upload_file();
285     if ($ret_value == 1) {
286         pass ( "set max size and ensure that objects upload beyond max size is not entertained" );
287         my $retdel = delete_keys($mytestfilename);
288         if ($retdel == 0) {
289             print "delete objects successful \n";
290             my $size1 = "1Gb";
291             create_file($size1);
292             my $ret_val1 = upload_file(); 
293             if ($ret_val1 == 0) {
294                 pass ( "set max size and ensure that the max size is in effect" );
295             } else {
296                 fail ( "set max size and ensure the max size takes effect" );
297             }
298         }
299     } else {
300         fail ( "set max size and ensure that objects beyond max size is not allowed" );
301     }
302     delete_user();
303     delete_keys($mytestfilename);
304     delete_bucket();
305 }
306
307 # set bucket quota for max size for a given user and ensure it is validated
308 sub test_quota_size_user {
309     my $ret_value;
310     my $size = "2Gb";
311     create_file($size);
312     run_s3($rgw_user);
313     quota_set_user_size();
314     quota_enable();
315     my $ret_value = upload_file();
316     if ($ret_value == 1) {
317         pass ( "set max size for a given user and ensure that objects upload beyond max size is not entertained" );
318         my $retdel = delete_keys($mytestfilename);
319         if ($retdel == 0) {
320             print "delete objects successful \n";
321             my $size1 = "1Gb";
322             create_file($size1);
323             my $ret_val1 = upload_file();
324             if ($ret_val1 == 0) {
325                 pass ( "set max size for a given user and ensure that the max size is in effect" );
326             } else {
327                 fail ( "set max size for a given user and ensure the max size takes effect" );
328             }
329         }
330     } else {
331         fail ( "set max size for a given user and ensure that objects beyond max size is not allowed" );
332     }
333     delete_user();
334     delete_keys($mytestfilename);
335     delete_bucket();
336 }
337
338 # set bucket quota size but disable quota and verify
339 sub test_quota_size_disabled {
340     my $ret_value;
341     my $size = "2Gb";
342     create_file($size);
343     run_s3($rgw_user);
344     quota_set_max_size();
345     quota_disable();
346     my $ret_value = upload_file();
347     if ($ret_value == 0) {
348         pass ( "bucket quota size doesnt take effect when quota is disabled" );
349     } else {
350         fail ( "bucket quota size doesnt take effect when quota is disabled" );
351     }
352     delete_user();
353     delete_keys($mytestfilename);
354     delete_bucket();
355 }
356
357 # set bucket quota size for a given user but disable quota and verify
358 sub test_quota_size_disabled_user {
359     my $ret_value;
360     my $size = "2Gb";
361     create_file($size);
362     run_s3($rgw_user);
363     quota_set_user_size();
364     quota_disable();
365     my $ret_value = upload_file();
366     if ($ret_value == 0) {
367         pass ( "bucket quota size for a given user doesnt take effect when quota is disabled" );
368     } else {
369         fail ( "bucket quota size for a given user doesnt take effect when quota is disabled" );
370     }
371     delete_user();
372     delete_keys($mytestfilename);
373     delete_bucket();
374 }
375
376 # set bucket quota for specified user and verify
377
378 #== Main starts here===
379 ceph_os_info();
380 test_max_objects();
381 test_max_objects_per_user();
382 test_beyond_max_objs();
383 test_beyond_max_objs_user();
384 quota_set_max_size_zero();
385 quota_set_max_objs_zero();
386 quota_set_neg_objs();
387 quota_set_neg_size();
388 test_quota_size(); 
389 test_quota_size_user();
390 test_quota_size_disabled();
391 test_quota_size_disabled_user();
392
393 print "OK";