6 # if defined, debug messages will be displayed and prepended with the string
9 huge_size
=5100 # in megabytes
10 big_size
=7 # in megabytes
12 huge_obj
=/tmp
/huge_obj.temp.$$
13 big_obj
=/tmp
/big_obj.temp.$$
14 empty_obj
=/tmp
/empty_obj.temp.$$
16 fifo
=/tmp
/orphan-fifo.$$
17 awscli_dir
=${HOME}/awscli_temp
18 export PATH
=${PATH}:${awscli_dir}
20 rgw_host
=$
(hostname
--fqdn)
21 if echo "$rgw_host" |
grep -q '\.' ; then
24 host_domain
=".front.sepia.ceph.com"
25 echo "WARNING: rgw hostname -- $rgw_host -- does not appear to be fully qualified; PUNTING and appending $host_domain"
26 rgw_host
="${rgw_host}${host_domain}"
30 echo "Fully Qualified Domain Name: $rgw_host"
37 ########################################################################
38 # INSTALL AND CONFIGURE TOOLING
41 # NB: this does verify authenticity and integrity of downloaded
43 # https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html
46 curl
"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
49 .
/aws
/install -i $awscli_dir
56 rm -rf $awscli_dir .
/aws awscliv2.
zip
60 sudo yum
-y install s3cmd
61 sudo yum
-y install python3-setuptools
62 sudo yum
-y install python3-pip
63 sudo pip3
install --upgrade setuptools
64 sudo pip3
install python-swiftclient
66 # get ready for transition from s3cmd to awscli
73 s3config
=/tmp
/s3config.$$
75 # do not include the port when it is 80; the host base is used in the
76 # v4 signature and it needs to follow this convention for signatures
78 if [ "$rgw_port" -ne 80 ] ;then
79 s3_host_base
="${rgw_host}:${rgw_port}"
81 s3_host_base
="$rgw_host"
84 cat >${s3config} <<EOF
86 host_base = $s3_host_base
87 access_key = 0555b35654ad1656d804
88 secret_key = h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==
89 bucket_location = us-east-1
90 check_ssl_certificate = True
91 check_ssl_hostname = True
92 default_mime_type = binary/octet-stream
93 delete_removed = False
95 enable_multipart = True
98 follow_symlinks = False
100 guess_mime_type = True
101 host_bucket = anything.with.three.dots
102 multipart_chunk_size_mb = 15
103 multipart_max_chunks = 10000
110 use_mime_magic = True
115 # set up swift authentication
116 export ST_AUTH
=http
://${rgw_host}:${rgw_port}/auth
/v1.0
117 export ST_USER
=test:tester
118 export ST_KEY
=testing
122 local akey
='0555b35654ad1656d804'
123 local skey
='h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=='
124 radosgw-admin user create
--uid testid \
125 --access-key $akey --secret $skey \
126 --display-name 'M. Tester' --email tester@ceph.com
129 radosgw-admin user create
--subuser=test:tester \
130 --display-name=Tester-Subuser
--key-type=swift \
131 --secret=testing
--access=full
135 if [ -n "$debug" ] ;then
136 echo "${debug}: swift --verbose --debug $@"
138 swift
--verbose --debug "$@"
140 if [ $code -ne 0 ] ;then
141 echo "ERROR: code = $code ; command = s3cmd --config=${s3config} --verbose --debug "$@
""
147 if [ -n "$debug" ] ;then
148 echo "${debug}: s3cmd --config=${s3config} --verbose --debug $@"
150 s3cmd
--config=${s3config} --verbose --debug "$@"
152 if [ $code -ne 0 ] ;then
153 echo "ERROR: code = $code ; command = s3cmd --config=${s3config} --verbose --debug "$@
""
159 if [ $# -ne 5 ] ;then
160 echo "$0: error expecting 5 arguments"
172 s3cmd
--config=${s3config} put
$local_file \
173 s3
://${remote_bkt}/${remote_obj} \
175 --multipart-chunk-size-mb=5 >$fifo &
176 set +e
# don't allow errors to stop script
178 echo "$line" |
grep --quiet "part $stop_part "
179 if [ ${PIPESTATUS[1]} -eq 0 ] ;then
194 mys3cmd put
-q $obj s3
://${bucket}/$dest_obj
197 ########################################################################
201 dd if=/dev
/urandom of
=$big_obj bs
=1M count
=${big_size}
202 dd if=/dev
/urandom of
=$huge_obj bs
=1M count
=${huge_size}
206 echo TRY A SWIFT COMMAND
207 myswift upload swift-plain-ctr
$big_obj --object-name swift-obj-test
209 myswift list swift-plain-ctr
211 echo TRY A RADOSGW-ADMIN COMMAND
212 radosgw-admin bucket list
# make sure rgw is up and running
215 ########################################################################
218 ####################################
219 # regular multipart test
221 mys3cmd mb s3
://multipart-bkt
222 mys3upload
$huge_obj multipart-bkt multipart-obj
224 mys3cmd
ls s3
://multipart-bkt
226 ####################################
227 # multipart test with incomplete uploads
229 bkt
="incomplete-mp-bkt-1"
233 mys3uploadkill
$huge_obj $bkt incomplete-mp-obj-c
$fifo 20
235 # generate an incomplete multipart with more than 1,000 parts
236 mys3uploadkill
$huge_obj $bkt incomplete-mp-obj-b
$fifo 1005
238 # generate more than 1000 incomplet multiparts
239 for c
in $
(seq 1005) ;do
240 mys3uploadkill
$huge_obj $bkt incomplete-mp-obj-c-
$c $fifo 3
243 ####################################
250 for f
in $
(seq 8) ; do
251 dest_obj
="reshard-obj-${f}"
252 mys3cmd put
-q $big_obj s3
://${bkt}/$dest_obj
255 radosgw-admin bucket reshard
--num-shards 3 --bucket=$bkt --yes-i-really-mean-it
256 radosgw-admin bucket reshard
--num-shards 5 --bucket=$bkt --yes-i-really-mean-it
258 ####################################
262 echo "WARNING: versioned bucket test currently turned off"
268 # bucket-enable-versioning $bkt
270 for f
in $
(seq 3) ;do
271 for g
in $
(seq 10) ;do
272 dest_obj
="versioned-obj-${g}"
273 mys3cmd put
-q $big_obj s3
://${bkt}/$dest_obj
277 for g
in $
(seq 1 2 10) ;do
278 dest_obj
="versioned-obj-${g}"
279 mys3cmd
rm s3
://${bkt}/$dest_obj
283 ############################################################
288 mys3cmd mb s3
://$o_bkt
290 for f
in $
(seq 4) ;do
291 dest_obj
="orig-obj-$f"
292 mys3cmd put
-q $big_obj s3
://${o_bkt}/$dest_obj
295 mys3cmd mb s3
://$d_bkt
297 mys3cmd
cp s3
://${o_bkt}/orig-obj-1 s3
://${d_bkt}/copied-obj-1
298 mys3cmd
cp s3
://${o_bkt}/orig-obj-3 s3
://${d_bkt}/copied-obj-3
300 for f
in $
(seq 5 6) ;do
301 dest_obj
="orig-obj-$f"
302 mys3cmd put
-q $big_obj s3
://${d_bkt}/$dest_obj
305 ############################################################
306 # copy small objects and delete original
311 mys3cmd mb s3
://$o_bkt
313 for f
in $
(seq 4) ;do
314 dest_obj
="orig-obj-$f"
315 mys3cmd put
-q $big_obj s3
://${o_bkt}/$dest_obj
318 mys3cmd mb s3
://$d_bkt
320 mys3cmd
cp s3
://${o_bkt}/orig-obj-1 s3
://${d_bkt}/copied-obj-1
321 mys3cmd
cp s3
://${o_bkt}/orig-obj-3 s3
://${d_bkt}/copied-obj-3
323 for f
in $
(seq 5 6) ;do
324 dest_obj
="orig-obj-$f"
325 mys3cmd put
-q $big_obj s3
://${d_bkt}/$dest_obj
328 mys3cmd rb
--recursive s3
://${o_bkt}
330 ############################################################
331 # copy multipart objects
333 o_bkt
="orig-mp-bkt-3"
334 d_bkt
="copy-mp-bkt-3"
336 mys3cmd mb s3
://$o_bkt
338 for f
in $
(seq 2) ;do
339 dest_obj
="orig-multipart-obj-$f"
340 mys3cmd put
-q $huge_obj s3
://${o_bkt}/$dest_obj
343 mys3cmd mb s3
://$d_bkt
345 mys3cmd
cp s3
://${o_bkt}/orig-multipart-obj-1 \
346 s3
://${d_bkt}/copied-multipart-obj-1
348 for f
in $
(seq 5 5) ;do
349 dest_obj
="orig-multipart-obj-$f"
350 mys3cmd put
-q $huge_obj s3
://${d_bkt}/$dest_obj
354 ############################################################
355 # copy multipart objects and delete original
357 o_bkt
="orig-mp-bkt-4"
358 d_bkt
="copy-mp-bkt-4"
360 mys3cmd mb s3
://$o_bkt
362 for f
in $
(seq 2) ;do
363 dest_obj
="orig-multipart-obj-$f"
364 mys3cmd put
-q $huge_obj s3
://${o_bkt}/$dest_obj
367 mys3cmd mb s3
://$d_bkt
369 mys3cmd
cp s3
://${o_bkt}/orig-multipart-obj-1 \
370 s3
://${d_bkt}/copied-multipart-obj-1
372 for f
in $
(seq 5 5) ;do
373 dest_obj
="orig-multipart-obj-$f"
374 mys3cmd put
-q $huge_obj s3
://${d_bkt}/$dest_obj
377 mys3cmd rb
--recursive s3
://$o_bkt
379 ########################################################################
383 segment_size
=629145600
385 ############################################################
388 for f
in $
(seq 4) ;do
389 myswift upload swift-plain-ctr
$big_obj --object-name swift-obj-
$f
392 ############################################################
395 myswift upload swift-zerolen-ctr
$empty_obj --object-name subdir
/
396 myswift upload swift-zerolen-ctr
$big_obj --object-name subdir
/abc1
397 myswift upload swift-zerolen-ctr
$empty_obj --object-name subdir
/empty1
398 myswift upload swift-zerolen-ctr
$big_obj --object-name subdir
/xyz1
400 ############################################################
403 # upload in 300MB segments
404 myswift upload swift-dlo-ctr
$huge_obj --object-name dlo-obj-1 \
407 ############################################################
410 # upload in 300MB segments
411 myswift upload swift-slo-ctr
$huge_obj --object-name slo-obj-1 \
412 -S $segment_size --use-slo
414 ############################################################
415 # large object copy test
417 # upload in 300MB segments
422 myswift upload
$o_ctr $big_obj --object-name $o_obj
424 myswift copy
--destination /${d_ctr}/${d_obj} \
427 myswift delete
$o_ctr $o_obj
429 ############################################################
430 # huge dlo object copy test
432 o_ctr
=swift-orig-dlo-ctr-1
433 o_obj
=dlo-orig-dlo-obj-1
434 d_ctr
=swift-copy-dlo-ctr-1
435 d_obj
=dlo-copy-dlo-obj-1
437 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
440 myswift copy
--destination /${d_ctr}/${d_obj} \
443 ############################################################
444 # huge dlo object copy and orig delete
446 o_ctr
=swift-orig-dlo-ctr-2
447 o_obj
=dlo-orig-dlo-obj-2
448 d_ctr
=swift-copy-dlo-ctr-2
449 d_obj
=dlo-copy-dlo-obj-2
451 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
454 myswift copy
--destination /${d_ctr}/${d_obj} \
457 myswift delete
$o_ctr $o_obj
459 ############################################################
460 # huge slo object copy test
462 o_ctr
=swift-orig-slo-ctr-1
463 o_obj
=slo-orig-slo-obj-1
464 d_ctr
=swift-copy-slo-ctr-1
465 d_obj
=slo-copy-slo-obj-1
466 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
467 -S $segment_size --use-slo
469 myswift copy
--destination /${d_ctr}/${d_obj} $o_ctr $o_obj
471 ############################################################
472 # huge slo object copy test and orig delete
474 o_ctr
=swift-orig-slo-ctr-2
475 o_obj
=slo-orig-slo-obj-2
476 d_ctr
=swift-copy-slo-ctr-2
477 d_obj
=slo-copy-slo-obj-2
478 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
479 -S $segment_size --use-slo
481 myswift copy
--destination /${d_ctr}/${d_obj} $o_ctr $o_obj
483 myswift delete
$o_ctr $o_obj
485 ########################################################################
486 # FORCE GARBAGE COLLECTION
488 sleep 6 # since for testing age at which gc can happen is 5 secs
489 radosgw-admin gc process
--include-all
492 ########################################
495 pool
="default.rgw.buckets.data"
497 rgw-orphan-list
$pool
499 # we only expect there to be one output file, but loop just in case
501 for f
in orphan-list-
*.out
; do
502 if [ -s "$f" ] ;then # if file non-empty
503 ol_error
="${ol_error}:$f"
504 echo "One ore more orphans found in $f:"
509 if [ -n "$ol_error" ] ;then
510 echo "ERROR: orphans found when none expected"
514 ########################################################################
517 rm -f $empty_obj $big_obj $huge_obj $s3config