4 . $
(dirname $0)/..
/..
/standalone
/ceph-helpers.sh
6 export RBD_FORCE_ALLOW_V1
=1
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
11 IMGS
="testimg1 testimg2 testimg3 testimg4 testimg5 testimg6 testimg-diff1 testimg-diff2 testimg-diff3 foo foo2 bar bar2 test1 test2 test3 test4 clone2"
14 "$@" && return 1 ||
return 0
18 if ceph osd dump |
grep ^pool |
grep "'rbd'" |
grep tier
; then
25 (rbd snap purge
$img || true
) >/dev
/null
2>&1
26 (rbd
rm $img || true
) >/dev
/null
2>&1
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"
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
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
54 rbd info testimg1 |
grep 'size 128 MiB'
55 rbd info
--snap=snap1 testimg1 |
grep 'size 256 MiB'
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
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
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'
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
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'
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.*'
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
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
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
115 # test create, copy of zero-length images
118 rbd create testimg2
-s 0
119 rbd
cp testimg2 testimg3
120 rbd deep
cp testimg2 testimg6
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'
129 rbd sparsify testimg1
136 echo "testing rename..."
139 rbd create
--image-format 1 -s 1 foo
140 rbd create
--image-format 2 -s 1 bar
142 rbd rename foo2 bar
2>&1 |
grep exists
144 rbd rename bar2 foo2
2>&1 |
grep exists
146 ceph osd pool create rbd2
8
148 rbd create
-p rbd2
-s 1 foo
149 rbd rename rbd
2/foo rbd
2/bar
150 rbd
-p rbd2
ls |
grep bar
151 rbd rename rbd
2/bar foo
152 rbd rename
--pool rbd2 foo bar
153 ! rbd rename rbd
2/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
165 rbd create
--image-format 1 -s 1 test1
166 rbd create
--image-format 1 -s 1 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'
177 rbd create
--image-format 2 -s 1 test1
178 rbd create
--image-format 2 -s 1 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'
188 rbd create
--image-format 2 -s 1 test1
189 rbd create
--image-format 1 -s 1 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'
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
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
207 for i
in $
(seq -w 00 99); do
208 rbd create image.
$i --image-format 2 -s 1
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
218 echo "testing remove..."
221 rbd remove
"NOT_EXIST" && exit 1 || true
# remove should fail
222 rbd create
--image-format 1 -s 1 test1
224 rbd
ls |
wc -l |
grep "^0$"
226 rbd create
--image-format 2 -s 1 test2
228 rbd
ls |
wc -l |
grep "^0$"
230 # check that remove succeeds even if it's
231 # interrupted partway through. simulate this
232 # by removing some objects manually.
234 # remove with header missing (old format)
235 rbd create
--image-format 1 -s 1 test1
236 rados
rm -p rbd test1.rbd
238 rbd
ls |
wc -l |
grep "^0$"
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
246 rbd
ls |
wc -l |
grep "^0$"
248 # remove with id missing
249 rbd create
--image-format 2 -s 1 test2
250 rados
-p rbd
rm rbd_id.test2
252 rbd
ls |
wc -l |
grep "^0$"
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
260 rbd
ls |
wc -l |
grep "^0$"
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
270 rados
-p rbd
rm rbd_children
272 rbd
ls |
grep clone |
wc -l |
grep '^0$'
274 rbd snap unprotect test2@snap
275 rbd snap
rm test2@snap
280 echo "testing locking..."
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$'
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"
300 # new locking functionality requires all locks to be released
301 while [ -n "$(rbd lock list test1)" ]
303 rbd lock list test1 |
tail -n 1 |
awk '{print $2, $1;}' |
xargs rbd lock remove test1
309 test_pool_image_args
() {
310 echo "testing pool and image args..."
313 ceph osd pool delete
test test --yes-i-really-really-mean-it || true
314 ceph osd pool create
test 32
316 truncate
-s 1 /tmp
/empty
/tmp
/empty@snap
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
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
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
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
366 rbd
ls test |
grep -qv test12
368 rm -f /tmp
/empty
/tmp
/empty@snap
369 ceph osd pool delete
test test --yes-i-really-really-mean-it
371 for f
in foo test1 test10 test12 test2 test3
; do
377 echo "testing clone..."
379 rbd create test1
$RBD_CREATE_ARGS -s 1
380 rbd snap create test1@s1
381 rbd snap protect test1@s1
383 ceph osd pool create rbd2
8
385 rbd clone test1@s1 rbd
2/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 rbd
2/clone
390 rbd snap create rbd
2/clone@s1
391 rbd snap protect rbd
2/clone@s1
392 rbd clone rbd
2/clone@s1 clone2
394 rbd
ls -l |
grep clone2 |
grep rbd
2/clone@s1
395 rbd
-p rbd2
ls |
grep -v clone2
398 rbd snap unprotect rbd
2/clone@s1
399 rbd snap
rm rbd
2/clone@s1
401 rbd snap unprotect test1@s1
404 ceph osd pool
rm rbd2 rbd2
--yes-i-really-really-mean-it
408 echo "testing trash..."
411 rbd create
$RBD_CREATE_ARGS -s 1 test1
412 rbd create
$RBD_CREATE_ARGS -s 1 test2
415 rbd
ls |
wc -l |
grep 2
416 rbd
ls -l |
grep 'test1.*2.*'
417 rbd
ls -l |
grep 'test2.*2.*'
421 rbd
ls |
wc -l |
grep 1
422 rbd
ls -l |
grep 'test2.*2.*'
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'
429 ID
=`rbd trash ls | cut -d ' ' -f 1`
433 ID
=`rbd trash ls | cut -d ' ' -f 1`
434 rbd info
--image-id $ID |
grep "rbd image 'test2'"
436 rbd trash restore
$ID
438 rbd
ls |
wc -l |
grep 1
439 rbd
ls -l |
grep 'test2.*2.*'
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'
446 rbd trash
rm $ID 2>&1 |
grep 'Deferment time has not expired'
447 rbd trash
rm --image-id $ID --force
449 rbd create
$RBD_CREATE_ARGS -s 1 test1
450 rbd snap create test1@snap1
451 rbd snap protect test1@snap1
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'
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.*'
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
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
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
485 echo "testing trash purge..."
489 rbd trash
ls |
wc -l |
grep 0
491 rbd create
$RBD_CREATE_ARGS foo
-s 1
492 rbd create
$RBD_CREATE_ARGS bar
-s 1
494 rbd trash
mv foo
--expires-at "10 sec"
495 rbd trash
mv bar
--expires-at "30 sec"
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
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
505 test_deep_copy_clone
() {
506 echo "testing deep copy clone..."
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
523 rbd snap unprotect testimg1@snap1
524 rbd snap purge testimg2
525 rbd snap purge testimg3
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
539 rbd snap unprotect testimg1@snap1
545 echo "testing clone v2..."
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
554 rbd snap protect test1@
1
555 rbd clone
--rbd-default-clone-format=1 test1@
1 test4
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"
561 rbd snap unprotect test1@
1
563 rbd snap remove test1@
1
564 rbd snap list
--all test1 |
grep -E "trash \(1\) *$"
566 rbd snap create test1@
2
567 rbd
rm test1
2>&1 |
grep 'image has snapshots'
570 rbd
rm test1
2>&1 |
grep 'linked clones'
573 rbd
rm test1
2>&1 |
grep 'linked clones'
576 rbd snap list
--all test1 |
wc -l |
grep '^0$'
580 rbd create
$RBD_CREATE_ARGS -s 1 test1
581 rbd snap create test1@
1
582 rbd snap create test1@
2
583 rbd clone test1@
1 test2
--rbd-default-clone-format 2
584 rbd clone test1@
2 test3
--rbd-default-clone-format 2
587 expect_fail rbd
rm test1
588 rbd
rm test1
--rbd-move-parent-to-trash-on-remove=true
589 rbd trash
ls -a |
grep test1
591 rbd trash
ls -a |
grep test1
593 rbd trash
ls -a | expect_fail
grep test1
596 test_thick_provision
() {
597 echo "testing thick provision..."
600 # Try to create small and large thick-pro image and
601 # check actual size. (64M and 4G)
603 # Small thick-pro image test
604 rbd create
$RBD_CREATE_ARGS --thick-provision -s 64M test1
607 while [ $count -lt 10 ]
609 rbd du|
grep test1|
tr -s " "|cut
-d " " -f 4-5|
grep '^64 MiB' && ret
=$?
614 count
=`expr $count + 1`
623 rbd
ls |
grep test1 |
wc -l |
grep '^0$'
625 # Large thick-pro image test
626 rbd create
$RBD_CREATE_ARGS --thick-provision -s 4G test1
629 while [ $count -lt 10 ]
631 rbd du|
grep test1|
tr -s " "|cut
-d " " -f 4-5|
grep '^4 GiB' && ret
=$?
636 count
=`expr $count + 1`
645 rbd
ls |
grep test1 |
wc -l |
grep '^0$'
649 echo "testing namespace..."
652 rbd namespace
ls |
wc -l |
grep '^0$'
653 rbd namespace create rbd
/test1
654 rbd namespace create
--pool rbd
--namespace test2
655 rbd namespace create
--namespace test3
656 expect_fail rbd namespace create rbd
/test3
658 rbd namespace list |
grep 'test' |
wc -l |
grep '^3$'
660 expect_fail rbd namespace remove
--pool rbd missing
662 rbd create
$RBD_CREATE_ARGS --size 1G rbd
/test1/image1
664 # default test1 ns to test2 ns clone
665 rbd bench
--io-type write --io-pattern rand
--io-total 32M
--io-size 4K rbd
/test1/image1
666 rbd snap create rbd
/test1/image1@
1
667 rbd clone
--rbd-default-clone-format 2 rbd
/test1/image1@
1 rbd
/test2/image1
668 rbd snap
rm rbd
/test1/image1@
1
669 cmp <(rbd
export rbd
/test1/image1
-) <(rbd
export rbd
/test2/image1
-)
670 rbd
rm rbd
/test2/image1
672 # default ns to test1 ns clone
673 rbd create
$RBD_CREATE_ARGS --size 1G rbd
/image2
674 rbd bench
--io-type write --io-pattern rand
--io-total 32M
--io-size 4K rbd
/image2
675 rbd snap create rbd
/image2@
1
676 rbd clone
--rbd-default-clone-format 2 rbd
/image2@
1 rbd
/test2/image2
677 rbd snap
rm rbd
/image2@
1
678 cmp <(rbd
export rbd
/image2
-) <(rbd
export rbd
/test2/image2
-)
679 expect_fail rbd
rm rbd
/image2
680 rbd
rm rbd
/test2/image2
683 # v1 clones are supported within the same namespace
684 rbd create
$RBD_CREATE_ARGS --size 1G rbd
/test1/image3
685 rbd snap create rbd
/test1/image3@
1
686 rbd snap protect rbd
/test1/image3@
1
687 rbd clone
--rbd-default-clone-format 1 rbd
/test1/image3@
1 rbd
/test1/image4
688 rbd
rm rbd
/test1/image4
689 rbd snap unprotect rbd
/test1/image3@
1
690 rbd snap
rm rbd
/test1/image3@
1
691 rbd
rm rbd
/test1/image3
693 rbd create
$RBD_CREATE_ARGS --size 1G
--namespace test1 image2
694 expect_fail rbd namespace remove rbd
/test1
696 rbd group create rbd
/test1/group1
697 rbd group image add rbd
/test1/group1 rbd
/test1/image1
698 rbd group
rm rbd
/test1/group1
700 rbd trash move rbd
/test1/image1
701 ID
=`rbd trash --namespace test1 ls | cut -d ' ' -f 1`
702 rbd trash
rm rbd
/test1/${ID}
704 rbd remove rbd
/test1/image2
706 rbd namespace remove
--pool rbd
--namespace test1
707 rbd namespace remove
--namespace test3
709 rbd namespace list |
grep 'test' |
wc -l |
grep '^1$'
710 rbd namespace remove rbd
/test2
713 get_migration_state
() {
716 rbd
--format xml status
$image |
717 $XMLSTARLET sel
-t -v '//status/migration/state'
721 echo "testing migration..."
723 ceph osd pool create rbd2
8
726 # Convert to new format
727 rbd create
--image-format 1 -s 128M test1
728 rbd info test1 |
grep 'format: 1'
729 rbd migration prepare test1
--image-format 2
730 test "$(get_migration_state test1)" = prepared
731 rbd info test1 |
grep 'format: 2'
732 rbd
rm test1
&& exit 1 || true
733 rbd migration execute test1
734 test "$(get_migration_state test1)" = executed
735 rbd migration commit test1
736 get_migration_state test1
&& exit 1 || true
738 # Enable layering (and some other features)
739 rbd info test1 |
grep 'features: .*layering' && exit 1 || true
740 rbd migration prepare test1
--image-feature \
741 layering
,exclusive-lock
,object-map
,fast-diff
,deep-flatten
742 rbd info test1 |
grep 'features: .*layering'
743 rbd migration execute test1
744 rbd migration commit test1
746 # Migration to other pool
747 rbd migration prepare test1 rbd
2/test1
748 test "$(get_migration_state rbd2/test1)" = prepared
749 rbd
ls |
wc -l |
grep '^0$'
750 rbd
-p rbd2
ls |
grep test1
751 rbd migration execute test1
752 test "$(get_migration_state rbd2/test1)" = executed
753 rbd
rm rbd
2/test1
&& exit 1 || true
754 rbd migration commit test1
756 # Migration to other namespace
757 rbd namespace create rbd
2/ns1
758 rbd namespace create rbd
2/ns2
759 rbd migration prepare rbd
2/test1 rbd
2/ns
1/test1
760 test "$(get_migration_state rbd2/ns1/test1)" = prepared
761 rbd migration execute rbd
2/test1
762 test "$(get_migration_state rbd2/ns1/test1)" = executed
763 rbd migration commit rbd
2/test1
764 rbd migration prepare rbd
2/ns
1/test1 rbd
2/ns
2/test1
765 rbd migration execute rbd
2/ns
2/test1
766 rbd migration commit rbd
2/ns
2/test1
769 rbd create
-s 128M test1
770 rbd migration prepare test1
--data-pool rbd2
771 rbd info test1 |
grep 'data_pool: rbd2'
772 rbd migration execute test1
773 rbd migration commit test1
776 rbd migration prepare test1
777 expect_fail rbd trash
mv test1
778 ID
=`rbd trash ls -a | cut -d ' ' -f 1`
779 expect_fail rbd trash
rm $ID
780 expect_fail rbd trash restore
$ID
781 rbd migration abort test1
785 dd if=/dev
/urandom bs
=1M count
=1 | rbd
--image-format 2 import
- test1
786 md5sum=$
(rbd
export test1
- |
md5sum)
787 rbd snap create test1@snap1
788 rbd snap protect test1@snap1
789 rbd snap create test1@snap2
790 rbd clone test1@snap1 clone_v1
--rbd_default_clone_format=1
791 rbd clone test1@snap2 clone_v2
--rbd_default_clone_format=2
792 rbd info clone_v1 | fgrep
'parent: rbd/test1@snap1'
793 rbd info clone_v2 | fgrep
'parent: rbd/test1@snap2'
794 rbd info clone_v2 |
grep 'op_features: clone-child'
795 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
796 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
797 test "$(rbd children test1@snap1)" = "rbd/clone_v1"
798 test "$(rbd children test1@snap2)" = "rbd/clone_v2"
799 rbd migration prepare test1 rbd
2/test2
800 rbd info clone_v1 | fgrep
'parent: rbd2/test2@snap1'
801 rbd info clone_v2 | fgrep
'parent: rbd2/test2@snap2'
802 rbd info clone_v2 | fgrep
'op_features: clone-child'
803 test "$(rbd children rbd2/test2@snap1)" = "rbd/clone_v1"
804 test "$(rbd children rbd2/test2@snap2)" = "rbd/clone_v2"
805 rbd migration execute test1
806 expect_fail rbd migration commit test1
807 rbd migration commit test1
--force
808 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
809 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
810 rbd migration prepare rbd
2/test2 test1
811 rbd info clone_v1 | fgrep
'parent: rbd/test1@snap1'
812 rbd info clone_v2 | fgrep
'parent: rbd/test1@snap2'
813 rbd info clone_v2 | fgrep
'op_features: clone-child'
814 test "$(rbd children test1@snap1)" = "rbd/clone_v1"
815 test "$(rbd children test1@snap2)" = "rbd/clone_v2"
816 rbd migration execute test1
817 expect_fail rbd migration commit test1
818 rbd migration commit test1
--force
819 test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}"
820 test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}"
823 rbd snap unprotect test1@snap1
827 for format
in 1 2; do
828 # Abort migration after successful prepare
829 rbd create
-s 128M
--image-format ${format} test2
830 rbd migration prepare test2
--data-pool rbd2
831 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
832 rbd migration abort test2
833 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
836 # Abort migration after successful execute
837 rbd create
-s 128M
--image-format ${format} test2
838 rbd migration prepare test2
--data-pool rbd2
839 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
840 rbd migration execute test2
841 rbd migration abort test2
842 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
845 # Migration is automatically aborted if prepare failed
846 rbd create
-s 128M
--image-format ${format} test2
847 rbd migration prepare test2
--data-pool INVALID_DATA_POOL
&& exit 1 || true
848 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
851 # Abort migration to other pool
852 rbd create
-s 128M
--image-format ${format} test2
853 rbd migration prepare test2 rbd
2/test2
854 rbd bench
--io-type write --io-size 1024 --io-total 1024 rbd
2/test2
855 rbd migration abort test2
856 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
859 # The same but abort using destination image
860 rbd create
-s 128M
--image-format ${format} test2
861 rbd migration prepare test2 rbd
2/test2
862 rbd migration abort rbd
2/test2
863 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
866 test $format = 1 && continue
868 # Abort migration to other namespace
869 rbd create
-s 128M
--image-format ${format} test2
870 rbd migration prepare test2 rbd
2/ns
1/test3
871 rbd bench
--io-type write --io-size 1024 --io-total 1024 rbd
2/ns
1/test3
872 rbd migration abort test2
873 rbd bench
--io-type write --io-size 1024 --io-total 1024 test2
878 ceph osd pool
rm rbd2 rbd2
--yes-i-really-really-mean-it
882 echo "testing config..."
885 expect_fail rbd config global
set osd rbd_cache true
886 expect_fail rbd config global
set global debug_ms
10
887 expect_fail rbd config global
set global rbd_UNKNOWN false
888 expect_fail rbd config global
set global rbd_cache INVALID
889 rbd config global
set global rbd_cache false
890 rbd config global
set client rbd_cache true
891 rbd config global
set client
.123 rbd_cache false
892 rbd config global get global rbd_cache |
grep '^false$'
893 rbd config global get client rbd_cache |
grep '^true$'
894 rbd config global get client
.123 rbd_cache |
grep '^false$'
895 expect_fail rbd config global get client.UNKNOWN rbd_cache
896 rbd config global list global |
grep '^rbd_cache * false * global *$'
897 rbd config global list client |
grep '^rbd_cache * true * client *$'
898 rbd config global list client
.123 |
grep '^rbd_cache * false * client.123 *$'
899 rbd config global list client.UNKNOWN |
grep '^rbd_cache * true * client *$'
900 rbd config global
rm client rbd_cache
901 expect_fail rbd config global get client rbd_cache
902 rbd config global list client |
grep '^rbd_cache * false * global *$'
903 rbd config global
rm client
.123 rbd_cache
904 rbd config global
rm global rbd_cache
906 rbd config pool
set rbd rbd_cache true
907 rbd config pool list rbd |
grep '^rbd_cache * true * pool *$'
908 rbd config pool get rbd rbd_cache |
grep '^true$'
910 rbd create
$RBD_CREATE_ARGS -s 1 test1
912 rbd config image list rbd
/test1 |
grep '^rbd_cache * true * pool *$'
913 rbd config image
set rbd
/test1 rbd_cache false
914 rbd config image list rbd
/test1 |
grep '^rbd_cache * false * image *$'
915 rbd config image get rbd
/test1 rbd_cache |
grep '^false$'
916 rbd config image remove rbd
/test1 rbd_cache
917 expect_fail rbd config image get rbd
/test1 rbd_cache
918 rbd config image list rbd
/test1 |
grep '^rbd_cache * true * pool *$'
920 rbd config pool remove rbd rbd_cache
921 expect_fail rbd config pool get rbd rbd_cache
922 rbd config pool list rbd |
grep '^rbd_cache * true * config *$'
927 test_trash_purge_schedule
() {
928 echo "testing trash purge schedule..."
930 ceph osd pool create rbd2
8
932 rbd namespace create rbd
2/ns1
934 expect_fail rbd trash purge schedule
ls
935 test "$(rbd trash purge schedule ls -R --format json)" = "[]"
937 rbd trash purge schedule add
-p rbd
1d
01:30
939 rbd trash purge schedule
ls -p rbd |
grep 'every 1d starting at 01:30'
940 expect_fail rbd trash purge schedule
ls
941 rbd trash purge schedule
ls -R |
grep 'every 1d starting at 01:30'
942 rbd trash purge schedule
ls -R -p rbd |
grep 'every 1d starting at 01:30'
943 expect_fail rbd trash purge schedule
ls -p rbd2
944 test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" = "[]"
946 rbd trash purge schedule add
-p rbd
2/ns1
2d
947 test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" != "[]"
948 rbd trash purge schedule
ls -p rbd2
-R |
grep 'rbd2 *ns1 *every 2d'
949 rbd trash purge schedule
rm -p rbd
2/ns1
950 test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" = "[]"
952 for i
in `seq 12`; do
953 test "$(rbd trash purge schedule status --format xml |
954 $XMLSTARLET sel -t -v '//scheduled/item/pool')" = 'rbd' && break
957 rbd trash purge schedule status
958 test "$(rbd trash purge schedule status --format xml |
959 $XMLSTARLET sel -t -v '//scheduled/item/pool')" = 'rbd'
961 rbd trash purge schedule add
2d
00:17
962 rbd trash purge schedule
ls |
grep 'every 2d starting at 00:17'
963 rbd trash purge schedule
ls -R |
grep 'every 2d starting at 00:17'
964 expect_fail rbd trash purge schedule
ls -p rbd2
965 rbd trash purge schedule
ls -p rbd2
-R |
grep 'every 2d starting at 00:17'
966 rbd trash purge schedule
ls -p rbd
2/ns1
-R |
grep 'every 2d starting at 00:17'
967 test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml |
968 $XMLSTARLET sel -t -v '//schedules/schedule/pool')" = "-"
969 test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml |
970 $XMLSTARLET sel -t -v '//schedules/schedule/namespace')" = "-"
971 test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml |
972 $XMLSTARLET sel -t -v '//schedules/schedule/items/item/start_time')" = "00:17:00"
974 for i
in `seq 12`; do
975 rbd trash purge schedule status
--format xml |
976 $XMLSTARLET sel
-t -v '//scheduled/item/pool' |
grep 'rbd2' && break
979 rbd trash purge schedule status
980 rbd trash purge schedule status
--format xml |
981 $XMLSTARLET sel
-t -v '//scheduled/item/pool' |
grep 'rbd2'
983 test "$(echo $(rbd trash purge schedule ls -R --format xml |
984 $XMLSTARLET sel -t -v '//schedules/schedule/items'))" = "2d00:17:00 1d01:30:00"
986 rbd trash purge schedule add
1d
987 rbd trash purge schedule
ls |
grep 'every 2d starting at 00:17'
988 rbd trash purge schedule
ls |
grep 'every 1d'
990 rbd trash purge schedule
ls -R --format xml |
991 $XMLSTARLET sel
-t -v '//schedules/schedule/items' |
grep '2d00:17'
993 rbd trash purge schedule
rm 1d
994 rbd trash purge schedule
ls |
grep 'every 2d starting at 00:17'
995 rbd trash purge schedule
rm 2d
00:17
996 expect_fail rbd trash purge schedule
ls
998 for p
in rbd2 rbd
2/ns1
; do
999 rbd create
$RBD_CREATE_ARGS -s 1 rbd
2/ns
1/test1
1000 rbd trash
mv rbd
2/ns
1/test1
1001 rbd trash
ls rbd
2/ns1 |
wc -l |
grep '^1$'
1003 rbd trash purge schedule add
-p $p 1m
1004 rbd trash purge schedule list
-p rbd
2/ns1
-R |
grep 'every 1m'
1006 for i
in `seq 12`; do
1007 rbd trash
ls rbd
2/ns1 |
wc -l |
grep '^1$' ||
break
1010 rbd trash
ls rbd
2/ns1 |
wc -l |
grep '^0$'
1012 rbd trash purge schedule status |
grep 'rbd2 *ns1'
1013 rbd trash purge schedule
rm -p $p 1m
1016 rbd trash purge schedule remove
-p rbd
1d
01:30
1017 test "$(rbd trash purge schedule ls -R --format json)" = "[]"
1020 ceph osd pool
rm rbd2 rbd2
--yes-i-really-really-mean-it
1023 test_mirror_snapshot_schedule
() {
1024 echo "testing mirror snapshot schedule..."
1026 ceph osd pool create rbd2
8
1028 rbd namespace create rbd
2/ns1
1030 rbd mirror pool
enable rbd2 image
1031 rbd mirror pool
enable rbd
2/ns1 image
1032 rbd mirror pool peer add rbd2 cluster1
1034 expect_fail rbd mirror snapshot schedule
ls
1035 test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]"
1037 rbd create
$RBD_CREATE_ARGS -s 1 rbd
2/ns
1/test1
1039 test "$(rbd mirror image status rbd2/ns1/test1 |
1040 grep -c mirror.primary)" = '0'
1042 rbd mirror image
enable rbd
2/ns
1/test1 snapshot
1044 test "$(rbd mirror image status rbd2/ns1/test1 |
1045 grep -c mirror.primary)" = '1'
1047 rbd mirror snapshot schedule add
--image rbd
2/ns
1/test1
1m
1048 test "$(rbd mirror snapshot schedule ls --image rbd2/ns1/test1)" = 'every 1m'
1050 for i
in `seq 12`; do
1051 test "$(rbd mirror image status rbd2/ns1/test1 |
1052 grep -c mirror.primary)" -gt '1' && break
1056 test "$(rbd mirror image status rbd2/ns1/test1 |
1057 grep -c mirror.primary)" -gt '1'
1059 rbd mirror snapshot schedule
ls -R |
grep 'rbd2 *ns1 *test1 *every 1m'
1060 test "$(rbd mirror snapshot schedule ls -p rbd2/ns1 --image test1)" = 'every 1m'
1062 rbd mirror snapshot schedule status
1063 test "$(rbd mirror snapshot schedule status --format xml |
1064 $XMLSTARLET sel -t -v '//scheduled_images/image/image')" = 'rbd2/ns1/test1'
1066 rbd mirror snapshot schedule add
1h
00:15
1067 test "$(rbd mirror snapshot schedule ls)" = 'every 1h starting at 00:15:00'
1069 rbd
rm rbd
2/ns
1/test1
1071 for i
in `seq 12`; do
1072 rbd mirror snapshot schedule status |
grep 'rbd2/ns1/test1' ||
break
1076 rbd mirror snapshot schedule remove
1077 test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]"
1080 ceph osd pool
rm rbd2 rbd2
--yes-i-really-really-mean-it
1083 test_pool_image_args
1092 test_thick_provision
1093 RBD_CREATE_ARGS
="--image-format 2"
1099 test_deep_copy_clone
1101 test_thick_provision
1103 test_trash_purge_schedule
1104 test_mirror_snapshot_schedule