]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rgw/test_rgw_orphan_list.sh
import ceph pacific 16.2.5
[ceph.git] / ceph / qa / workunits / rgw / test_rgw_orphan_list.sh
CommitLineData
e306af50
TL
1#!/usr/bin/env bash
2
b3b6e05e
TL
3# set -x
4set -e
e306af50
TL
5
6# if defined, debug messages will be displayed and prepended with the string
7# debug="DEBUG"
8
b3b6e05e
TL
9huge_size=5100 # in megabytes
10big_size=7 # in megabytes
e306af50
TL
11
12huge_obj=/tmp/huge_obj.temp.$$
13big_obj=/tmp/big_obj.temp.$$
14empty_obj=/tmp/empty_obj.temp.$$
15
16fifo=/tmp/orphan-fifo.$$
17awscli_dir=${HOME}/awscli_temp
18export PATH=${PATH}:${awscli_dir}
19
20rgw_host=$(hostname --fqdn)
f6b5b4d7
TL
21if echo "$rgw_host" | grep -q '\.' ; then
22 :
23else
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}"
27fi
e306af50
TL
28rgw_port=80
29
30echo "Fully Qualified Domain Name: $rgw_host"
31
32success() {
33 echo OK.
34 exit 0
35}
36
37########################################################################
38# INSTALL AND CONFIGURE TOOLING
39
40install_awscli() {
41 # NB: this does verify authenticity and integrity of downloaded
42 # file; see
43 # https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html
44 here="$(pwd)"
45 cd "$HOME"
46 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
47 unzip awscliv2.zip
48 mkdir -p $awscli_dir
49 ./aws/install -i $awscli_dir
50 cd "$here"
51}
52
53uninstall_awscli() {
54 here="$(pwd)"
55 cd "$HOME"
56 rm -rf $awscli_dir ./aws awscliv2.zip
57 cd "$here"
58}
59
f91f0fd5
TL
60sudo yum -y install s3cmd
61sudo yum -y install python3-setuptools
e306af50
TL
62sudo yum -y install python3-pip
63sudo pip3 install --upgrade setuptools
64sudo pip3 install python-swiftclient
65
66# get ready for transition from s3cmd to awscli
67if false ;then
68 install_awscli
69 aws --version
70 uninstall_awscli
71fi
72
73s3config=/tmp/s3config.$$
74
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
77# to match
78if [ "$rgw_port" -ne 80 ] ;then
79 s3_host_base="${rgw_host}:${rgw_port}"
80else
81 s3_host_base="$rgw_host"
82fi
83
84cat >${s3config} <<EOF
85[default]
86host_base = $s3_host_base
87access_key = 0555b35654ad1656d804
88secret_key = h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==
89bucket_location = us-east-1
90check_ssl_certificate = True
91check_ssl_hostname = True
92default_mime_type = binary/octet-stream
93delete_removed = False
94dry_run = False
95enable_multipart = True
96encoding = UTF-8
97encrypt = False
98follow_symlinks = False
99force = False
100guess_mime_type = True
101host_bucket = anything.with.three.dots
102multipart_chunk_size_mb = 15
103multipart_max_chunks = 10000
104recursive = False
105recv_chunk = 65536
106send_chunk = 65536
107signature_v2 = False
108socket_timeout = 300
109use_https = False
110use_mime_magic = True
111verbosity = WARNING
112EOF
113
114
115# set up swift authentication
116export ST_AUTH=http://${rgw_host}:${rgw_port}/auth/v1.0
117export ST_USER=test:tester
118export ST_KEY=testing
119
120create_users() {
121 # Create S3 user
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
127
128 # Create Swift user
129 radosgw-admin user create --subuser=test:tester \
130 --display-name=Tester-Subuser --key-type=swift \
131 --secret=testing --access=full
132}
133
134myswift() {
135 if [ -n "$debug" ] ;then
136 echo "${debug}: swift --verbose --debug $@"
137 fi
138 swift --verbose --debug "$@"
139 local code=$?
140 if [ $code -ne 0 ] ;then
141 echo "ERROR: code = $code ; command = s3cmd --config=${s3config} --verbose --debug "$@""
142 exit $code
143 fi
144}
145
146mys3cmd() {
147 if [ -n "$debug" ] ;then
148 echo "${debug}: s3cmd --config=${s3config} --verbose --debug $@"
149 fi
150 s3cmd --config=${s3config} --verbose --debug "$@"
151 local code=$?
152 if [ $code -ne 0 ] ;then
153 echo "ERROR: code = $code ; command = s3cmd --config=${s3config} --verbose --debug "$@""
154 exit $code
155 fi
156}
157
158mys3uploadkill() {
159 if [ $# -ne 5 ] ;then
160 echo "$0: error expecting 5 arguments"
161 exit 1
162 fi
163
e306af50
TL
164 local_file="$1"
165 remote_bkt="$2"
166 remote_obj="$3"
167 fifo="$4"
168 stop_part="$5"
169
170 mkfifo $fifo
171
172 s3cmd --config=${s3config} put $local_file \
173 s3://${remote_bkt}/${remote_obj} \
174 --progress \
175 --multipart-chunk-size-mb=5 >$fifo &
176 set +e # don't allow errors to stop script
177 while read line ;do
178 echo "$line" | grep --quiet "part $stop_part "
179 if [ ${PIPESTATUS[1]} -eq 0 ] ;then
180 kill -9 $(jobs -p)
181 break
182 fi
183 done <$fifo
184 set -e
185
186 rm -f $fifo
187}
188
189mys3upload() {
190 obj=$1
191 bucket=$2
192 dest_obj=$3
193
194 mys3cmd put -q $obj s3://${bucket}/$dest_obj
195}
196
197########################################################################
198# PREP
199
200create_users
201dd if=/dev/urandom of=$big_obj bs=1M count=${big_size}
202dd if=/dev/urandom of=$huge_obj bs=1M count=${huge_size}
203touch $empty_obj
204
205quick_tests() {
206 echo TRY A SWIFT COMMAND
207 myswift upload swift-plain-ctr $big_obj --object-name swift-obj-test
208 myswift list
209 myswift list swift-plain-ctr
210
211 echo TRY A RADOSGW-ADMIN COMMAND
212 radosgw-admin bucket list # make sure rgw is up and running
213}
214
215########################################################################
216# S3 TESTS
217
218####################################
219# regular multipart test
220
221mys3cmd mb s3://multipart-bkt
222mys3upload $huge_obj multipart-bkt multipart-obj
223mys3cmd ls
224mys3cmd ls s3://multipart-bkt
225
226####################################
227# multipart test with incomplete uploads
228
229bkt="incomplete-mp-bkt-1"
230
231mys3cmd mb s3://$bkt
b3b6e05e
TL
232
233mys3uploadkill $huge_obj $bkt incomplete-mp-obj-c $fifo 20
234
235# generate an incomplete multipart with more than 1,000 parts
236mys3uploadkill $huge_obj $bkt incomplete-mp-obj-b $fifo 1005
237
238# generate more than 1000 incomplet multiparts
239for c in $(seq 1005) ;do
240 mys3uploadkill $huge_obj $bkt incomplete-mp-obj-c-$c $fifo 3
241done
e306af50
TL
242
243####################################
244# resharded bucket
245
246bkt=resharded-bkt-1
247
248mys3cmd mb s3://$bkt
249
250for f in $(seq 8) ; do
251 dest_obj="reshard-obj-${f}"
252 mys3cmd put -q $big_obj s3://${bkt}/$dest_obj
253done
254
255radosgw-admin bucket reshard --num-shards 3 --bucket=$bkt --yes-i-really-mean-it
256radosgw-admin bucket reshard --num-shards 5 --bucket=$bkt --yes-i-really-mean-it
257
258####################################
259# versioned bucket
260
261if true ;then
262 echo "WARNING: versioned bucket test currently turned off"
263else
264 bkt=versioned-bkt-1
265
266 mys3cmd mb s3://$bkt
267
268 # bucket-enable-versioning $bkt
269
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
274 done
275 done
276
277 for g in $(seq 1 2 10) ;do
278 dest_obj="versioned-obj-${g}"
279 mys3cmd rm s3://${bkt}/$dest_obj
280 done
281fi
282
283############################################################
284# copy small objects
285
286o_bkt="orig-bkt-1"
287d_bkt="copy-bkt-1"
288mys3cmd mb s3://$o_bkt
289
290for f in $(seq 4) ;do
291 dest_obj="orig-obj-$f"
292 mys3cmd put -q $big_obj s3://${o_bkt}/$dest_obj
293done
294
295mys3cmd mb s3://$d_bkt
296
297mys3cmd cp s3://${o_bkt}/orig-obj-1 s3://${d_bkt}/copied-obj-1
298mys3cmd cp s3://${o_bkt}/orig-obj-3 s3://${d_bkt}/copied-obj-3
299
300for f in $(seq 5 6) ;do
301 dest_obj="orig-obj-$f"
302 mys3cmd put -q $big_obj s3://${d_bkt}/$dest_obj
303done
304
305############################################################
306# copy small objects and delete original
307
308o_bkt="orig-bkt-2"
309d_bkt="copy-bkt-2"
310
311mys3cmd mb s3://$o_bkt
312
313for f in $(seq 4) ;do
314 dest_obj="orig-obj-$f"
315 mys3cmd put -q $big_obj s3://${o_bkt}/$dest_obj
316done
317
318mys3cmd mb s3://$d_bkt
319
320mys3cmd cp s3://${o_bkt}/orig-obj-1 s3://${d_bkt}/copied-obj-1
321mys3cmd cp s3://${o_bkt}/orig-obj-3 s3://${d_bkt}/copied-obj-3
322
323for f in $(seq 5 6) ;do
324 dest_obj="orig-obj-$f"
325 mys3cmd put -q $big_obj s3://${d_bkt}/$dest_obj
326done
327
328mys3cmd rb --recursive s3://${o_bkt}
329
330############################################################
331# copy multipart objects
332
333o_bkt="orig-mp-bkt-3"
334d_bkt="copy-mp-bkt-3"
335
336mys3cmd mb s3://$o_bkt
337
338for f in $(seq 2) ;do
339 dest_obj="orig-multipart-obj-$f"
340 mys3cmd put -q $huge_obj s3://${o_bkt}/$dest_obj
341done
342
343mys3cmd mb s3://$d_bkt
344
345mys3cmd cp s3://${o_bkt}/orig-multipart-obj-1 \
346 s3://${d_bkt}/copied-multipart-obj-1
347
348for f in $(seq 5 5) ;do
349 dest_obj="orig-multipart-obj-$f"
350 mys3cmd put -q $huge_obj s3://${d_bkt}/$dest_obj
351done
352
353
354############################################################
355# copy multipart objects and delete original
356
357o_bkt="orig-mp-bkt-4"
358d_bkt="copy-mp-bkt-4"
359
360mys3cmd mb s3://$o_bkt
361
362for f in $(seq 2) ;do
363 dest_obj="orig-multipart-obj-$f"
364 mys3cmd put -q $huge_obj s3://${o_bkt}/$dest_obj
365done
366
367mys3cmd mb s3://$d_bkt
368
369mys3cmd cp s3://${o_bkt}/orig-multipart-obj-1 \
370 s3://${d_bkt}/copied-multipart-obj-1
371
372for f in $(seq 5 5) ;do
373 dest_obj="orig-multipart-obj-$f"
374 mys3cmd put -q $huge_obj s3://${d_bkt}/$dest_obj
375done
376
377mys3cmd rb --recursive s3://$o_bkt
378
379########################################################################
380# SWIFT TESTS
381
382# 600MB
383segment_size=629145600
384
385############################################################
386# plain test
387
388for f in $(seq 4) ;do
389 myswift upload swift-plain-ctr $big_obj --object-name swift-obj-$f
390done
391
392############################################################
393# zero-len test
394
395myswift upload swift-zerolen-ctr $empty_obj --object-name subdir/
396myswift upload swift-zerolen-ctr $big_obj --object-name subdir/abc1
397myswift upload swift-zerolen-ctr $empty_obj --object-name subdir/empty1
398myswift upload swift-zerolen-ctr $big_obj --object-name subdir/xyz1
399
400############################################################
401# dlo test
402
403# upload in 300MB segments
404myswift upload swift-dlo-ctr $huge_obj --object-name dlo-obj-1 \
405 -S $segment_size
406
407############################################################
408# slo test
409
410# upload in 300MB segments
411myswift upload swift-slo-ctr $huge_obj --object-name slo-obj-1 \
412 -S $segment_size --use-slo
413
414############################################################
415# large object copy test
416
417# upload in 300MB segments
418o_ctr=swift-orig-ctr
419o_obj=slo-orig-obj-1
420d_ctr=swift-copy-ctr
421d_obj=slo-copy-obj-1
422myswift upload $o_ctr $big_obj --object-name $o_obj
423
424myswift copy --destination /${d_ctr}/${d_obj} \
425 $o_ctr $o_obj
426
427myswift delete $o_ctr $o_obj
428
429############################################################
430# huge dlo object copy test
431
432o_ctr=swift-orig-dlo-ctr-1
433o_obj=dlo-orig-dlo-obj-1
434d_ctr=swift-copy-dlo-ctr-1
435d_obj=dlo-copy-dlo-obj-1
436
437myswift upload $o_ctr $huge_obj --object-name $o_obj \
438 -S $segment_size
439
440myswift copy --destination /${d_ctr}/${d_obj} \
441 $o_ctr $o_obj
442
443############################################################
444# huge dlo object copy and orig delete
445
446o_ctr=swift-orig-dlo-ctr-2
447o_obj=dlo-orig-dlo-obj-2
448d_ctr=swift-copy-dlo-ctr-2
449d_obj=dlo-copy-dlo-obj-2
450
451myswift upload $o_ctr $huge_obj --object-name $o_obj \
452 -S $segment_size
453
454myswift copy --destination /${d_ctr}/${d_obj} \
455 $o_ctr $o_obj
456
457myswift delete $o_ctr $o_obj
458
459############################################################
460# huge slo object copy test
461
462o_ctr=swift-orig-slo-ctr-1
463o_obj=slo-orig-slo-obj-1
464d_ctr=swift-copy-slo-ctr-1
465d_obj=slo-copy-slo-obj-1
466myswift upload $o_ctr $huge_obj --object-name $o_obj \
467 -S $segment_size --use-slo
468
469myswift copy --destination /${d_ctr}/${d_obj} $o_ctr $o_obj
470
471############################################################
472# huge slo object copy test and orig delete
473
474o_ctr=swift-orig-slo-ctr-2
475o_obj=slo-orig-slo-obj-2
476d_ctr=swift-copy-slo-ctr-2
477d_obj=slo-copy-slo-obj-2
478myswift upload $o_ctr $huge_obj --object-name $o_obj \
479 -S $segment_size --use-slo
480
481myswift copy --destination /${d_ctr}/${d_obj} $o_ctr $o_obj
482
483myswift delete $o_ctr $o_obj
484
485########################################################################
486# FORCE GARBAGE COLLECTION
487
488sleep 6 # since for testing age at which gc can happen is 5 secs
489radosgw-admin gc process --include-all
490
491
492########################################
493# DO ORPHAN LIST
494
495pool="default.rgw.buckets.data"
496
497rgw-orphan-list $pool
498
499# we only expect there to be one output file, but loop just in case
500ol_error=""
501for 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:"
505 cat "$f"
506 fi
507done
508
509if [ -n "$ol_error" ] ;then
510 echo "ERROR: orphans found when none expected"
511 exit 1
512fi
513
514########################################################################
515# CLEAN UP
516
517rm -f $empty_obj $big_obj $huge_obj $s3config
518
519success