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