]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rgw/s3_bucket_quota.pl
add subtree-ish sources for 12.0.3
[ceph.git] / 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";