5 # if defined, debug messages will be displayed and prepended with the string
8 huge_size
=2222 # in megabytes
9 big_size
=6 # in megabytes
11 huge_obj
=/tmp
/huge_obj.temp.$$
12 big_obj
=/tmp
/big_obj.temp.$$
13 empty_obj
=/tmp
/empty_obj.temp.$$
15 fifo
=/tmp
/orphan-fifo.$$
16 awscli_dir
=${HOME}/awscli_temp
17 export PATH
=${PATH}:${awscli_dir}
19 rgw_host
=$
(hostname
--fqdn)
20 if echo "$rgw_host" |
grep -q '\.' ; then
23 host_domain
=".front.sepia.ceph.com"
24 echo "WARNING: rgw hostname -- $rgw_host -- does not appear to be fully qualified; PUNTING and appending $host_domain"
25 rgw_host
="${rgw_host}${host_domain}"
29 echo "Fully Qualified Domain Name: $rgw_host"
36 ########################################################################
37 # INSTALL AND CONFIGURE TOOLING
40 # NB: this does verify authenticity and integrity of downloaded
42 # https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html
45 curl
"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
48 .
/aws
/install -i $awscli_dir
55 rm -rf $awscli_dir .
/aws awscliv2.
zip
59 sudo dnf
install -y s3cmd
61 sudo yum
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"
173 s3cmd
--config=${s3config} put
$local_file \
174 s3
://${remote_bkt}/${remote_obj} \
176 --multipart-chunk-size-mb=5 >$fifo &
177 set +e
# don't allow errors to stop script
179 echo "$line" |
grep --quiet "part $stop_part "
180 if [ ${PIPESTATUS[1]} -eq 0 ] ;then
195 mys3cmd put
-q $obj s3
://${bucket}/$dest_obj
198 ########################################################################
202 dd if=/dev
/urandom of
=$big_obj bs
=1M count
=${big_size}
203 dd if=/dev
/urandom of
=$huge_obj bs
=1M count
=${huge_size}
207 echo TRY A SWIFT COMMAND
208 myswift upload swift-plain-ctr
$big_obj --object-name swift-obj-test
210 myswift list swift-plain-ctr
212 echo TRY A RADOSGW-ADMIN COMMAND
213 radosgw-admin bucket list
# make sure rgw is up and running
216 ########################################################################
219 ####################################
220 # regular multipart test
222 mys3cmd mb s3
://multipart-bkt
223 mys3upload
$huge_obj multipart-bkt multipart-obj
225 mys3cmd
ls s3
://multipart-bkt
227 ####################################
228 # multipart test with incomplete uploads
230 bkt
="incomplete-mp-bkt-1"
233 mys3uploadkill
$huge_obj $bkt incomplete-mp-obj-1
$fifo 20
234 mys3uploadkill
$huge_obj $bkt incomplete-mp-obj-2
$fifo 100
236 ####################################
243 for f
in $
(seq 8) ; do
244 dest_obj
="reshard-obj-${f}"
245 mys3cmd put
-q $big_obj s3
://${bkt}/$dest_obj
248 radosgw-admin bucket reshard
--num-shards 3 --bucket=$bkt --yes-i-really-mean-it
249 radosgw-admin bucket reshard
--num-shards 5 --bucket=$bkt --yes-i-really-mean-it
251 ####################################
255 echo "WARNING: versioned bucket test currently turned off"
261 # bucket-enable-versioning $bkt
263 for f
in $
(seq 3) ;do
264 for g
in $
(seq 10) ;do
265 dest_obj
="versioned-obj-${g}"
266 mys3cmd put
-q $big_obj s3
://${bkt}/$dest_obj
270 for g
in $
(seq 1 2 10) ;do
271 dest_obj
="versioned-obj-${g}"
272 mys3cmd
rm s3
://${bkt}/$dest_obj
276 ############################################################
281 mys3cmd mb s3
://$o_bkt
283 for f
in $
(seq 4) ;do
284 dest_obj
="orig-obj-$f"
285 mys3cmd put
-q $big_obj s3
://${o_bkt}/$dest_obj
288 mys3cmd mb s3
://$d_bkt
290 mys3cmd
cp s3
://${o_bkt}/orig-obj-1 s3
://${d_bkt}/copied-obj-1
291 mys3cmd
cp s3
://${o_bkt}/orig-obj-3 s3
://${d_bkt}/copied-obj-3
293 for f
in $
(seq 5 6) ;do
294 dest_obj
="orig-obj-$f"
295 mys3cmd put
-q $big_obj s3
://${d_bkt}/$dest_obj
298 ############################################################
299 # copy small objects and delete original
304 mys3cmd mb s3
://$o_bkt
306 for f
in $
(seq 4) ;do
307 dest_obj
="orig-obj-$f"
308 mys3cmd put
-q $big_obj s3
://${o_bkt}/$dest_obj
311 mys3cmd mb s3
://$d_bkt
313 mys3cmd
cp s3
://${o_bkt}/orig-obj-1 s3
://${d_bkt}/copied-obj-1
314 mys3cmd
cp s3
://${o_bkt}/orig-obj-3 s3
://${d_bkt}/copied-obj-3
316 for f
in $
(seq 5 6) ;do
317 dest_obj
="orig-obj-$f"
318 mys3cmd put
-q $big_obj s3
://${d_bkt}/$dest_obj
321 mys3cmd rb
--recursive s3
://${o_bkt}
323 ############################################################
324 # copy multipart objects
326 o_bkt
="orig-mp-bkt-3"
327 d_bkt
="copy-mp-bkt-3"
329 mys3cmd mb s3
://$o_bkt
331 for f
in $
(seq 2) ;do
332 dest_obj
="orig-multipart-obj-$f"
333 mys3cmd put
-q $huge_obj s3
://${o_bkt}/$dest_obj
336 mys3cmd mb s3
://$d_bkt
338 mys3cmd
cp s3
://${o_bkt}/orig-multipart-obj-1 \
339 s3
://${d_bkt}/copied-multipart-obj-1
341 for f
in $
(seq 5 5) ;do
342 dest_obj
="orig-multipart-obj-$f"
343 mys3cmd put
-q $huge_obj s3
://${d_bkt}/$dest_obj
347 ############################################################
348 # copy multipart objects and delete original
350 o_bkt
="orig-mp-bkt-4"
351 d_bkt
="copy-mp-bkt-4"
353 mys3cmd mb s3
://$o_bkt
355 for f
in $
(seq 2) ;do
356 dest_obj
="orig-multipart-obj-$f"
357 mys3cmd put
-q $huge_obj s3
://${o_bkt}/$dest_obj
360 mys3cmd mb s3
://$d_bkt
362 mys3cmd
cp s3
://${o_bkt}/orig-multipart-obj-1 \
363 s3
://${d_bkt}/copied-multipart-obj-1
365 for f
in $
(seq 5 5) ;do
366 dest_obj
="orig-multipart-obj-$f"
367 mys3cmd put
-q $huge_obj s3
://${d_bkt}/$dest_obj
370 mys3cmd rb
--recursive s3
://$o_bkt
372 ########################################################################
376 segment_size
=629145600
378 ############################################################
381 for f
in $
(seq 4) ;do
382 myswift upload swift-plain-ctr
$big_obj --object-name swift-obj-
$f
385 ############################################################
388 myswift upload swift-zerolen-ctr
$empty_obj --object-name subdir
/
389 myswift upload swift-zerolen-ctr
$big_obj --object-name subdir
/abc1
390 myswift upload swift-zerolen-ctr
$empty_obj --object-name subdir
/empty1
391 myswift upload swift-zerolen-ctr
$big_obj --object-name subdir
/xyz1
393 ############################################################
396 # upload in 300MB segments
397 myswift upload swift-dlo-ctr
$huge_obj --object-name dlo-obj-1 \
400 ############################################################
403 # upload in 300MB segments
404 myswift upload swift-slo-ctr
$huge_obj --object-name slo-obj-1 \
405 -S $segment_size --use-slo
407 ############################################################
408 # large object copy test
410 # upload in 300MB segments
415 myswift upload
$o_ctr $big_obj --object-name $o_obj
417 myswift copy
--destination /${d_ctr}/${d_obj} \
420 myswift delete
$o_ctr $o_obj
422 ############################################################
423 # huge dlo object copy test
425 o_ctr
=swift-orig-dlo-ctr-1
426 o_obj
=dlo-orig-dlo-obj-1
427 d_ctr
=swift-copy-dlo-ctr-1
428 d_obj
=dlo-copy-dlo-obj-1
430 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
433 myswift copy
--destination /${d_ctr}/${d_obj} \
436 ############################################################
437 # huge dlo object copy and orig delete
439 o_ctr
=swift-orig-dlo-ctr-2
440 o_obj
=dlo-orig-dlo-obj-2
441 d_ctr
=swift-copy-dlo-ctr-2
442 d_obj
=dlo-copy-dlo-obj-2
444 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
447 myswift copy
--destination /${d_ctr}/${d_obj} \
450 myswift delete
$o_ctr $o_obj
452 ############################################################
453 # huge slo object copy test
455 o_ctr
=swift-orig-slo-ctr-1
456 o_obj
=slo-orig-slo-obj-1
457 d_ctr
=swift-copy-slo-ctr-1
458 d_obj
=slo-copy-slo-obj-1
459 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
460 -S $segment_size --use-slo
462 myswift copy
--destination /${d_ctr}/${d_obj} $o_ctr $o_obj
464 ############################################################
465 # huge slo object copy test and orig delete
467 o_ctr
=swift-orig-slo-ctr-2
468 o_obj
=slo-orig-slo-obj-2
469 d_ctr
=swift-copy-slo-ctr-2
470 d_obj
=slo-copy-slo-obj-2
471 myswift upload
$o_ctr $huge_obj --object-name $o_obj \
472 -S $segment_size --use-slo
474 myswift copy
--destination /${d_ctr}/${d_obj} $o_ctr $o_obj
476 myswift delete
$o_ctr $o_obj
478 ########################################################################
479 # FORCE GARBAGE COLLECTION
481 sleep 6 # since for testing age at which gc can happen is 5 secs
482 radosgw-admin gc process
--include-all
485 ########################################
488 pool
="default.rgw.buckets.data"
490 rgw-orphan-list
$pool
492 # we only expect there to be one output file, but loop just in case
494 for f
in orphan-list-
*.out
; do
495 if [ -s "$f" ] ;then # if file non-empty
496 ol_error
="${ol_error}:$f"
497 echo "One ore more orphans found in $f:"
502 if [ -n "$ol_error" ] ;then
503 echo "ERROR: orphans found when none expected"
507 ########################################################################
510 rm -f $empty_obj $big_obj $huge_obj $s3config