]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/cli_generic.sh
e363109c28a8dba9a7ad234b543e96eea1865a4a
[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 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
585 rbd snap rm test1@1
586 rbd snap rm test1@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
590 rbd rm test2
591 rbd trash ls -a | grep test1
592 rbd rm test3
593 rbd trash ls -a | expect_fail grep test1
594 }
595
596 test_thick_provision() {
597 echo "testing thick provision..."
598 remove_images
599
600 # Try to create small and large thick-pro image and
601 # check actual size. (64M and 4G)
602
603 # Small thick-pro image test
604 rbd create $RBD_CREATE_ARGS --thick-provision -s 64M test1
605 count=0
606 ret=""
607 while [ $count -lt 10 ]
608 do
609 rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^64 MiB' && ret=$?
610 if [ "$ret" = "0" ]
611 then
612 break;
613 fi
614 count=`expr $count + 1`
615 sleep 2
616 done
617 rbd du
618 if [ "$ret" != "0" ]
619 then
620 exit 1
621 fi
622 rbd rm test1
623 rbd ls | grep test1 | wc -l | grep '^0$'
624
625 # Large thick-pro image test
626 rbd create $RBD_CREATE_ARGS --thick-provision -s 4G test1
627 count=0
628 ret=""
629 while [ $count -lt 10 ]
630 do
631 rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^4 GiB' && ret=$?
632 if [ "$ret" = "0" ]
633 then
634 break;
635 fi
636 count=`expr $count + 1`
637 sleep 2
638 done
639 rbd du
640 if [ "$ret" != "0" ]
641 then
642 exit 1
643 fi
644 rbd rm test1
645 rbd ls | grep test1 | wc -l | grep '^0$'
646 }
647
648 test_namespace() {
649 echo "testing namespace..."
650 remove_images
651
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
657
658 rbd namespace list | grep 'test' | wc -l | grep '^3$'
659
660 expect_fail rbd namespace remove --pool rbd missing
661
662 rbd create $RBD_CREATE_ARGS --size 1G rbd/test1/image1
663
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
671
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
681 rbd rm rbd/image2
682
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
692
693 rbd create $RBD_CREATE_ARGS --size 1G --namespace test1 image2
694 expect_fail rbd namespace remove rbd/test1
695
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
699
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}
703
704 rbd remove rbd/test1/image2
705
706 rbd namespace remove --pool rbd --namespace test1
707 rbd namespace remove --namespace test3
708
709 rbd namespace list | grep 'test' | wc -l | grep '^1$'
710 rbd namespace remove rbd/test2
711 }
712
713 get_migration_state() {
714 local image=$1
715
716 rbd --format xml status $image |
717 $XMLSTARLET sel -t -v '//status/migration/state'
718 }
719
720 test_migration() {
721 echo "testing migration..."
722 remove_images
723 ceph osd pool create rbd2 8
724 rbd pool init rbd2
725
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
737
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
745
746 # Migration to other pool
747 rbd migration prepare test1 rbd2/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 rbd2/test1 && exit 1 || true
754 rbd migration commit test1
755
756 # Migration to other namespace
757 rbd namespace create rbd2/ns1
758 rbd namespace create rbd2/ns2
759 rbd migration prepare rbd2/test1 rbd2/ns1/test1
760 test "$(get_migration_state rbd2/ns1/test1)" = prepared
761 rbd migration execute rbd2/test1
762 test "$(get_migration_state rbd2/ns1/test1)" = executed
763 rbd migration commit rbd2/test1
764 rbd migration prepare rbd2/ns1/test1 rbd2/ns2/test1
765 rbd migration execute rbd2/ns2/test1
766 rbd migration commit rbd2/ns2/test1
767
768 # Enable data pool
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
774
775 # testing trash
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
782
783 # Migrate parent
784 rbd remove 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 rbd2/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 rbd2/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}"
821 rbd remove clone_v1
822 rbd remove clone_v2
823 rbd snap unprotect test1@snap1
824 rbd snap purge test1
825 rbd rm test1
826
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
834 rbd rm test2
835
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
843 rbd rm test2
844
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
849 rbd rm test2
850
851 # Abort migration to other pool
852 rbd create -s 128M --image-format ${format} test2
853 rbd migration prepare test2 rbd2/test2
854 rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/test2
855 rbd migration abort test2
856 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
857 rbd rm test2
858
859 # The same but abort using destination image
860 rbd create -s 128M --image-format ${format} test2
861 rbd migration prepare test2 rbd2/test2
862 rbd migration abort rbd2/test2
863 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
864 rbd rm test2
865
866 test $format = 1 && continue
867
868 # Abort migration to other namespace
869 rbd create -s 128M --image-format ${format} test2
870 rbd migration prepare test2 rbd2/ns1/test3
871 rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/ns1/test3
872 rbd migration abort test2
873 rbd bench --io-type write --io-size 1024 --io-total 1024 test2
874 rbd rm test2
875 done
876
877 remove_images
878 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
879 }
880
881 test_config() {
882 echo "testing config..."
883 remove_images
884
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
905
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$'
909
910 rbd create $RBD_CREATE_ARGS -s 1 test1
911
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 *$'
919
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 *$'
923
924 rbd rm test1
925 }
926
927 test_trash_purge_schedule() {
928 echo "testing trash purge schedule..."
929 remove_images
930 ceph osd pool create rbd2 8
931 rbd pool init rbd2
932 rbd namespace create rbd2/ns1
933
934 expect_fail rbd trash purge schedule ls
935 test "$(rbd trash purge schedule ls -R --format json)" = "[]"
936
937 rbd trash purge schedule add -p rbd 1d 01:30
938
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)" = "[]"
945
946 rbd trash purge schedule add -p rbd2/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 rbd2/ns1
950 test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" = "[]"
951
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
955 sleep 10
956 done
957 rbd trash purge schedule status
958 test "$(rbd trash purge schedule status --format xml |
959 $XMLSTARLET sel -t -v '//scheduled/item/pool')" = 'rbd'
960
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 rbd2/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"
973
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
977 sleep 10
978 done
979 rbd trash purge schedule status
980 rbd trash purge schedule status --format xml |
981 $XMLSTARLET sel -t -v '//scheduled/item/pool' | grep 'rbd2'
982
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"
985
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'
989
990 rbd trash purge schedule ls -R --format xml |
991 $XMLSTARLET sel -t -v '//schedules/schedule/items' | grep '2d00:17'
992
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
997
998 for p in rbd2 rbd2/ns1; do
999 rbd create $RBD_CREATE_ARGS -s 1 rbd2/ns1/test1
1000 rbd trash mv rbd2/ns1/test1
1001 rbd trash ls rbd2/ns1 | wc -l | grep '^1$'
1002
1003 rbd trash purge schedule add -p $p 1m
1004 rbd trash purge schedule list -p rbd2/ns1 -R | grep 'every 1m'
1005
1006 for i in `seq 12`; do
1007 rbd trash ls rbd2/ns1 | wc -l | grep '^1$' || break
1008 sleep 10
1009 done
1010 rbd trash ls rbd2/ns1 | wc -l | grep '^0$'
1011
1012 rbd trash purge schedule status | grep 'rbd2 *ns1'
1013 rbd trash purge schedule rm -p $p 1m
1014 done
1015
1016 rbd trash purge schedule remove -p rbd 1d 01:30
1017 test "$(rbd trash purge schedule ls -R --format json)" = "[]"
1018
1019 remove_images
1020 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
1021 }
1022
1023 test_mirror_snapshot_schedule() {
1024 echo "testing mirror snapshot schedule..."
1025 remove_images
1026 ceph osd pool create rbd2 8
1027 rbd pool init rbd2
1028 rbd namespace create rbd2/ns1
1029
1030 rbd mirror pool enable rbd2 image
1031 rbd mirror pool enable rbd2/ns1 image
1032 rbd mirror pool peer add rbd2 cluster1
1033
1034 expect_fail rbd mirror snapshot schedule ls
1035 test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]"
1036
1037 rbd create $RBD_CREATE_ARGS -s 1 rbd2/ns1/test1
1038
1039 test "$(rbd mirror image status rbd2/ns1/test1 |
1040 grep -c mirror.primary)" = '0'
1041
1042 rbd mirror image enable rbd2/ns1/test1 snapshot
1043
1044 test "$(rbd mirror image status rbd2/ns1/test1 |
1045 grep -c mirror.primary)" = '1'
1046
1047 rbd mirror snapshot schedule add --image rbd2/ns1/test1 1m
1048 test "$(rbd mirror snapshot schedule ls --image rbd2/ns1/test1)" = 'every 1m'
1049
1050 for i in `seq 12`; do
1051 test "$(rbd mirror image status rbd2/ns1/test1 |
1052 grep -c mirror.primary)" -gt '1' && break
1053 sleep 10
1054 done
1055
1056 test "$(rbd mirror image status rbd2/ns1/test1 |
1057 grep -c mirror.primary)" -gt '1'
1058
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'
1061
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'
1065
1066 rbd mirror snapshot schedule add 1h 00:15
1067 test "$(rbd mirror snapshot schedule ls)" = 'every 1h starting at 00:15:00'
1068
1069 rbd rm rbd2/ns1/test1
1070
1071 for i in `seq 12`; do
1072 rbd mirror snapshot schedule status | grep 'rbd2/ns1/test1' || break
1073 sleep 10
1074 done
1075
1076 rbd mirror snapshot schedule remove
1077 test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]"
1078
1079 remove_images
1080 ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it
1081 }
1082
1083 test_pool_image_args
1084 test_rename
1085 test_ls
1086 test_remove
1087 test_migration
1088 test_config
1089 RBD_CREATE_ARGS=""
1090 test_others
1091 test_locking
1092 test_thick_provision
1093 RBD_CREATE_ARGS="--image-format 2"
1094 test_others
1095 test_locking
1096 test_clone
1097 test_trash
1098 test_purge
1099 test_deep_copy_clone
1100 test_clone_v2
1101 test_thick_provision
1102 test_namespace
1103 test_trash_purge_schedule
1104 test_mirror_snapshot_schedule
1105
1106 echo OK