]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/cli_generic.sh
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / workunits / rbd / cli_generic.sh
1 #!/usr/bin/env bash
2 set -ex
3
4 . $(dirname $0)/../../standalone/ceph-helpers.sh
5
6 export RBD_FORCE_ALLOW_V1=1
7
8 # make sure rbd pool is EMPTY.. this is a test script!!
9 rbd ls | wc -l | grep -v '^0$' && echo "nonempty rbd pool, aborting! run this script on an empty test cluster only." && exit 1
10
11 IMGS="testimg1 testimg2 testimg3 testimg4 testimg5 testimg6 testimg-diff1 testimg-diff2 testimg-diff3 foo foo2 bar bar2 test1 test2 test3 test4 clone2"
12
13 expect_fail() {
14 "$@" && return 1 || return 0
15 }
16
17 tiered=0
18 if ceph osd dump | grep ^pool | grep "'rbd'" | grep tier; then
19 tiered=1
20 fi
21
22 remove_images() {
23 for img in $IMGS
24 do
25 (rbd snap purge $img || true) >/dev/null 2>&1
26 (rbd rm $img || true) >/dev/null 2>&1
27 done
28 }
29
30 test_others() {
31 echo "testing import, export, resize, and snapshots..."
32 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"
33
34 remove_images
35 rm -f $TMP_FILES
36
37 # create an image
38 dd if=/bin/sh of=/tmp/img1 bs=1k count=1 seek=10
39 dd if=/bin/dd of=/tmp/img1 bs=1k count=10 seek=100
40 dd if=/bin/rm of=/tmp/img1 bs=1k count=100 seek=1000
41 dd if=/bin/ls of=/tmp/img1 bs=1k seek=10000
42 dd if=/bin/ln of=/tmp/img1 bs=1k seek=100000
43
44 # import, snapshot
45 rbd import $RBD_CREATE_ARGS /tmp/img1 testimg1
46 rbd resize testimg1 --size=256 --allow-shrink
47 rbd export testimg1 /tmp/img2
48 rbd snap create testimg1 --snap=snap1
49 rbd resize testimg1 --size=128 && exit 1 || true # shrink should fail
50 rbd resize testimg1 --size=128 --allow-shrink
51 rbd export testimg1 /tmp/img3
52
53 # info
54 rbd info testimg1 | grep 'size 128 MiB'
55 rbd info --snap=snap1 testimg1 | grep 'size 256 MiB'
56
57 # export-diff
58 rm -rf /tmp/diff-testimg1-1 /tmp/diff-testimg1-2
59 rbd export-diff testimg1 --snap=snap1 /tmp/diff-testimg1-1
60 rbd export-diff testimg1 --from-snap=snap1 /tmp/diff-testimg1-2
61
62 # import-diff
63 rbd create $RBD_CREATE_ARGS --size=1 testimg-diff1
64 rbd import-diff --sparse-size 8K /tmp/diff-testimg1-1 testimg-diff1
65 rbd import-diff --sparse-size 8K /tmp/diff-testimg1-2 testimg-diff1
66
67 # info
68 rbd info testimg1 | grep 'size 128 MiB'
69 rbd info --snap=snap1 testimg1 | grep 'size 256 MiB'
70 rbd info testimg-diff1 | grep 'size 128 MiB'
71 rbd info --snap=snap1 testimg-diff1 | grep 'size 256 MiB'
72
73 # make copies
74 rbd copy testimg1 --snap=snap1 testimg2
75 rbd copy testimg1 testimg3
76 rbd copy testimg-diff1 --sparse-size 768K --snap=snap1 testimg-diff2
77 rbd copy testimg-diff1 --sparse-size 768K testimg-diff3
78
79 # verify the result
80 rbd info testimg2 | grep 'size 256 MiB'
81 rbd info testimg3 | grep 'size 128 MiB'
82 rbd info testimg-diff2 | grep 'size 256 MiB'
83 rbd info testimg-diff3 | grep 'size 128 MiB'
84
85 # deep copies
86 rbd deep copy testimg1 testimg4
87 rbd deep copy testimg1 --snap=snap1 testimg5
88 rbd info testimg4 | grep 'size 128 MiB'
89 rbd info testimg5 | grep 'size 256 MiB'
90 rbd snap ls testimg4 | grep -v 'SNAPID' | wc -l | grep 1
91 rbd snap ls testimg4 | grep '.*snap1.*'
92
93 rbd export testimg1 /tmp/img1.new
94 rbd export testimg2 /tmp/img2.new
95 rbd export testimg3 /tmp/img3.new
96 rbd export testimg-diff1 /tmp/img-diff1.new
97 rbd export testimg-diff2 /tmp/img-diff2.new
98 rbd export testimg-diff3 /tmp/img-diff3.new
99
100 cmp /tmp/img2 /tmp/img2.new
101 cmp /tmp/img3 /tmp/img3.new
102 cmp /tmp/img2 /tmp/img-diff2.new
103 cmp /tmp/img3 /tmp/img-diff3.new
104
105 # rollback
106 rbd snap rollback --snap=snap1 testimg1
107 rbd snap rollback --snap=snap1 testimg-diff1
108 rbd info testimg1 | grep 'size 256 MiB'
109 rbd info testimg-diff1 | grep 'size 256 MiB'
110 rbd export testimg1 /tmp/img1.snap1
111 rbd export testimg-diff1 /tmp/img-diff1.snap1
112 cmp /tmp/img2 /tmp/img1.snap1
113 cmp /tmp/img2 /tmp/img-diff1.snap1
114
115 # test create, copy of zero-length images
116 rbd rm testimg2
117 rbd rm testimg3
118 rbd create testimg2 -s 0
119 rbd cp testimg2 testimg3
120 rbd deep cp testimg2 testimg6
121
122 # remove snapshots
123 rbd snap rm --snap=snap1 testimg1
124 rbd snap rm --snap=snap1 testimg-diff1
125 rbd info --snap=snap1 testimg1 2>&1 | grep 'error setting snapshot context: (2) No such file or directory'
126 rbd info --snap=snap1 testimg-diff1 2>&1 | grep 'error setting snapshot context: (2) No such file or directory'
127
128 # sparsify
129 rbd sparsify testimg1
130
131 remove_images
132 rm -f $TMP_FILES
133 }
134
135 test_rename() {
136 echo "testing rename..."
137 remove_images
138
139 rbd create --image-format 1 -s 1 foo
140 rbd create --image-format 2 -s 1 bar
141 rbd rename foo foo2
142 rbd rename foo2 bar 2>&1 | grep exists
143 rbd rename bar bar2
144 rbd rename bar2 foo2 2>&1 | grep exists
145
146 ceph osd pool create rbd2 8
147 rbd pool init rbd2
148 rbd create -p rbd2 -s 1 foo
149 rbd rename rbd2/foo rbd2/bar
150 rbd -p rbd2 ls | grep bar
151 rbd rename rbd2/bar foo
152 rbd rename --pool rbd2 foo bar
153 ! rbd rename rbd2/bar --dest-pool rbd foo
154 rbd rename --pool rbd2 bar --dest-pool rbd2 foo
155 rbd -p rbd2 ls | grep foo
156 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
157
158 remove_images
159 }
160
161 test_ls() {
162 echo "testing ls..."
163 remove_images
164
165 rbd create --image-format 1 -s 1 test1
166 rbd create --image-format 1 -s 1 test2
167 rbd ls | grep test1
168 rbd ls | grep test2
169 rbd ls | wc -l | grep 2
170 # look for fields in output of ls -l without worrying about space
171 rbd ls -l | grep 'test1.*1 MiB.*1'
172 rbd ls -l | grep 'test2.*1 MiB.*1'
173
174 rbd rm test1
175 rbd rm test2
176
177 rbd create --image-format 2 -s 1 test1
178 rbd create --image-format 2 -s 1 test2
179 rbd ls | grep test1
180 rbd ls | grep test2
181 rbd ls | wc -l | grep 2
182 rbd ls -l | grep 'test1.*1 MiB.*2'
183 rbd ls -l | grep 'test2.*1 MiB.*2'
184
185 rbd rm test1
186 rbd rm test2
187
188 rbd create --image-format 2 -s 1 test1
189 rbd create --image-format 1 -s 1 test2
190 rbd ls | grep test1
191 rbd ls | grep test2
192 rbd ls | wc -l | grep 2
193 rbd ls -l | grep 'test1.*1 MiB.*2'
194 rbd ls -l | grep 'test2.*1 MiB.*1'
195 remove_images
196
197 # test that many images can be shown by ls
198 for i in $(seq -w 00 99); do
199 rbd create image.$i -s 1
200 done
201 rbd ls | wc -l | grep 100
202 rbd ls -l | grep image | wc -l | grep 100
203 for i in $(seq -w 00 99); do
204 rbd rm image.$i
205 done
206
207 for i in $(seq -w 00 99); do
208 rbd create image.$i --image-format 2 -s 1
209 done
210 rbd ls | wc -l | grep 100
211 rbd ls -l | grep image | wc -l | grep 100
212 for i in $(seq -w 00 99); do
213 rbd rm image.$i
214 done
215 }
216
217 test_remove() {
218 echo "testing remove..."
219 remove_images
220
221 rbd remove "NOT_EXIST" && exit 1 || true # remove should fail
222 rbd create --image-format 1 -s 1 test1
223 rbd rm test1
224 rbd ls | wc -l | grep "^0$"
225
226 rbd create --image-format 2 -s 1 test2
227 rbd rm test2
228 rbd ls | wc -l | grep "^0$"
229
230 # check that remove succeeds even if it's
231 # interrupted partway through. simulate this
232 # by removing some objects manually.
233
234 # remove with header missing (old format)
235 rbd create --image-format 1 -s 1 test1
236 rados rm -p rbd test1.rbd
237 rbd rm test1
238 rbd ls | wc -l | grep "^0$"
239
240 if [ $tiered -eq 0 ]; then
241 # remove with header missing
242 rbd create --image-format 2 -s 1 test2
243 HEADER=$(rados -p rbd ls | grep '^rbd_header')
244 rados -p rbd rm $HEADER
245 rbd rm test2
246 rbd ls | wc -l | grep "^0$"
247
248 # remove with id missing
249 rbd create --image-format 2 -s 1 test2
250 rados -p rbd rm rbd_id.test2
251 rbd rm test2
252 rbd ls | wc -l | grep "^0$"
253
254 # remove with header and id missing
255 rbd create --image-format 2 -s 1 test2
256 HEADER=$(rados -p rbd ls | grep '^rbd_header')
257 rados -p rbd rm $HEADER
258 rados -p rbd rm rbd_id.test2
259 rbd rm test2
260 rbd ls | wc -l | grep "^0$"
261 fi
262
263 # remove with rbd_children object missing (and, by extension,
264 # with child not mentioned in rbd_children)
265 rbd create --image-format 2 -s 1 test2
266 rbd snap create test2@snap
267 rbd snap protect test2@snap
268 rbd clone test2@snap clone --rbd-default-clone-format 1
269
270 rados -p rbd rm rbd_children
271 rbd rm clone
272 rbd ls | grep clone | wc -l | grep '^0$'
273
274 rbd snap unprotect test2@snap
275 rbd snap rm test2@snap
276 rbd rm test2
277 }
278
279 test_locking() {
280 echo "testing locking..."
281 remove_images
282
283 rbd create $RBD_CREATE_ARGS -s 1 test1
284 rbd lock list test1 | wc -l | grep '^0$'
285 rbd lock add test1 id
286 rbd lock list test1 | grep ' 1 '
287 LOCKER=$(rbd lock list test1 | tail -n 1 | awk '{print $1;}')
288 rbd lock remove test1 id $LOCKER
289 rbd lock list test1 | wc -l | grep '^0$'
290
291 rbd lock add test1 id --shared tag
292 rbd lock list test1 | grep ' 1 '
293 rbd lock add test1 id --shared tag
294 rbd lock list test1 | grep ' 2 '
295 rbd lock add test1 id2 --shared tag
296 rbd lock list test1 | grep ' 3 '
297 rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
298 if rbd info test1 | grep -qE "features:.*exclusive"
299 then
300 # new locking functionality requires all locks to be released
301 while [ -n "$(rbd lock list test1)" ]
302 do
303 rbd lock list test1 | tail -n 1 | awk '{print $2, $1;}' | xargs rbd lock remove test1
304 done
305 fi
306 rbd rm test1
307 }
308
309 test_pool_image_args() {
310 echo "testing pool and image args..."
311 remove_images
312
313 ceph osd pool delete test test --yes-i-really-really-mean-it || true
314 ceph osd pool create test 32
315 rbd pool init test
316 truncate -s 1 /tmp/empty /tmp/empty@snap
317
318 rbd ls | wc -l | grep 0
319 rbd create -s 1 test1
320 rbd ls | grep -q test1
321 rbd import --image test2 /tmp/empty
322 rbd ls | grep -q test2
323 rbd --dest test3 import /tmp/empty
324 rbd ls | grep -q test3
325 rbd import /tmp/empty foo
326 rbd ls | grep -q foo
327
328 # should fail due to "destination snapname specified"
329 rbd import --dest test/empty@snap /tmp/empty && exit 1 || true
330 rbd import /tmp/empty test/empty@snap && exit 1 || true
331 rbd import --image test/empty@snap /tmp/empty && exit 1 || true
332 rbd import /tmp/empty@snap && exit 1 || true
333
334 rbd ls test | wc -l | grep 0
335 rbd import /tmp/empty test/test1
336 rbd ls test | grep -q test1
337 rbd -p test import /tmp/empty test2
338 rbd ls test | grep -q test2
339 rbd --image test3 -p test import /tmp/empty
340 rbd ls test | grep -q test3
341 rbd --image test4 -p test import /tmp/empty
342 rbd ls test | grep -q test4
343 rbd --dest test5 -p test import /tmp/empty
344 rbd ls test | grep -q test5
345 rbd --dest test6 --dest-pool test import /tmp/empty
346 rbd ls test | grep -q test6
347 rbd --image test7 --dest-pool test import /tmp/empty
348 rbd ls test | grep -q test7
349 rbd --image test/test8 import /tmp/empty
350 rbd ls test | grep -q test8
351 rbd --dest test/test9 import /tmp/empty
352 rbd ls test | grep -q test9
353 rbd import --pool test /tmp/empty
354 rbd ls test | grep -q empty
355
356 # copy with no explicit pool goes to pool rbd
357 rbd copy test/test9 test10
358 rbd ls test | grep -qv test10
359 rbd ls | grep -q test10
360 rbd copy test/test9 test/test10
361 rbd ls test | grep -q test10
362 rbd copy --pool test test10 --dest-pool test test11
363 rbd ls test | grep -q test11
364 rbd copy --dest-pool rbd --pool test test11 test12
365 rbd ls | grep test12
366 rbd ls test | grep -qv test12
367
368 rm -f /tmp/empty /tmp/empty@snap
369 ceph osd pool delete test test --yes-i-really-really-mean-it
370
371 for f in foo test1 test10 test12 test2 test3 ; do
372 rbd rm $f
373 done
374 }
375
376 test_clone() {
377 echo "testing clone..."
378 remove_images
379 rbd create test1 $RBD_CREATE_ARGS -s 1
380 rbd snap create test1@s1
381 rbd snap protect test1@s1
382
383 ceph osd pool create rbd2 8
384 rbd pool init rbd2
385 rbd clone test1@s1 rbd2/clone
386 rbd -p rbd2 ls | grep clone
387 rbd -p rbd2 ls -l | grep clone | grep test1@s1
388 rbd ls | grep -v clone
389 rbd flatten rbd2/clone
390 rbd snap create rbd2/clone@s1
391 rbd snap protect rbd2/clone@s1
392 rbd clone rbd2/clone@s1 clone2
393 rbd ls | grep clone2
394 rbd ls -l | grep clone2 | grep rbd2/clone@s1
395 rbd -p rbd2 ls | grep -v clone2
396
397 rbd rm clone2
398 rbd snap unprotect rbd2/clone@s1
399 rbd snap rm rbd2/clone@s1
400 rbd rm rbd2/clone
401 rbd snap unprotect test1@s1
402 rbd snap rm test1@s1
403 rbd rm test1
404 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
405 }
406
407 test_trash() {
408 echo "testing trash..."
409 remove_images
410
411 rbd create $RBD_CREATE_ARGS -s 1 test1
412 rbd create $RBD_CREATE_ARGS -s 1 test2
413 rbd ls | grep test1
414 rbd ls | grep test2
415 rbd ls | wc -l | grep 2
416 rbd ls -l | grep 'test1.*2.*'
417 rbd ls -l | grep 'test2.*2.*'
418
419 rbd trash mv test1
420 rbd ls | grep test2
421 rbd ls | wc -l | grep 1
422 rbd ls -l | grep 'test2.*2.*'
423
424 rbd trash ls | grep test1
425 rbd trash ls | wc -l | grep 1
426 rbd trash ls -l | grep 'test1.*USER.*'
427 rbd trash ls -l | grep -v 'protected until'
428
429 ID=`rbd trash ls | cut -d ' ' -f 1`
430 rbd trash rm $ID
431
432 rbd trash mv test2
433 ID=`rbd trash ls | cut -d ' ' -f 1`
434 rbd info --image-id $ID | grep "rbd image 'test2'"
435
436 rbd trash restore $ID
437 rbd ls | grep test2
438 rbd ls | wc -l | grep 1
439 rbd ls -l | grep 'test2.*2.*'
440
441 rbd trash mv test2 --expires-at "3600 sec"
442 rbd trash ls | grep test2
443 rbd trash ls | wc -l | grep 1
444 rbd trash ls -l | grep 'test2.*USER.*protected until'
445
446 rbd trash rm $ID 2>&1 | grep 'Deferment time has not expired'
447 rbd trash rm --image-id $ID --force
448
449 rbd create $RBD_CREATE_ARGS -s 1 test1
450 rbd snap create test1@snap1
451 rbd snap protect test1@snap1
452 rbd trash mv test1
453
454 rbd trash ls | grep test1
455 rbd trash ls | wc -l | grep 1
456 rbd trash ls -l | grep 'test1.*USER.*'
457 rbd trash ls -l | grep -v 'protected until'
458
459 ID=`rbd trash ls | cut -d ' ' -f 1`
460 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 1
461 rbd snap ls --image-id $ID | grep '.*snap1.*'
462
463 rbd snap unprotect --image-id $ID --snap snap1
464 rbd snap rm --image-id $ID --snap snap1
465 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 0
466
467 rbd trash restore $ID
468 rbd snap create test1@snap1
469 rbd snap create test1@snap2
470 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 2
471 rbd snap purge --image-id $ID
472 rbd snap ls --image-id $ID | grep -v 'SNAPID' | wc -l | grep 0
473
474 rbd rm --rbd_move_to_trash_on_remove=true --rbd_move_to_trash_on_remove_expire_seconds=3600 test1
475 rbd trash ls | grep test1
476 rbd trash ls | wc -l | grep 1
477 rbd trash ls -l | grep 'test1.*USER.*protected until'
478 rbd trash rm $ID 2>&1 | grep 'Deferment time has not expired'
479 rbd trash rm --image-id $ID --force
480
481 remove_images
482 }
483
484 test_purge() {
485 echo "testing trash purge..."
486 remove_images
487
488 rbd trash purge
489 rbd trash ls | wc -l | grep 0
490
491 rbd create $RBD_CREATE_ARGS foo -s 1
492 rbd create $RBD_CREATE_ARGS bar -s 1
493
494 rbd trash mv foo --expires-at "10 sec"
495 rbd trash mv bar --expires-at "30 sec"
496
497 rbd trash purge --expired-before "now + 10 sec"
498 rbd trash ls | grep -v foo | wc -l | grep 1
499 rbd trash ls | grep bar
500
501 LAST_IMG=$(rbd trash ls | grep bar | awk '{print $1;}')
502 rbd trash rm $LAST_IMG --force --no-progress | grep -v '.' | wc -l | grep 0
503 }
504
505 test_deep_copy_clone() {
506 echo "testing deep copy clone..."
507 remove_images
508
509 rbd create testimg1 $RBD_CREATE_ARGS --size 256
510 rbd snap create testimg1 --snap=snap1
511 rbd snap protect testimg1@snap1
512 rbd clone testimg1@snap1 testimg2
513 rbd snap create testimg2@snap2
514 rbd deep copy testimg2 testimg3
515 rbd info testimg3 | grep 'size 256 MiB'
516 rbd info testimg3 | grep 'parent: rbd/testimg1@snap1'
517 rbd snap ls testimg3 | grep -v 'SNAPID' | wc -l | grep 1
518 rbd snap ls testimg3 | grep '.*snap2.*'
519 rbd info testimg2 | grep 'features:.*deep-flatten' || rbd snap rm testimg2@snap2
520 rbd info testimg3 | grep 'features:.*deep-flatten' || rbd snap rm testimg3@snap2
521 rbd flatten testimg2
522 rbd flatten testimg3
523 rbd snap unprotect testimg1@snap1
524 rbd snap purge testimg2
525 rbd snap purge testimg3
526 rbd rm testimg2
527 rbd rm testimg3
528
529 rbd snap protect testimg1@snap1
530 rbd clone testimg1@snap1 testimg2
531 rbd snap create testimg2@snap2
532 rbd deep copy --flatten testimg2 testimg3
533 rbd info testimg3 | grep 'size 256 MiB'
534 rbd info testimg3 | grep -v 'parent:'
535 rbd snap ls testimg3 | grep -v 'SNAPID' | wc -l | grep 1
536 rbd snap ls testimg3 | grep '.*snap2.*'
537 rbd info testimg2 | grep 'features:.*deep-flatten' || rbd snap rm testimg2@snap2
538 rbd flatten testimg2
539 rbd snap unprotect testimg1@snap1
540
541 remove_images
542 }
543
544 test_clone_v2() {
545 echo "testing clone v2..."
546 remove_images
547
548 rbd create $RBD_CREATE_ARGS -s 1 test1
549 rbd snap create test1@1
550 rbd clone --rbd-default-clone-format=1 test1@1 test2 && exit 1 || true
551 rbd clone --rbd-default-clone-format=2 test1@1 test2
552 rbd clone --rbd-default-clone-format=2 test1@1 test3
553
554 rbd snap protect test1@1
555 rbd clone --rbd-default-clone-format=1 test1@1 test4
556
557 rbd children test1@1 | sort | tr '\n' ' ' | grep -E "test2.*test3.*test4"
558 rbd children --descendants test1 | sort | tr '\n' ' ' | grep -E "test2.*test3.*test4"
559
560 rbd remove test4
561 rbd snap unprotect test1@1
562
563 rbd snap remove test1@1
564 rbd snap list --all test1 | grep -E "trash \(1\) *$"
565
566 rbd snap create test1@2
567 rbd rm test1 2>&1 | grep 'image has snapshots'
568
569 rbd snap rm test1@2
570 rbd rm test1 2>&1 | grep 'linked clones'
571
572 rbd rm test3
573 rbd rm test1 2>&1 | grep 'linked clones'
574
575 rbd flatten test2
576 rbd snap list --all test1 | wc -l | grep '^0$'
577 rbd rm test1
578 rbd rm test2
579 }
580
581 test_thick_provision() {
582 echo "testing thick provision..."
583 remove_images
584
585 # Try to create small and large thick-pro image and
586 # check actual size. (64M and 4G)
587
588 # Small thick-pro image test
589 rbd create $RBD_CREATE_ARGS --thick-provision -s 64M test1
590 count=0
591 ret=""
592 while [ $count -lt 10 ]
593 do
594 rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^64 MiB' && ret=$?
595 if [ "$ret" = "0" ]
596 then
597 break;
598 fi
599 count=`expr $count + 1`
600 sleep 2
601 done
602 rbd du
603 if [ "$ret" != "0" ]
604 then
605 exit 1
606 fi
607 rbd rm test1
608 rbd ls | grep test1 | wc -l | grep '^0$'
609
610 # Large thick-pro image test
611 rbd create $RBD_CREATE_ARGS --thick-provision -s 4G test1
612 count=0
613 ret=""
614 while [ $count -lt 10 ]
615 do
616 rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^4 GiB' && ret=$?
617 if [ "$ret" = "0" ]
618 then
619 break;
620 fi
621 count=`expr $count + 1`
622 sleep 2
623 done
624 rbd du
625 if [ "$ret" != "0" ]
626 then
627 exit 1
628 fi
629 rbd rm test1
630 rbd ls | grep test1 | wc -l | grep '^0$'
631 }
632
633 test_namespace() {
634 echo "testing namespace..."
635 remove_images
636
637 rbd namespace ls | wc -l | grep '^0$'
638 rbd namespace create rbd/test1
639 rbd namespace create --pool rbd --namespace test2
640 rbd namespace create --namespace test3
641 expect_fail rbd namespace create rbd/test3
642
643 rbd namespace list | grep 'test' | wc -l | grep '^3$'
644
645 expect_fail rbd namespace remove --pool rbd missing
646
647 rbd create $RBD_CREATE_ARGS --size 1G rbd/test1/image1
648
649 # default test1 ns to test2 ns clone
650 rbd bench --io-type write --io-pattern rand --io-total 32M --io-size 4K rbd/test1/image1
651 rbd snap create rbd/test1/image1@1
652 rbd clone --rbd-default-clone-format 2 rbd/test1/image1@1 rbd/test2/image1
653 rbd snap rm rbd/test1/image1@1
654 cmp <(rbd export rbd/test1/image1 -) <(rbd export rbd/test2/image1 -)
655 rbd rm rbd/test2/image1
656
657 # default ns to test1 ns clone
658 rbd create $RBD_CREATE_ARGS --size 1G rbd/image2
659 rbd bench --io-type write --io-pattern rand --io-total 32M --io-size 4K rbd/image2
660 rbd snap create rbd/image2@1
661 rbd clone --rbd-default-clone-format 2 rbd/image2@1 rbd/test2/image2
662 rbd snap rm rbd/image2@1
663 cmp <(rbd export rbd/image2 -) <(rbd export rbd/test2/image2 -)
664 expect_fail rbd rm rbd/image2
665 rbd rm rbd/test2/image2
666 rbd rm rbd/image2
667
668 rbd create $RBD_CREATE_ARGS --size 1G --namespace test1 image2
669 expect_fail rbd namespace remove rbd/test1
670
671 rbd group create rbd/test1/group1
672 rbd group image add rbd/test1/group1 rbd/test1/image1
673 rbd group rm rbd/test1/group1
674
675 rbd trash move rbd/test1/image1
676 ID=`rbd trash --namespace test1 ls | cut -d ' ' -f 1`
677 rbd trash rm rbd/test1/${ID}
678
679 rbd remove rbd/test1/image2
680
681 rbd namespace remove --pool rbd --namespace test1
682 rbd namespace remove --namespace test3
683
684 rbd namespace list | grep 'test' | wc -l | grep '^1$'
685 rbd namespace remove rbd/test2
686 }
687
688 get_migration_state() {
689 local image=$1
690
691 rbd --format xml status $image |
692 $XMLSTARLET sel -t -v '//status/migration/state'
693 }
694
695 test_migration() {
696 echo "testing migration..."
697 remove_images
698 ceph osd pool create rbd2 8
699 rbd pool init rbd2
700
701 # Convert to new format
702 rbd create --image-format 1 -s 128M test1
703 rbd info test1 | grep 'format: 1'
704 rbd migration prepare test1 --image-format 2
705 test "$(get_migration_state test1)" = prepared
706 rbd info test1 | grep 'format: 2'
707 rbd rm test1 && exit 1 || true
708 rbd migration execute test1
709 test "$(get_migration_state test1)" = executed
710 rbd migration commit test1
711 get_migration_state test1 && exit 1 || true
712
713 # Enable layering (and some other features)
714 rbd info test1 | grep 'features: .*layering' && exit 1 || true
715 rbd migration prepare test1 --image-feature \
716 layering,exclusive-lock,object-map,fast-diff,deep-flatten
717 rbd info test1 | grep 'features: .*layering'
718 rbd migration execute test1
719 rbd migration commit test1
720
721 # Migration to other pool
722 rbd migration prepare test1 rbd2/test1
723 test "$(get_migration_state rbd2/test1)" = prepared
724 rbd ls | wc -l | grep '^0$'
725 rbd -p rbd2 ls | grep test1
726 rbd migration execute test1
727 test "$(get_migration_state rbd2/test1)" = executed
728 rbd rm rbd2/test1 && exit 1 || true
729 rbd migration commit test1
730
731 # Migration to other namespace
732 rbd namespace create rbd2/ns1
733 rbd namespace create rbd2/ns2
734 rbd migration prepare rbd2/test1 rbd2/ns1/test1
735 test "$(get_migration_state rbd2/ns1/test1)" = prepared
736 rbd migration execute rbd2/test1
737 test "$(get_migration_state rbd2/ns1/test1)" = executed
738 rbd migration commit rbd2/test1
739 rbd migration prepare rbd2/ns1/test1 rbd2/ns2/test1
740 rbd migration execute rbd2/ns2/test1
741 rbd migration commit rbd2/ns2/test1
742
743 # Enable data pool
744 rbd create -s 128M test1
745 rbd migration prepare test1 --data-pool rbd2
746 rbd info test1 | grep 'data_pool: rbd2'
747 rbd migration execute test1
748 rbd migration commit test1
749
750 # testing trash
751 rbd migration prepare test1
752 expect_fail rbd trash mv test1
753 ID=`rbd trash ls -a | cut -d ' ' -f 1`
754 expect_fail rbd trash rm $ID
755 expect_fail rbd trash restore $ID
756 rbd migration abort test1
757
758 # Migrate parent
759 rbd remove test1
760 dd if=/dev/urandom bs=1M count=1 | rbd --image-format 2 import - test1
761 md5sum=$(rbd export test1 - | md5sum)
762 rbd snap create test1@snap1
763 rbd snap protect test1@snap1
764 rbd snap create test1@snap2
765 rbd clone test1@snap1 clone_v1 --rbd_default_clone_format=1
766 rbd clone test1@snap2 clone_v2 --rbd_default_clone_format=2
767 rbd info clone_v1 | fgrep 'parent: rbd/test1@snap1'
768 rbd info clone_v2 | fgrep 'parent: rbd/test1@snap2'
769 rbd info clone_v2 |grep 'op_features: clone-child'
770 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
771 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
772 test "$(rbd children test1@snap1)" = "rbd/clone_v1"
773 test "$(rbd children test1@snap2)" = "rbd/clone_v2"
774 rbd migration prepare test1 rbd2/test2
775 rbd info clone_v1 | fgrep 'parent: rbd2/test2@snap1'
776 rbd info clone_v2 | fgrep 'parent: rbd2/test2@snap2'
777 rbd info clone_v2 | fgrep 'op_features: clone-child'
778 test "$(rbd children rbd2/test2@snap1)" = "rbd/clone_v1"
779 test "$(rbd children rbd2/test2@snap2)" = "rbd/clone_v2"
780 rbd migration execute test1
781 expect_fail rbd migration commit test1
782 rbd migration commit test1 --force
783 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
784 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
785 rbd migration prepare rbd2/test2 test1
786 rbd info clone_v1 | fgrep 'parent: rbd/test1@snap1'
787 rbd info clone_v2 | fgrep 'parent: rbd/test1@snap2'
788 rbd info clone_v2 | fgrep 'op_features: clone-child'
789 test "$(rbd children test1@snap1)" = "rbd/clone_v1"
790 test "$(rbd children test1@snap2)" = "rbd/clone_v2"
791 rbd migration execute test1
792 expect_fail rbd migration commit test1
793 rbd migration commit test1 --force
794 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
795 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
796 rbd remove clone_v1
797 rbd remove clone_v2
798 rbd snap unprotect test1@snap1
799 rbd snap purge test1
800 rbd rm test1
801
802 for format in 1 2; do
803 # Abort migration after successful prepare
804 rbd create -s 128M --image-format ${format} test2
805 rbd migration prepare test2 --data-pool rbd2
806 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
807 rbd migration abort test2
808 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
809 rbd rm test2
810
811 # Abort migration after successful execute
812 rbd create -s 128M --image-format ${format} test2
813 rbd migration prepare test2 --data-pool rbd2
814 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
815 rbd migration execute test2
816 rbd migration abort test2
817 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
818 rbd rm test2
819
820 # Migration is automatically aborted if prepare failed
821 rbd create -s 128M --image-format ${format} test2
822 rbd migration prepare test2 --data-pool INVALID_DATA_POOL && exit 1 || true
823 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
824 rbd rm test2
825
826 # Abort migration to other pool
827 rbd create -s 128M --image-format ${format} test2
828 rbd migration prepare test2 rbd2/test2
829 rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/test2
830 rbd migration abort test2
831 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
832 rbd rm test2
833
834 # The same but abort using destination image
835 rbd create -s 128M --image-format ${format} test2
836 rbd migration prepare test2 rbd2/test2
837 rbd migration abort rbd2/test2
838 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
839 rbd rm test2
840
841 test $format = 1 && continue
842
843 # Abort migration to other namespace
844 rbd create -s 128M --image-format ${format} test2
845 rbd migration prepare test2 rbd2/ns1/test3
846 rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/ns1/test3
847 rbd migration abort test2
848 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
849 rbd rm test2
850 done
851
852 remove_images
853 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
854 }
855
856 test_config() {
857 echo "testing config..."
858 remove_images
859
860 expect_fail rbd config global set osd rbd_cache true
861 expect_fail rbd config global set global debug_ms 10
862 expect_fail rbd config global set global rbd_UNKNOWN false
863 expect_fail rbd config global set global rbd_cache INVALID
864 rbd config global set global rbd_cache false
865 rbd config global set client rbd_cache true
866 rbd config global set client.123 rbd_cache false
867 rbd config global get global rbd_cache | grep '^false$'
868 rbd config global get client rbd_cache | grep '^true$'
869 rbd config global get client.123 rbd_cache | grep '^false$'
870 expect_fail rbd config global get client.UNKNOWN rbd_cache
871 rbd config global list global | grep '^rbd_cache * false * global *$'
872 rbd config global list client | grep '^rbd_cache * true * client *$'
873 rbd config global list client.123 | grep '^rbd_cache * false * client.123 *$'
874 rbd config global list client.UNKNOWN | grep '^rbd_cache * true * client *$'
875 rbd config global rm client rbd_cache
876 expect_fail rbd config global get client rbd_cache
877 rbd config global list client | grep '^rbd_cache * false * global *$'
878 rbd config global rm client.123 rbd_cache
879 rbd config global rm global rbd_cache
880
881 rbd config pool set rbd rbd_cache true
882 rbd config pool list rbd | grep '^rbd_cache * true * pool *$'
883 rbd config pool get rbd rbd_cache | grep '^true$'
884
885 rbd create $RBD_CREATE_ARGS -s 1 test1
886
887 rbd config image list rbd/test1 | grep '^rbd_cache * true * pool *$'
888 rbd config image set rbd/test1 rbd_cache false
889 rbd config image list rbd/test1 | grep '^rbd_cache * false * image *$'
890 rbd config image get rbd/test1 rbd_cache | grep '^false$'
891 rbd config image remove rbd/test1 rbd_cache
892 expect_fail rbd config image get rbd/test1 rbd_cache
893 rbd config image list rbd/test1 | grep '^rbd_cache * true * pool *$'
894
895 rbd config pool remove rbd rbd_cache
896 expect_fail rbd config pool get rbd rbd_cache
897 rbd config pool list rbd | grep '^rbd_cache * true * config *$'
898
899 rbd rm test1
900 }
901
902 test_pool_image_args
903 test_rename
904 test_ls
905 test_remove
906 test_migration
907 test_config
908 RBD_CREATE_ARGS=""
909 test_others
910 test_locking
911 test_thick_provision
912 RBD_CREATE_ARGS="--image-format 2"
913 test_others
914 test_locking
915 test_clone
916 test_trash
917 test_purge
918 test_deep_copy_clone
919 test_clone_v2
920 test_thick_provision
921 test_namespace
922
923 echo OK