]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/cli_generic.sh
update sources to v12.1.3
[ceph.git] / ceph / qa / workunits / rbd / cli_generic.sh
1 #!/bin/sh -ex
2
3 # make sure rbd pool is EMPTY.. this is a test script!!
4 rbd ls | wc -l | grep -v '^0$' && echo "nonempty rbd pool, aborting! run this script on an empty test cluster only." && exit 1
5
6 IMGS="testimg1 testimg2 testimg3 testimg-diff1 testimg-diff2 testimg-diff3 foo foo2 bar bar2 test1 test2 test3 clone2"
7
8 tiered=0
9 if ceph osd dump | grep ^pool | grep "'rbd'" | grep tier; then
10 tiered=1
11 fi
12
13 remove_images() {
14 for img in $IMGS
15 do
16 (rbd snap purge $img || true) >/dev/null 2>&1
17 (rbd rm $img || true) >/dev/null 2>&1
18 done
19 }
20
21 test_others() {
22 echo "testing import, export, resize, and snapshots..."
23 TMP_FILES="/tmp/img1 /tmp/img1.new /tmp/img2 /tmp/img2.new /tmp/img3 /tmp/img3.new /tmp/img-diff1.new /tmp/img-diff2.new /tmp/img-diff3.new /tmp/img1.snap1 /tmp/img1.snap1 /tmp/img-diff1.snap1"
24
25 remove_images
26 rm -f $TMP_FILES
27
28 # create an image
29 dd if=/bin/sh of=/tmp/img1 bs=1k count=1 seek=10
30 dd if=/bin/dd of=/tmp/img1 bs=1k count=10 seek=100
31 dd if=/bin/rm of=/tmp/img1 bs=1k count=100 seek=1000
32 dd if=/bin/ls of=/tmp/img1 bs=1k seek=10000
33 dd if=/bin/ln of=/tmp/img1 bs=1k seek=100000
34
35 # import, snapshot
36 rbd import $RBD_CREATE_ARGS /tmp/img1 testimg1
37 rbd resize testimg1 --size=256 --allow-shrink
38 rbd export testimg1 /tmp/img2
39 rbd snap create testimg1 --snap=snap1
40 rbd resize testimg1 --size=128 && exit 1 || true # shrink should fail
41 rbd resize testimg1 --size=128 --allow-shrink
42 rbd export testimg1 /tmp/img3
43
44 # info
45 rbd info testimg1 | grep 'size 128 MB'
46 rbd info --snap=snap1 testimg1 | grep 'size 256 MB'
47
48 # export-diff
49 rm -rf /tmp/diff-testimg1-1 /tmp/diff-testimg1-2
50 rbd export-diff testimg1 --snap=snap1 /tmp/diff-testimg1-1
51 rbd export-diff testimg1 --from-snap=snap1 /tmp/diff-testimg1-2
52
53 # import-diff
54 rbd create $RBD_CREATE_ARGS --size=1 testimg-diff1
55 rbd import-diff --sparse-size 8K /tmp/diff-testimg1-1 testimg-diff1
56 rbd import-diff --sparse-size 8K /tmp/diff-testimg1-2 testimg-diff1
57
58 # info
59 rbd info testimg1 | grep 'size 128 MB'
60 rbd info --snap=snap1 testimg1 | grep 'size 256 MB'
61 rbd info testimg-diff1 | grep 'size 128 MB'
62 rbd info --snap=snap1 testimg-diff1 | grep 'size 256 MB'
63
64 # make copies
65 rbd copy testimg1 --snap=snap1 testimg2
66 rbd copy testimg1 testimg3
67 rbd copy testimg-diff1 --sparse-size 768K --snap=snap1 testimg-diff2
68 rbd copy testimg-diff1 --sparse-size 768K testimg-diff3
69
70 # verify the result
71 rbd info testimg2 | grep 'size 256 MB'
72 rbd info testimg3 | grep 'size 128 MB'
73 rbd info testimg-diff2 | grep 'size 256 MB'
74 rbd info testimg-diff3 | grep 'size 128 MB'
75
76 rbd export testimg1 /tmp/img1.new
77 rbd export testimg2 /tmp/img2.new
78 rbd export testimg3 /tmp/img3.new
79 rbd export testimg-diff1 /tmp/img-diff1.new
80 rbd export testimg-diff2 /tmp/img-diff2.new
81 rbd export testimg-diff3 /tmp/img-diff3.new
82
83 cmp /tmp/img2 /tmp/img2.new
84 cmp /tmp/img3 /tmp/img3.new
85 cmp /tmp/img2 /tmp/img-diff2.new
86 cmp /tmp/img3 /tmp/img-diff3.new
87
88 # rollback
89 rbd snap rollback --snap=snap1 testimg1
90 rbd snap rollback --snap=snap1 testimg-diff1
91 rbd info testimg1 | grep 'size 256 MB'
92 rbd info testimg-diff1 | grep 'size 256 MB'
93 rbd export testimg1 /tmp/img1.snap1
94 rbd export testimg-diff1 /tmp/img-diff1.snap1
95 cmp /tmp/img2 /tmp/img1.snap1
96 cmp /tmp/img2 /tmp/img-diff1.snap1
97
98 # test create, copy of zero-length images
99 rbd rm testimg2
100 rbd rm testimg3
101 rbd create testimg2 -s 0
102 rbd cp testimg2 testimg3
103
104 # remove snapshots
105 rbd snap rm --snap=snap1 testimg1
106 rbd snap rm --snap=snap1 testimg-diff1
107 rbd info --snap=snap1 testimg1 2>&1 | grep 'error setting snapshot context: (2) No such file or directory'
108 rbd info --snap=snap1 testimg-diff1 2>&1 | grep 'error setting snapshot context: (2) No such file or directory'
109
110 remove_images
111 rm -f $TMP_FILES
112 }
113
114 test_rename() {
115 echo "testing rename..."
116 remove_images
117
118 rbd create --image-format 1 -s 1 foo
119 rbd create --image-format 2 -s 1 bar
120 rbd rename foo foo2
121 rbd rename foo2 bar 2>&1 | grep exists
122 rbd rename bar bar2
123 rbd rename bar2 foo2 2>&1 | grep exists
124
125 rados mkpool rbd2
126 rbd pool init rbd2
127 rbd create -p rbd2 -s 1 foo
128 rbd rename rbd2/foo rbd2/bar
129 rbd -p rbd2 ls | grep bar
130 rbd rename rbd2/bar foo
131 rbd rename --pool rbd2 foo bar
132 ! rbd rename rbd2/bar --dest-pool rbd foo
133 rbd rename --pool rbd2 bar --dest-pool rbd2 foo
134 rbd -p rbd2 ls | grep foo
135 rados rmpool rbd2 rbd2 --yes-i-really-really-mean-it
136
137 remove_images
138 }
139
140 test_ls() {
141 echo "testing ls..."
142 remove_images
143
144 rbd create --image-format 1 -s 1 test1
145 rbd create --image-format 1 -s 1 test2
146 rbd ls | grep test1
147 rbd ls | grep test2
148 rbd ls | wc -l | grep 2
149 # look for fields in output of ls -l without worrying about space
150 rbd ls -l | grep 'test1.*1024k.*1'
151 rbd ls -l | grep 'test2.*1024k.*1'
152
153 rbd rm test1
154 rbd rm test2
155
156 rbd create --image-format 2 -s 1 test1
157 rbd create --image-format 2 -s 1 test2
158 rbd ls | grep test1
159 rbd ls | grep test2
160 rbd ls | wc -l | grep 2
161 rbd ls -l | grep 'test1.*1024k.*2'
162 rbd ls -l | grep 'test2.*1024k.*2'
163
164 rbd rm test1
165 rbd rm test2
166
167 rbd create --image-format 2 -s 1 test1
168 rbd create --image-format 1 -s 1 test2
169 rbd ls | grep test1
170 rbd ls | grep test2
171 rbd ls | wc -l | grep 2
172 rbd ls -l | grep 'test1.*1024k.*2'
173 rbd ls -l | grep 'test2.*1024k.*1'
174 remove_images
175
176 # test that many images can be shown by ls
177 for i in $(seq -w 00 99); do
178 rbd create image.$i -s 1
179 done
180 rbd ls | wc -l | grep 100
181 rbd ls -l | grep image | wc -l | grep 100
182 for i in $(seq -w 00 99); do
183 rbd rm image.$i
184 done
185
186 for i in $(seq -w 00 99); do
187 rbd create image.$i --image-format 2 -s 1
188 done
189 rbd ls | wc -l | grep 100
190 rbd ls -l | grep image | wc -l | grep 100
191 for i in $(seq -w 00 99); do
192 rbd rm image.$i
193 done
194 }
195
196 test_remove() {
197 echo "testing remove..."
198 remove_images
199
200 rbd remove "NOT_EXIST" && exit 1 || true # remove should fail
201 rbd create --image-format 1 -s 1 test1
202 rbd rm test1
203 rbd ls | wc -l | grep "^0$"
204
205 rbd create --image-format 2 -s 1 test2
206 rbd rm test2
207 rbd ls | wc -l | grep "^0$"
208
209 # check that remove succeeds even if it's
210 # interrupted partway through. simulate this
211 # by removing some objects manually.
212
213 # remove with header missing (old format)
214 rbd create --image-format 1 -s 1 test1
215 rados rm -p rbd test1.rbd
216 rbd rm test1
217 rbd ls | wc -l | grep "^0$"
218
219 if [ $tiered -eq 0 ]; then
220 # remove with header missing
221 rbd create --image-format 2 -s 1 test2
222 HEADER=$(rados -p rbd ls | grep '^rbd_header')
223 rados -p rbd rm $HEADER
224 rbd rm test2
225 rbd ls | wc -l | grep "^0$"
226
227 # remove with id missing
228 rbd create --image-format 2 -s 1 test2
229 rados -p rbd rm rbd_id.test2
230 rbd rm test2
231 rbd ls | wc -l | grep "^0$"
232
233 # remove with header and id missing
234 rbd create --image-format 2 -s 1 test2
235 HEADER=$(rados -p rbd ls | grep '^rbd_header')
236 rados -p rbd rm $HEADER
237 rados -p rbd rm rbd_id.test2
238 rbd rm test2
239 rbd ls | wc -l | grep "^0$"
240 fi
241
242 # remove with rbd_children object missing (and, by extension,
243 # with child not mentioned in rbd_children)
244 rbd create --image-format 2 -s 1 test2
245 rbd snap create test2@snap
246 rbd snap protect test2@snap
247 rbd clone test2@snap clone
248
249 rados -p rbd rm rbd_children
250 rbd rm clone
251 rbd ls | grep clone | wc -l | grep '^0$'
252
253 rbd snap unprotect test2@snap
254 rbd snap rm test2@snap
255 rbd rm test2
256 }
257
258 test_locking() {
259 echo "testing locking..."
260 remove_images
261
262 rbd create -s 1 test1
263 rbd lock list test1 | wc -l | grep '^0$'
264 rbd lock add test1 id
265 rbd lock list test1 | grep ' 1 '
266 LOCKER=$(rbd lock list test1 | tail -n 1 | awk '{print $1;}')
267 rbd lock remove test1 id $LOCKER
268 rbd lock list test1 | wc -l | grep '^0$'
269
270 rbd lock add test1 id --shared tag
271 rbd lock list test1 | grep ' 1 '
272 rbd lock add test1 id --shared tag
273 rbd lock list test1 | grep ' 2 '
274 rbd lock add test1 id2 --shared tag
275 rbd lock list test1 | grep ' 3 '
276 rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
277 if rbd info test1 | grep -qE "features:.*exclusive"
278 then
279 # new locking functionality requires all locks to be released
280 while [ -n "$(rbd lock list test1)" ]
281 do
282 rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
283 done
284 fi
285 rbd rm test1
286 }
287
288 test_pool_image_args() {
289 echo "testing pool and image args..."
290 remove_images
291
292 ceph osd pool delete test test --yes-i-really-really-mean-it || true
293 ceph osd pool create test 100
294 rbd pool init test
295 truncate -s 1 /tmp/empty /tmp/empty@snap
296
297 rbd ls | wc -l | grep 0
298 rbd create -s 1 test1
299 rbd ls | grep -q test1
300 rbd import --image test2 /tmp/empty
301 rbd ls | grep -q test2
302 rbd --dest test3 import /tmp/empty
303 rbd ls | grep -q test3
304 rbd import /tmp/empty foo
305 rbd ls | grep -q foo
306
307 # should fail due to "destination snapname specified"
308 rbd import --dest test/empty@snap /tmp/empty && exit 1 || true
309 rbd import /tmp/empty test/empty@snap && exit 1 || true
310 rbd import --image test/empty@snap /tmp/empty && exit 1 || true
311 rbd import /tmp/empty@snap && exit 1 || true
312
313 rbd ls test | wc -l | grep 0
314 rbd import /tmp/empty test/test1
315 rbd ls test | grep -q test1
316 rbd -p test import /tmp/empty test2
317 rbd ls test | grep -q test2
318 rbd --image test3 -p test import /tmp/empty
319 rbd ls test | grep -q test3
320 rbd --image test4 -p test import /tmp/empty
321 rbd ls test | grep -q test4
322 rbd --dest test5 -p test import /tmp/empty
323 rbd ls test | grep -q test5
324 rbd --dest test6 --dest-pool test import /tmp/empty
325 rbd ls test | grep -q test6
326 rbd --image test7 --dest-pool test import /tmp/empty
327 rbd ls test | grep -q test7
328 rbd --image test/test8 import /tmp/empty
329 rbd ls test | grep -q test8
330 rbd --dest test/test9 import /tmp/empty
331 rbd ls test | grep -q test9
332 rbd import --pool test /tmp/empty
333 rbd ls test | grep -q empty
334
335 # copy with no explicit pool goes to pool rbd
336 rbd copy test/test9 test10
337 rbd ls test | grep -qv test10
338 rbd ls | grep -q test10
339 rbd copy test/test9 test/test10
340 rbd ls test | grep -q test10
341 rbd copy --pool test test10 --dest-pool test test11
342 rbd ls test | grep -q test11
343 rbd copy --dest-pool rbd --pool test test11 test12
344 rbd ls | grep test12
345 rbd ls test | grep -qv test12
346
347 rm -f /tmp/empty /tmp/empty@snap
348 ceph osd pool delete test test --yes-i-really-really-mean-it
349
350 for f in foo test1 test10 test12 test2 test3 ; do
351 rbd rm $f
352 done
353 }
354
355 test_clone() {
356 echo "testing clone..."
357 remove_images
358 rbd create test1 $RBD_CREATE_ARGS -s 1
359 rbd snap create test1@s1
360 rbd snap protect test1@s1
361
362 rados mkpool rbd2
363 rbd pool init rbd2
364 rbd clone test1@s1 rbd2/clone
365 rbd -p rbd2 ls | grep clone
366 rbd -p rbd2 ls -l | grep clone | grep test1@s1
367 rbd ls | grep -v clone
368 rbd flatten rbd2/clone
369 rbd snap create rbd2/clone@s1
370 rbd snap protect rbd2/clone@s1
371 rbd clone rbd2/clone@s1 clone2
372 rbd ls | grep clone2
373 rbd ls -l | grep clone2 | grep rbd2/clone@s1
374 rbd -p rbd2 ls | grep -v clone2
375
376 rbd rm clone2
377 rbd snap unprotect rbd2/clone@s1
378 rbd snap rm rbd2/clone@s1
379 rbd rm rbd2/clone
380 rbd snap unprotect test1@s1
381 rbd snap rm test1@s1
382 rbd rm test1
383 rados rmpool rbd2 rbd2 --yes-i-really-really-mean-it
384 }
385
386 test_trash() {
387 echo "testing trash..."
388 remove_images
389
390 rbd create --image-format 2 -s 1 test1
391 rbd create --image-format 2 -s 1 test2
392 rbd ls | grep test1
393 rbd ls | grep test2
394 rbd ls | wc -l | grep 2
395 rbd ls -l | grep 'test1.*2.*'
396 rbd ls -l | grep 'test2.*2.*'
397
398 rbd trash mv test1
399 rbd ls | grep test2
400 rbd ls | wc -l | grep 1
401 rbd ls -l | grep 'test2.*2.*'
402
403 rbd trash ls | grep test1
404 rbd trash ls | wc -l | grep 1
405 rbd trash ls -l | grep 'test1.*USER.*'
406 rbd trash ls -l | grep -v 'protected until'
407
408 ID=`rbd trash ls | cut -d ' ' -f 1`
409 rbd trash rm $ID
410
411 rbd trash mv test2
412 ID=`rbd trash ls | cut -d ' ' -f 1`
413 rbd info --image-id $ID | grep "rbd image '$ID'"
414
415 rbd trash restore $ID
416 rbd ls | grep test2
417 rbd ls | wc -l | grep 1
418 rbd ls -l | grep 'test2.*2.*'
419
420 rbd trash mv test2 --delay 3600
421 rbd trash ls | grep test2
422 rbd trash ls | wc -l | grep 1
423 rbd trash ls -l | grep 'test2.*USER.*protected until'
424
425 rbd trash rm $ID 2>&1 | grep 'Deferment time has not expired'
426 rbd trash rm --image-id $ID --force
427
428 rbd create --image-format 2 -s 1 test1
429 rbd snap create test1@snap1
430 rbd snap protect test1@snap1
431 rbd trash mv test1
432
433 rbd trash ls | grep test1
434 rbd trash ls | wc -l | grep 1
435 rbd trash ls -l | grep 'test1.*USER.*'
436 rbd trash ls -l | grep -v 'protected until'
437
438 ID=`rbd trash ls | cut -d ' ' -f 1`
439 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 1
440 rbd snap ls --image-id $ID | grep '.*snap1.*'
441
442 rbd snap unprotect --image-id $ID --snap snap1
443 rbd snap rm --image-id $ID --snap snap1
444 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 0
445
446 rbd trash restore $ID
447 rbd snap create test1@snap1
448 rbd snap create test1@snap2
449 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 2
450 rbd snap purge --image-id $ID
451 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 0
452
453 remove_images
454 }
455
456
457 test_pool_image_args
458 test_rename
459 test_ls
460 test_remove
461 RBD_CREATE_ARGS=""
462 test_others
463 test_locking
464 RBD_CREATE_ARGS="--image-format 2"
465 test_others
466 test_locking
467 test_clone
468 test_trash
469
470 echo OK