]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | #!/usr/bin/env bash |
2 | set -ex | |
3 | ||
4 | . $(dirname $0)/../../standalone/ceph-helpers.sh | |
5 | ||
6 | export RBD_FORCE_ALLOW_V1=1 | |
7c673cae FG |
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 | ||
11fdf7f2 TL |
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 | } | |
7c673cae FG |
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 | |
11fdf7f2 TL |
54 | rbd info testimg1 | grep 'size 128 MiB' |
55 | rbd info --snap=snap1 testimg1 | grep 'size 256 MiB' | |
7c673cae FG |
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 | |
11fdf7f2 TL |
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' | |
7c673cae FG |
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 | |
11fdf7f2 TL |
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.*' | |
7c673cae FG |
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 | |
11fdf7f2 TL |
108 | rbd info testimg1 | grep 'size 256 MiB' |
109 | rbd info testimg-diff1 | grep 'size 256 MiB' | |
7c673cae FG |
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 | |
11fdf7f2 | 120 | rbd deep cp testimg2 testimg6 |
7c673cae FG |
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 | ||
11fdf7f2 TL |
128 | # sparsify |
129 | rbd sparsify testimg1 | |
130 | ||
7c673cae FG |
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 | ||
11fdf7f2 | 146 | ceph osd pool create rbd2 8 |
d2e6a577 | 147 | rbd pool init rbd2 |
7c673cae FG |
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 | |
11fdf7f2 | 156 | ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it |
7c673cae FG |
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 | |
11fdf7f2 TL |
171 | rbd ls -l | grep 'test1.*1 MiB.*1' |
172 | rbd ls -l | grep 'test2.*1 MiB.*1' | |
7c673cae FG |
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 | |
11fdf7f2 TL |
182 | rbd ls -l | grep 'test1.*1 MiB.*2' |
183 | rbd ls -l | grep 'test2.*1 MiB.*2' | |
7c673cae FG |
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 | |
11fdf7f2 TL |
193 | rbd ls -l | grep 'test1.*1 MiB.*2' |
194 | rbd ls -l | grep 'test2.*1 MiB.*1' | |
7c673cae | 195 | remove_images |
11fdf7f2 | 196 | |
7c673cae FG |
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 | |
11fdf7f2 | 204 | rbd rm image.$i |
7c673cae FG |
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 | |
11fdf7f2 | 213 | rbd rm image.$i |
7c673cae FG |
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 | |
11fdf7f2 | 268 | rbd clone test2@snap clone --rbd-default-clone-format 1 |
7c673cae FG |
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 | ||
11fdf7f2 | 283 | rbd create $RBD_CREATE_ARGS -s 1 test1 |
7c673cae FG |
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 | |
11fdf7f2 | 314 | ceph osd pool create test 32 |
c07f9fc5 | 315 | rbd pool init test |
7c673cae FG |
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 | ||
11fdf7f2 | 383 | ceph osd pool create rbd2 8 |
d2e6a577 | 384 | rbd pool init rbd2 |
7c673cae FG |
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 | |
11fdf7f2 | 404 | ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it |
7c673cae FG |
405 | } |
406 | ||
407 | test_trash() { | |
408 | echo "testing trash..." | |
409 | remove_images | |
410 | ||
11fdf7f2 TL |
411 | rbd create $RBD_CREATE_ARGS -s 1 test1 |
412 | rbd create $RBD_CREATE_ARGS -s 1 test2 | |
7c673cae FG |
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` | |
11fdf7f2 | 434 | rbd info --image-id $ID | grep "rbd image 'test2'" |
7c673cae FG |
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 | ||
11fdf7f2 | 441 | rbd trash mv test2 --expires-at "3600 sec" |
7c673cae FG |
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 | ||
11fdf7f2 | 449 | rbd create $RBD_CREATE_ARGS -s 1 test1 |
7c673cae FG |
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 | ||
11fdf7f2 TL |
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 | ||
6d8e3169 FG |
488 | rbd trash ls | wc -l | grep 0 |
489 | rbd trash purge | |
490 | ||
491 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
492 | rbd create $RBD_CREATE_ARGS --size 256 testimg2 | |
493 | rbd trash mv testimg1 | |
494 | rbd trash mv testimg2 | |
495 | rbd trash ls | wc -l | grep 2 | |
496 | rbd trash purge | |
497 | rbd trash ls | wc -l | grep 0 | |
498 | ||
499 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
500 | rbd create $RBD_CREATE_ARGS --size 256 testimg2 | |
501 | rbd trash mv testimg1 --expires-at "1 hour" | |
502 | rbd trash mv testimg2 --expires-at "3 hours" | |
503 | rbd trash ls | wc -l | grep 2 | |
504 | rbd trash purge | |
505 | rbd trash ls | wc -l | grep 2 | |
506 | rbd trash purge --expired-before "now + 2 hours" | |
507 | rbd trash ls | wc -l | grep 1 | |
508 | rbd trash ls | grep testimg2 | |
509 | rbd trash purge --expired-before "now + 4 hours" | |
510 | rbd trash ls | wc -l | grep 0 | |
511 | ||
512 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
513 | rbd snap create testimg1@snap # pin testimg1 | |
514 | rbd create $RBD_CREATE_ARGS --size 256 testimg2 | |
515 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
516 | rbd trash mv testimg1 | |
517 | rbd trash mv testimg2 | |
518 | rbd trash mv testimg3 | |
519 | rbd trash ls | wc -l | grep 3 | |
520 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
521 | rbd trash ls | wc -l | grep 1 | |
522 | rbd trash ls | grep testimg1 | |
523 | ID=$(rbd trash ls | awk '{ print $1 }') | |
524 | rbd snap purge --image-id $ID | |
525 | rbd trash purge | |
526 | rbd trash ls | wc -l | grep 0 | |
527 | ||
528 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
529 | rbd create $RBD_CREATE_ARGS --size 256 testimg2 | |
530 | rbd snap create testimg2@snap # pin testimg2 | |
531 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
532 | rbd trash mv testimg1 | |
533 | rbd trash mv testimg2 | |
534 | rbd trash mv testimg3 | |
535 | rbd trash ls | wc -l | grep 3 | |
536 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
537 | rbd trash ls | wc -l | grep 1 | |
538 | rbd trash ls | grep testimg2 | |
539 | ID=$(rbd trash ls | awk '{ print $1 }') | |
540 | rbd snap purge --image-id $ID | |
11fdf7f2 TL |
541 | rbd trash purge |
542 | rbd trash ls | wc -l | grep 0 | |
543 | ||
6d8e3169 FG |
544 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 |
545 | rbd create $RBD_CREATE_ARGS --size 256 testimg2 | |
546 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
547 | rbd snap create testimg3@snap # pin testimg3 | |
548 | rbd trash mv testimg1 | |
549 | rbd trash mv testimg2 | |
550 | rbd trash mv testimg3 | |
551 | rbd trash ls | wc -l | grep 3 | |
552 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
553 | rbd trash ls | wc -l | grep 1 | |
554 | rbd trash ls | grep testimg3 | |
555 | ID=$(rbd trash ls | awk '{ print $1 }') | |
556 | rbd snap purge --image-id $ID | |
557 | rbd trash purge | |
558 | rbd trash ls | wc -l | grep 0 | |
11fdf7f2 | 559 | |
6d8e3169 FG |
560 | # test purging a clone with a chain of parents |
561 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
562 | rbd snap create testimg1@snap | |
563 | rbd clone --rbd-default-clone-format=2 testimg1@snap testimg2 | |
564 | rbd snap rm testimg1@snap | |
565 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
566 | rbd snap create testimg2@snap | |
567 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg4 | |
568 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg5 | |
569 | rbd snap rm testimg2@snap | |
570 | rbd snap create testimg4@snap | |
571 | rbd clone --rbd-default-clone-format=2 testimg4@snap testimg6 | |
572 | rbd snap rm testimg4@snap | |
573 | rbd trash mv testimg1 | |
574 | rbd trash mv testimg2 | |
575 | rbd trash mv testimg3 | |
576 | rbd trash mv testimg4 | |
577 | rbd trash ls | wc -l | grep 4 | |
578 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
579 | rbd trash ls | wc -l | grep 3 | |
580 | rbd trash ls | grep testimg1 | |
581 | rbd trash ls | grep testimg2 | |
582 | rbd trash ls | grep testimg4 | |
583 | rbd trash mv testimg6 | |
584 | rbd trash ls | wc -l | grep 4 | |
585 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
586 | rbd trash ls | wc -l | grep 2 | |
587 | rbd trash ls | grep testimg1 | |
588 | rbd trash ls | grep testimg2 | |
589 | rbd trash mv testimg5 | |
590 | rbd trash ls | wc -l | grep 3 | |
591 | rbd trash purge | |
592 | rbd trash ls | wc -l | grep 0 | |
11fdf7f2 | 593 | |
6d8e3169 FG |
594 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 |
595 | rbd snap create testimg1@snap | |
596 | rbd clone --rbd-default-clone-format=2 testimg1@snap testimg2 | |
597 | rbd snap rm testimg1@snap | |
598 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
599 | rbd snap create testimg3@snap # pin testimg3 | |
600 | rbd snap create testimg2@snap | |
601 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg4 | |
602 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg5 | |
603 | rbd snap rm testimg2@snap | |
604 | rbd snap create testimg4@snap | |
605 | rbd clone --rbd-default-clone-format=2 testimg4@snap testimg6 | |
606 | rbd snap rm testimg4@snap | |
607 | rbd trash mv testimg1 | |
608 | rbd trash mv testimg2 | |
609 | rbd trash mv testimg3 | |
610 | rbd trash mv testimg4 | |
611 | rbd trash ls | wc -l | grep 4 | |
612 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
613 | rbd trash ls | wc -l | grep 4 | |
614 | rbd trash mv testimg6 | |
615 | rbd trash ls | wc -l | grep 5 | |
616 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
617 | rbd trash ls | wc -l | grep 3 | |
618 | rbd trash ls | grep testimg1 | |
619 | rbd trash ls | grep testimg2 | |
620 | rbd trash ls | grep testimg3 | |
621 | rbd trash mv testimg5 | |
622 | rbd trash ls | wc -l | grep 4 | |
623 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
624 | rbd trash ls | wc -l | grep 1 | |
625 | rbd trash ls | grep testimg3 | |
626 | ID=$(rbd trash ls | awk '{ print $1 }') | |
627 | rbd snap purge --image-id $ID | |
628 | rbd trash purge | |
629 | rbd trash ls | wc -l | grep 0 | |
630 | ||
631 | # test purging a clone with a chain of auto-delete parents | |
632 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 | |
633 | rbd snap create testimg1@snap | |
634 | rbd clone --rbd-default-clone-format=2 testimg1@snap testimg2 | |
635 | rbd snap rm testimg1@snap | |
636 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
637 | rbd snap create testimg2@snap | |
638 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg4 | |
639 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg5 | |
640 | rbd snap rm testimg2@snap | |
641 | rbd snap create testimg4@snap | |
642 | rbd clone --rbd-default-clone-format=2 testimg4@snap testimg6 | |
643 | rbd snap rm testimg4@snap | |
644 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg1 | |
645 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg2 | |
646 | rbd trash mv testimg3 | |
647 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg4 | |
648 | rbd trash ls | wc -l | grep 4 | |
649 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
650 | rbd trash ls | wc -l | grep 3 | |
651 | rbd trash ls | grep testimg1 | |
652 | rbd trash ls | grep testimg2 | |
653 | rbd trash ls | grep testimg4 | |
654 | rbd trash mv testimg6 | |
655 | rbd trash ls | wc -l | grep 4 | |
656 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
657 | rbd trash ls | wc -l | grep 2 | |
658 | rbd trash ls | grep testimg1 | |
659 | rbd trash ls | grep testimg2 | |
660 | rbd trash mv testimg5 | |
661 | rbd trash ls | wc -l | grep 3 | |
662 | rbd trash purge | |
663 | rbd trash ls | wc -l | grep 0 | |
11fdf7f2 | 664 | |
6d8e3169 FG |
665 | rbd create $RBD_CREATE_ARGS --size 256 testimg1 |
666 | rbd snap create testimg1@snap | |
667 | rbd clone --rbd-default-clone-format=2 testimg1@snap testimg2 | |
668 | rbd snap rm testimg1@snap | |
669 | rbd create $RBD_CREATE_ARGS --size 256 testimg3 | |
670 | rbd snap create testimg3@snap # pin testimg3 | |
671 | rbd snap create testimg2@snap | |
672 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg4 | |
673 | rbd clone --rbd-default-clone-format=2 testimg2@snap testimg5 | |
674 | rbd snap rm testimg2@snap | |
675 | rbd snap create testimg4@snap | |
676 | rbd clone --rbd-default-clone-format=2 testimg4@snap testimg6 | |
677 | rbd snap rm testimg4@snap | |
678 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg1 | |
679 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg2 | |
680 | rbd trash mv testimg3 | |
681 | rbd rm --rbd_move_parent_to_trash_on_remove=true testimg4 | |
682 | rbd trash ls | wc -l | grep 4 | |
683 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
684 | rbd trash ls | wc -l | grep 4 | |
685 | rbd trash mv testimg6 | |
686 | rbd trash ls | wc -l | grep 5 | |
687 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
688 | rbd trash ls | wc -l | grep 3 | |
689 | rbd trash ls | grep testimg1 | |
690 | rbd trash ls | grep testimg2 | |
691 | rbd trash ls | grep testimg3 | |
692 | rbd trash mv testimg5 | |
693 | rbd trash ls | wc -l | grep 4 | |
694 | rbd trash purge 2>&1 | grep 'some expired images could not be removed' | |
695 | rbd trash ls | wc -l | grep 1 | |
696 | rbd trash ls | grep testimg3 | |
697 | ID=$(rbd trash ls | awk '{ print $1 }') | |
698 | rbd snap purge --image-id $ID | |
699 | rbd trash purge | |
700 | rbd trash ls | wc -l | grep 0 | |
11fdf7f2 TL |
701 | } |
702 | ||
703 | test_deep_copy_clone() { | |
704 | echo "testing deep copy clone..." | |
705 | remove_images | |
706 | ||
707 | rbd create testimg1 $RBD_CREATE_ARGS --size 256 | |
708 | rbd snap create testimg1 --snap=snap1 | |
709 | rbd snap protect testimg1@snap1 | |
710 | rbd clone testimg1@snap1 testimg2 | |
711 | rbd snap create testimg2@snap2 | |
712 | rbd deep copy testimg2 testimg3 | |
713 | rbd info testimg3 | grep 'size 256 MiB' | |
714 | rbd info testimg3 | grep 'parent: rbd/testimg1@snap1' | |
715 | rbd snap ls testimg3 | grep -v 'SNAPID' | wc -l | grep 1 | |
716 | rbd snap ls testimg3 | grep '.*snap2.*' | |
717 | rbd info testimg2 | grep 'features:.*deep-flatten' || rbd snap rm testimg2@snap2 | |
718 | rbd info testimg3 | grep 'features:.*deep-flatten' || rbd snap rm testimg3@snap2 | |
719 | rbd flatten testimg2 | |
720 | rbd flatten testimg3 | |
721 | rbd snap unprotect testimg1@snap1 | |
722 | rbd snap purge testimg2 | |
723 | rbd snap purge testimg3 | |
724 | rbd rm testimg2 | |
725 | rbd rm testimg3 | |
726 | ||
727 | rbd snap protect testimg1@snap1 | |
728 | rbd clone testimg1@snap1 testimg2 | |
729 | rbd snap create testimg2@snap2 | |
730 | rbd deep copy --flatten testimg2 testimg3 | |
731 | rbd info testimg3 | grep 'size 256 MiB' | |
732 | rbd info testimg3 | grep -v 'parent:' | |
733 | rbd snap ls testimg3 | grep -v 'SNAPID' | wc -l | grep 1 | |
734 | rbd snap ls testimg3 | grep '.*snap2.*' | |
735 | rbd info testimg2 | grep 'features:.*deep-flatten' || rbd snap rm testimg2@snap2 | |
736 | rbd flatten testimg2 | |
737 | rbd snap unprotect testimg1@snap1 | |
738 | ||
7c673cae FG |
739 | remove_images |
740 | } | |
741 | ||
11fdf7f2 TL |
742 | test_clone_v2() { |
743 | echo "testing clone v2..." | |
744 | remove_images | |
745 | ||
746 | rbd create $RBD_CREATE_ARGS -s 1 test1 | |
747 | rbd snap create test1@1 | |
748 | rbd clone --rbd-default-clone-format=1 test1@1 test2 && exit 1 || true | |
749 | rbd clone --rbd-default-clone-format=2 test1@1 test2 | |
750 | rbd clone --rbd-default-clone-format=2 test1@1 test3 | |
751 | ||
752 | rbd snap protect test1@1 | |
753 | rbd clone --rbd-default-clone-format=1 test1@1 test4 | |
754 | ||
755 | rbd children test1@1 | sort | tr '\n' ' ' | grep -E "test2.*test3.*test4" | |
756 | rbd children --descendants test1 | sort | tr '\n' ' ' | grep -E "test2.*test3.*test4" | |
757 | ||
758 | rbd remove test4 | |
759 | rbd snap unprotect test1@1 | |
760 | ||
761 | rbd snap remove test1@1 | |
762 | rbd snap list --all test1 | grep -E "trash \(1\) *$" | |
763 | ||
764 | rbd snap create test1@2 | |
765 | rbd rm test1 2>&1 | grep 'image has snapshots' | |
766 | ||
767 | rbd snap rm test1@2 | |
768 | rbd rm test1 2>&1 | grep 'linked clones' | |
769 | ||
770 | rbd rm test3 | |
771 | rbd rm test1 2>&1 | grep 'linked clones' | |
772 | ||
773 | rbd flatten test2 | |
774 | rbd snap list --all test1 | wc -l | grep '^0$' | |
775 | rbd rm test1 | |
776 | rbd rm test2 | |
9f95a23c TL |
777 | |
778 | rbd create $RBD_CREATE_ARGS -s 1 test1 | |
779 | rbd snap create test1@1 | |
780 | rbd snap create test1@2 | |
781 | rbd clone test1@1 test2 --rbd-default-clone-format 2 | |
782 | rbd clone test1@2 test3 --rbd-default-clone-format 2 | |
783 | rbd snap rm test1@1 | |
784 | rbd snap rm test1@2 | |
785 | expect_fail rbd rm test1 | |
786 | rbd rm test1 --rbd-move-parent-to-trash-on-remove=true | |
787 | rbd trash ls -a | grep test1 | |
788 | rbd rm test2 | |
789 | rbd trash ls -a | grep test1 | |
790 | rbd rm test3 | |
791 | rbd trash ls -a | expect_fail grep test1 | |
11fdf7f2 TL |
792 | } |
793 | ||
794 | test_thick_provision() { | |
795 | echo "testing thick provision..." | |
796 | remove_images | |
797 | ||
798 | # Try to create small and large thick-pro image and | |
799 | # check actual size. (64M and 4G) | |
800 | ||
801 | # Small thick-pro image test | |
802 | rbd create $RBD_CREATE_ARGS --thick-provision -s 64M test1 | |
803 | count=0 | |
804 | ret="" | |
805 | while [ $count -lt 10 ] | |
806 | do | |
807 | rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^64 MiB' && ret=$? | |
808 | if [ "$ret" = "0" ] | |
809 | then | |
810 | break; | |
811 | fi | |
812 | count=`expr $count + 1` | |
813 | sleep 2 | |
814 | done | |
815 | rbd du | |
816 | if [ "$ret" != "0" ] | |
817 | then | |
818 | exit 1 | |
819 | fi | |
820 | rbd rm test1 | |
821 | rbd ls | grep test1 | wc -l | grep '^0$' | |
822 | ||
823 | # Large thick-pro image test | |
824 | rbd create $RBD_CREATE_ARGS --thick-provision -s 4G test1 | |
825 | count=0 | |
826 | ret="" | |
827 | while [ $count -lt 10 ] | |
828 | do | |
829 | rbd du|grep test1|tr -s " "|cut -d " " -f 4-5|grep '^4 GiB' && ret=$? | |
830 | if [ "$ret" = "0" ] | |
831 | then | |
832 | break; | |
833 | fi | |
834 | count=`expr $count + 1` | |
835 | sleep 2 | |
836 | done | |
837 | rbd du | |
838 | if [ "$ret" != "0" ] | |
839 | then | |
840 | exit 1 | |
841 | fi | |
842 | rbd rm test1 | |
843 | rbd ls | grep test1 | wc -l | grep '^0$' | |
844 | } | |
845 | ||
846 | test_namespace() { | |
847 | echo "testing namespace..." | |
848 | remove_images | |
849 | ||
850 | rbd namespace ls | wc -l | grep '^0$' | |
851 | rbd namespace create rbd/test1 | |
852 | rbd namespace create --pool rbd --namespace test2 | |
853 | rbd namespace create --namespace test3 | |
854 | expect_fail rbd namespace create rbd/test3 | |
855 | ||
856 | rbd namespace list | grep 'test' | wc -l | grep '^3$' | |
857 | ||
858 | expect_fail rbd namespace remove --pool rbd missing | |
859 | ||
860 | rbd create $RBD_CREATE_ARGS --size 1G rbd/test1/image1 | |
861 | ||
862 | # default test1 ns to test2 ns clone | |
863 | rbd bench --io-type write --io-pattern rand --io-total 32M --io-size 4K rbd/test1/image1 | |
864 | rbd snap create rbd/test1/image1@1 | |
865 | rbd clone --rbd-default-clone-format 2 rbd/test1/image1@1 rbd/test2/image1 | |
866 | rbd snap rm rbd/test1/image1@1 | |
867 | cmp <(rbd export rbd/test1/image1 -) <(rbd export rbd/test2/image1 -) | |
868 | rbd rm rbd/test2/image1 | |
869 | ||
870 | # default ns to test1 ns clone | |
871 | rbd create $RBD_CREATE_ARGS --size 1G rbd/image2 | |
872 | rbd bench --io-type write --io-pattern rand --io-total 32M --io-size 4K rbd/image2 | |
873 | rbd snap create rbd/image2@1 | |
874 | rbd clone --rbd-default-clone-format 2 rbd/image2@1 rbd/test2/image2 | |
875 | rbd snap rm rbd/image2@1 | |
876 | cmp <(rbd export rbd/image2 -) <(rbd export rbd/test2/image2 -) | |
877 | expect_fail rbd rm rbd/image2 | |
878 | rbd rm rbd/test2/image2 | |
879 | rbd rm rbd/image2 | |
880 | ||
eafe8130 TL |
881 | # v1 clones are supported within the same namespace |
882 | rbd create $RBD_CREATE_ARGS --size 1G rbd/test1/image3 | |
883 | rbd snap create rbd/test1/image3@1 | |
884 | rbd snap protect rbd/test1/image3@1 | |
885 | rbd clone --rbd-default-clone-format 1 rbd/test1/image3@1 rbd/test1/image4 | |
886 | rbd rm rbd/test1/image4 | |
887 | rbd snap unprotect rbd/test1/image3@1 | |
888 | rbd snap rm rbd/test1/image3@1 | |
889 | rbd rm rbd/test1/image3 | |
890 | ||
11fdf7f2 TL |
891 | rbd create $RBD_CREATE_ARGS --size 1G --namespace test1 image2 |
892 | expect_fail rbd namespace remove rbd/test1 | |
893 | ||
894 | rbd group create rbd/test1/group1 | |
895 | rbd group image add rbd/test1/group1 rbd/test1/image1 | |
896 | rbd group rm rbd/test1/group1 | |
897 | ||
898 | rbd trash move rbd/test1/image1 | |
899 | ID=`rbd trash --namespace test1 ls | cut -d ' ' -f 1` | |
900 | rbd trash rm rbd/test1/${ID} | |
901 | ||
902 | rbd remove rbd/test1/image2 | |
903 | ||
904 | rbd namespace remove --pool rbd --namespace test1 | |
905 | rbd namespace remove --namespace test3 | |
906 | ||
907 | rbd namespace list | grep 'test' | wc -l | grep '^1$' | |
908 | rbd namespace remove rbd/test2 | |
909 | } | |
910 | ||
911 | get_migration_state() { | |
912 | local image=$1 | |
913 | ||
914 | rbd --format xml status $image | | |
915 | $XMLSTARLET sel -t -v '//status/migration/state' | |
916 | } | |
917 | ||
918 | test_migration() { | |
919 | echo "testing migration..." | |
920 | remove_images | |
921 | ceph osd pool create rbd2 8 | |
922 | rbd pool init rbd2 | |
923 | ||
924 | # Convert to new format | |
925 | rbd create --image-format 1 -s 128M test1 | |
926 | rbd info test1 | grep 'format: 1' | |
927 | rbd migration prepare test1 --image-format 2 | |
928 | test "$(get_migration_state test1)" = prepared | |
929 | rbd info test1 | grep 'format: 2' | |
930 | rbd rm test1 && exit 1 || true | |
931 | rbd migration execute test1 | |
932 | test "$(get_migration_state test1)" = executed | |
933 | rbd migration commit test1 | |
934 | get_migration_state test1 && exit 1 || true | |
935 | ||
936 | # Enable layering (and some other features) | |
937 | rbd info test1 | grep 'features: .*layering' && exit 1 || true | |
938 | rbd migration prepare test1 --image-feature \ | |
939 | layering,exclusive-lock,object-map,fast-diff,deep-flatten | |
940 | rbd info test1 | grep 'features: .*layering' | |
941 | rbd migration execute test1 | |
942 | rbd migration commit test1 | |
943 | ||
944 | # Migration to other pool | |
945 | rbd migration prepare test1 rbd2/test1 | |
946 | test "$(get_migration_state rbd2/test1)" = prepared | |
947 | rbd ls | wc -l | grep '^0$' | |
948 | rbd -p rbd2 ls | grep test1 | |
949 | rbd migration execute test1 | |
950 | test "$(get_migration_state rbd2/test1)" = executed | |
951 | rbd rm rbd2/test1 && exit 1 || true | |
952 | rbd migration commit test1 | |
953 | ||
954 | # Migration to other namespace | |
955 | rbd namespace create rbd2/ns1 | |
956 | rbd namespace create rbd2/ns2 | |
957 | rbd migration prepare rbd2/test1 rbd2/ns1/test1 | |
958 | test "$(get_migration_state rbd2/ns1/test1)" = prepared | |
959 | rbd migration execute rbd2/test1 | |
960 | test "$(get_migration_state rbd2/ns1/test1)" = executed | |
961 | rbd migration commit rbd2/test1 | |
962 | rbd migration prepare rbd2/ns1/test1 rbd2/ns2/test1 | |
963 | rbd migration execute rbd2/ns2/test1 | |
964 | rbd migration commit rbd2/ns2/test1 | |
965 | ||
966 | # Enable data pool | |
967 | rbd create -s 128M test1 | |
968 | rbd migration prepare test1 --data-pool rbd2 | |
969 | rbd info test1 | grep 'data_pool: rbd2' | |
970 | rbd migration execute test1 | |
971 | rbd migration commit test1 | |
972 | ||
973 | # testing trash | |
974 | rbd migration prepare test1 | |
975 | expect_fail rbd trash mv test1 | |
976 | ID=`rbd trash ls -a | cut -d ' ' -f 1` | |
977 | expect_fail rbd trash rm $ID | |
978 | expect_fail rbd trash restore $ID | |
979 | rbd migration abort test1 | |
980 | ||
981 | # Migrate parent | |
982 | rbd remove test1 | |
983 | dd if=/dev/urandom bs=1M count=1 | rbd --image-format 2 import - test1 | |
984 | md5sum=$(rbd export test1 - | md5sum) | |
985 | rbd snap create test1@snap1 | |
986 | rbd snap protect test1@snap1 | |
987 | rbd snap create test1@snap2 | |
988 | rbd clone test1@snap1 clone_v1 --rbd_default_clone_format=1 | |
989 | rbd clone test1@snap2 clone_v2 --rbd_default_clone_format=2 | |
990 | rbd info clone_v1 | fgrep 'parent: rbd/test1@snap1' | |
991 | rbd info clone_v2 | fgrep 'parent: rbd/test1@snap2' | |
992 | rbd info clone_v2 |grep 'op_features: clone-child' | |
993 | test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}" | |
994 | test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}" | |
995 | test "$(rbd children test1@snap1)" = "rbd/clone_v1" | |
996 | test "$(rbd children test1@snap2)" = "rbd/clone_v2" | |
997 | rbd migration prepare test1 rbd2/test2 | |
998 | rbd info clone_v1 | fgrep 'parent: rbd2/test2@snap1' | |
999 | rbd info clone_v2 | fgrep 'parent: rbd2/test2@snap2' | |
1000 | rbd info clone_v2 | fgrep 'op_features: clone-child' | |
1001 | test "$(rbd children rbd2/test2@snap1)" = "rbd/clone_v1" | |
1002 | test "$(rbd children rbd2/test2@snap2)" = "rbd/clone_v2" | |
1003 | rbd migration execute test1 | |
1004 | expect_fail rbd migration commit test1 | |
1005 | rbd migration commit test1 --force | |
1006 | test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}" | |
1007 | test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}" | |
1008 | rbd migration prepare rbd2/test2 test1 | |
1009 | rbd info clone_v1 | fgrep 'parent: rbd/test1@snap1' | |
1010 | rbd info clone_v2 | fgrep 'parent: rbd/test1@snap2' | |
1011 | rbd info clone_v2 | fgrep 'op_features: clone-child' | |
1012 | test "$(rbd children test1@snap1)" = "rbd/clone_v1" | |
1013 | test "$(rbd children test1@snap2)" = "rbd/clone_v2" | |
1014 | rbd migration execute test1 | |
1015 | expect_fail rbd migration commit test1 | |
1016 | rbd migration commit test1 --force | |
1017 | test "$(rbd export clone_v1 - | md5sum)" = "${md5sum}" | |
1018 | test "$(rbd export clone_v2 - | md5sum)" = "${md5sum}" | |
1019 | rbd remove clone_v1 | |
1020 | rbd remove clone_v2 | |
1021 | rbd snap unprotect test1@snap1 | |
1022 | rbd snap purge test1 | |
1023 | rbd rm test1 | |
1024 | ||
1025 | for format in 1 2; do | |
1026 | # Abort migration after successful prepare | |
1027 | rbd create -s 128M --image-format ${format} test2 | |
1028 | rbd migration prepare test2 --data-pool rbd2 | |
1029 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1030 | rbd migration abort test2 | |
1031 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1032 | rbd rm test2 | |
1033 | ||
1034 | # Abort migration after successful execute | |
1035 | rbd create -s 128M --image-format ${format} test2 | |
1036 | rbd migration prepare test2 --data-pool rbd2 | |
1037 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1038 | rbd migration execute test2 | |
1039 | rbd migration abort test2 | |
1040 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1041 | rbd rm test2 | |
1042 | ||
1043 | # Migration is automatically aborted if prepare failed | |
1044 | rbd create -s 128M --image-format ${format} test2 | |
1045 | rbd migration prepare test2 --data-pool INVALID_DATA_POOL && exit 1 || true | |
1046 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1047 | rbd rm test2 | |
1048 | ||
1049 | # Abort migration to other pool | |
1050 | rbd create -s 128M --image-format ${format} test2 | |
1051 | rbd migration prepare test2 rbd2/test2 | |
1052 | rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/test2 | |
1053 | rbd migration abort test2 | |
1054 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1055 | rbd rm test2 | |
1056 | ||
1057 | # The same but abort using destination image | |
1058 | rbd create -s 128M --image-format ${format} test2 | |
1059 | rbd migration prepare test2 rbd2/test2 | |
1060 | rbd migration abort rbd2/test2 | |
1061 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1062 | rbd rm test2 | |
1063 | ||
1064 | test $format = 1 && continue | |
1065 | ||
1066 | # Abort migration to other namespace | |
1067 | rbd create -s 128M --image-format ${format} test2 | |
1068 | rbd migration prepare test2 rbd2/ns1/test3 | |
1069 | rbd bench --io-type write --io-size 1024 --io-total 1024 rbd2/ns1/test3 | |
1070 | rbd migration abort test2 | |
1071 | rbd bench --io-type write --io-size 1024 --io-total 1024 test2 | |
1072 | rbd rm test2 | |
1073 | done | |
1074 | ||
1075 | remove_images | |
1076 | ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it | |
1077 | } | |
1078 | ||
1079 | test_config() { | |
1080 | echo "testing config..." | |
1081 | remove_images | |
1082 | ||
1083 | expect_fail rbd config global set osd rbd_cache true | |
1084 | expect_fail rbd config global set global debug_ms 10 | |
1085 | expect_fail rbd config global set global rbd_UNKNOWN false | |
1086 | expect_fail rbd config global set global rbd_cache INVALID | |
1087 | rbd config global set global rbd_cache false | |
1088 | rbd config global set client rbd_cache true | |
1089 | rbd config global set client.123 rbd_cache false | |
1090 | rbd config global get global rbd_cache | grep '^false$' | |
1091 | rbd config global get client rbd_cache | grep '^true$' | |
1092 | rbd config global get client.123 rbd_cache | grep '^false$' | |
1093 | expect_fail rbd config global get client.UNKNOWN rbd_cache | |
1094 | rbd config global list global | grep '^rbd_cache * false * global *$' | |
1095 | rbd config global list client | grep '^rbd_cache * true * client *$' | |
1096 | rbd config global list client.123 | grep '^rbd_cache * false * client.123 *$' | |
1097 | rbd config global list client.UNKNOWN | grep '^rbd_cache * true * client *$' | |
1098 | rbd config global rm client rbd_cache | |
1099 | expect_fail rbd config global get client rbd_cache | |
1100 | rbd config global list client | grep '^rbd_cache * false * global *$' | |
1101 | rbd config global rm client.123 rbd_cache | |
1102 | rbd config global rm global rbd_cache | |
1103 | ||
1104 | rbd config pool set rbd rbd_cache true | |
1105 | rbd config pool list rbd | grep '^rbd_cache * true * pool *$' | |
1106 | rbd config pool get rbd rbd_cache | grep '^true$' | |
1107 | ||
1108 | rbd create $RBD_CREATE_ARGS -s 1 test1 | |
1109 | ||
1110 | rbd config image list rbd/test1 | grep '^rbd_cache * true * pool *$' | |
1111 | rbd config image set rbd/test1 rbd_cache false | |
1112 | rbd config image list rbd/test1 | grep '^rbd_cache * false * image *$' | |
1113 | rbd config image get rbd/test1 rbd_cache | grep '^false$' | |
1114 | rbd config image remove rbd/test1 rbd_cache | |
1115 | expect_fail rbd config image get rbd/test1 rbd_cache | |
1116 | rbd config image list rbd/test1 | grep '^rbd_cache * true * pool *$' | |
1117 | ||
1118 | rbd config pool remove rbd rbd_cache | |
1119 | expect_fail rbd config pool get rbd rbd_cache | |
1120 | rbd config pool list rbd | grep '^rbd_cache * true * config *$' | |
1121 | ||
1122 | rbd rm test1 | |
1123 | } | |
7c673cae | 1124 | |
9f95a23c TL |
1125 | test_trash_purge_schedule() { |
1126 | echo "testing trash purge schedule..." | |
1127 | remove_images | |
1128 | ceph osd pool create rbd2 8 | |
1129 | rbd pool init rbd2 | |
1130 | rbd namespace create rbd2/ns1 | |
1131 | ||
1132 | expect_fail rbd trash purge schedule ls | |
1133 | test "$(rbd trash purge schedule ls -R --format json)" = "[]" | |
1134 | ||
1135 | rbd trash purge schedule add -p rbd 1d 01:30 | |
1136 | ||
1137 | rbd trash purge schedule ls -p rbd | grep 'every 1d starting at 01:30' | |
1138 | expect_fail rbd trash purge schedule ls | |
1139 | rbd trash purge schedule ls -R | grep 'every 1d starting at 01:30' | |
1140 | rbd trash purge schedule ls -R -p rbd | grep 'every 1d starting at 01:30' | |
1141 | expect_fail rbd trash purge schedule ls -p rbd2 | |
1142 | test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" = "[]" | |
1143 | ||
1144 | rbd trash purge schedule add -p rbd2/ns1 2d | |
1145 | test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" != "[]" | |
1146 | rbd trash purge schedule ls -p rbd2 -R | grep 'rbd2 *ns1 *every 2d' | |
1147 | rbd trash purge schedule rm -p rbd2/ns1 | |
1148 | test "$(rbd trash purge schedule ls -p rbd2 -R --format json)" = "[]" | |
1149 | ||
1150 | for i in `seq 12`; do | |
1151 | test "$(rbd trash purge schedule status --format xml | | |
1152 | $XMLSTARLET sel -t -v '//scheduled/item/pool')" = 'rbd' && break | |
1153 | sleep 10 | |
1154 | done | |
1155 | rbd trash purge schedule status | |
1156 | test "$(rbd trash purge schedule status --format xml | | |
1157 | $XMLSTARLET sel -t -v '//scheduled/item/pool')" = 'rbd' | |
1158 | ||
1159 | rbd trash purge schedule add 2d 00:17 | |
1160 | rbd trash purge schedule ls | grep 'every 2d starting at 00:17' | |
1161 | rbd trash purge schedule ls -R | grep 'every 2d starting at 00:17' | |
1162 | expect_fail rbd trash purge schedule ls -p rbd2 | |
1163 | rbd trash purge schedule ls -p rbd2 -R | grep 'every 2d starting at 00:17' | |
1164 | rbd trash purge schedule ls -p rbd2/ns1 -R | grep 'every 2d starting at 00:17' | |
1165 | test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml | | |
1166 | $XMLSTARLET sel -t -v '//schedules/schedule/pool')" = "-" | |
1167 | test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml | | |
1168 | $XMLSTARLET sel -t -v '//schedules/schedule/namespace')" = "-" | |
1169 | test "$(rbd trash purge schedule ls -R -p rbd2/ns1 --format xml | | |
1170 | $XMLSTARLET sel -t -v '//schedules/schedule/items/item/start_time')" = "00:17:00" | |
1171 | ||
1172 | for i in `seq 12`; do | |
1173 | rbd trash purge schedule status --format xml | | |
1174 | $XMLSTARLET sel -t -v '//scheduled/item/pool' | grep 'rbd2' && break | |
1175 | sleep 10 | |
1176 | done | |
1177 | rbd trash purge schedule status | |
1178 | rbd trash purge schedule status --format xml | | |
1179 | $XMLSTARLET sel -t -v '//scheduled/item/pool' | grep 'rbd2' | |
1180 | ||
1181 | test "$(echo $(rbd trash purge schedule ls -R --format xml | | |
1182 | $XMLSTARLET sel -t -v '//schedules/schedule/items'))" = "2d00:17:00 1d01:30:00" | |
1183 | ||
1184 | rbd trash purge schedule add 1d | |
1185 | rbd trash purge schedule ls | grep 'every 2d starting at 00:17' | |
1186 | rbd trash purge schedule ls | grep 'every 1d' | |
1187 | ||
1188 | rbd trash purge schedule ls -R --format xml | | |
1189 | $XMLSTARLET sel -t -v '//schedules/schedule/items' | grep '2d00:17' | |
1190 | ||
1191 | rbd trash purge schedule rm 1d | |
1192 | rbd trash purge schedule ls | grep 'every 2d starting at 00:17' | |
1193 | rbd trash purge schedule rm 2d 00:17 | |
1194 | expect_fail rbd trash purge schedule ls | |
1195 | ||
1196 | for p in rbd2 rbd2/ns1; do | |
1197 | rbd create $RBD_CREATE_ARGS -s 1 rbd2/ns1/test1 | |
1198 | rbd trash mv rbd2/ns1/test1 | |
1199 | rbd trash ls rbd2/ns1 | wc -l | grep '^1$' | |
1200 | ||
1201 | rbd trash purge schedule add -p $p 1m | |
1202 | rbd trash purge schedule list -p rbd2/ns1 -R | grep 'every 1m' | |
1203 | ||
1204 | for i in `seq 12`; do | |
1205 | rbd trash ls rbd2/ns1 | wc -l | grep '^1$' || break | |
1206 | sleep 10 | |
1207 | done | |
1208 | rbd trash ls rbd2/ns1 | wc -l | grep '^0$' | |
1209 | ||
1210 | rbd trash purge schedule status | grep 'rbd2 *ns1' | |
1211 | rbd trash purge schedule rm -p $p 1m | |
1212 | done | |
1213 | ||
1214 | rbd trash purge schedule remove -p rbd 1d 01:30 | |
1215 | test "$(rbd trash purge schedule ls -R --format json)" = "[]" | |
1216 | ||
1217 | remove_images | |
1218 | ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it | |
1219 | } | |
1220 | ||
1221 | test_mirror_snapshot_schedule() { | |
1222 | echo "testing mirror snapshot schedule..." | |
1223 | remove_images | |
1224 | ceph osd pool create rbd2 8 | |
1225 | rbd pool init rbd2 | |
1226 | rbd namespace create rbd2/ns1 | |
1227 | ||
1228 | rbd mirror pool enable rbd2 image | |
1229 | rbd mirror pool enable rbd2/ns1 image | |
1230 | rbd mirror pool peer add rbd2 cluster1 | |
1231 | ||
1232 | expect_fail rbd mirror snapshot schedule ls | |
1233 | test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]" | |
1234 | ||
1235 | rbd create $RBD_CREATE_ARGS -s 1 rbd2/ns1/test1 | |
1236 | ||
1237 | test "$(rbd mirror image status rbd2/ns1/test1 | | |
1238 | grep -c mirror.primary)" = '0' | |
1239 | ||
1240 | rbd mirror image enable rbd2/ns1/test1 snapshot | |
1241 | ||
1242 | test "$(rbd mirror image status rbd2/ns1/test1 | | |
1243 | grep -c mirror.primary)" = '1' | |
1244 | ||
1245 | rbd mirror snapshot schedule add --image rbd2/ns1/test1 1m | |
1246 | test "$(rbd mirror snapshot schedule ls --image rbd2/ns1/test1)" = 'every 1m' | |
1247 | ||
1248 | for i in `seq 12`; do | |
1249 | test "$(rbd mirror image status rbd2/ns1/test1 | | |
1250 | grep -c mirror.primary)" -gt '1' && break | |
1251 | sleep 10 | |
1252 | done | |
1253 | ||
1254 | test "$(rbd mirror image status rbd2/ns1/test1 | | |
1255 | grep -c mirror.primary)" -gt '1' | |
1256 | ||
1257 | rbd mirror snapshot schedule ls -R | grep 'rbd2 *ns1 *test1 *every 1m' | |
1258 | test "$(rbd mirror snapshot schedule ls -p rbd2/ns1 --image test1)" = 'every 1m' | |
1259 | ||
1260 | rbd mirror snapshot schedule status | |
1261 | test "$(rbd mirror snapshot schedule status --format xml | | |
1262 | $XMLSTARLET sel -t -v '//scheduled_images/image/image')" = 'rbd2/ns1/test1' | |
1263 | ||
1264 | rbd mirror snapshot schedule add 1h 00:15 | |
1265 | test "$(rbd mirror snapshot schedule ls)" = 'every 1h starting at 00:15:00' | |
1266 | ||
1267 | rbd rm rbd2/ns1/test1 | |
1268 | ||
1269 | for i in `seq 12`; do | |
1270 | rbd mirror snapshot schedule status | grep 'rbd2/ns1/test1' || break | |
1271 | sleep 10 | |
1272 | done | |
1273 | ||
1274 | rbd mirror snapshot schedule remove | |
1275 | test "$(rbd mirror snapshot schedule ls -R --format json)" = "[]" | |
1276 | ||
1277 | remove_images | |
1278 | ceph osd pool rm rbd2 rbd2 --yes-i-really-really-mean-it | |
1279 | } | |
1280 | ||
7c673cae FG |
1281 | test_pool_image_args |
1282 | test_rename | |
1283 | test_ls | |
1284 | test_remove | |
11fdf7f2 TL |
1285 | test_migration |
1286 | test_config | |
7c673cae FG |
1287 | RBD_CREATE_ARGS="" |
1288 | test_others | |
1289 | test_locking | |
11fdf7f2 | 1290 | test_thick_provision |
7c673cae FG |
1291 | RBD_CREATE_ARGS="--image-format 2" |
1292 | test_others | |
1293 | test_locking | |
1294 | test_clone | |
1295 | test_trash | |
11fdf7f2 TL |
1296 | test_purge |
1297 | test_deep_copy_clone | |
1298 | test_clone_v2 | |
1299 | test_thick_provision | |
1300 | test_namespace | |
9f95a23c TL |
1301 | test_trash_purge_schedule |
1302 | test_mirror_snapshot_schedule | |
7c673cae FG |
1303 | |
1304 | echo OK |