Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / workunits / rbd / cli_generic.sh
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
126     rbd pool init rbd2
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
294     rbd pool init test
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
363     rbd pool init rbd2
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