]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/rbd-nbd.sh
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / qa / workunits / rbd / rbd-nbd.sh
1 #!/bin/bash -ex
2
3 . $(dirname $0)/../ceph-helpers.sh
4
5 POOL=rbd
6 IMAGE=testrbdnbd$$
7 SIZE=64
8 DATA=
9 DEV=
10
11 _sudo()
12 {
13 local cmd
14
15 if [ `id -u` -eq 0 ]
16 then
17 "$@"
18 return $?
19 fi
20
21 # Look for the command in the user path. If it fails run it as is,
22 # supposing it is in sudo path.
23 cmd=`which $1 2>/dev/null` || cmd=$1
24 shift
25 sudo -nE "${cmd}" "$@"
26 }
27
28 setup()
29 {
30 if [ -e CMakeCache.txt ]; then
31 # running under cmake build dir
32
33 CEPH_SRC=$(readlink -f $(dirname $0)/../../../src)
34 CEPH_ROOT=${PWD}
35 CEPH_BIN=${CEPH_ROOT}/bin
36
37 export LD_LIBRARY_PATH=${CEPH_ROOT}/lib:${LD_LIBRARY_PATH}
38 export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind
39 for x in ${CEPH_ROOT}/lib/cython_modules/lib* ; do
40 PYTHONPATH="${PYTHONPATH}:${x}"
41 done
42 PATH=${CEPH_BIN}:${PATH}
43 fi
44
45 _sudo echo test sudo
46
47 trap cleanup INT TERM EXIT
48 TEMPDIR=`mktemp -d`
49 DATA=${TEMPDIR}/data
50 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
51 rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE}
52 }
53
54 function cleanup()
55 {
56 set +e
57 rm -Rf ${TMPDIR}
58 if [ -n "${DEV}" ]
59 then
60 _sudo rbd-nbd unmap ${DEV}
61 fi
62 if rbd -p ${POOL} status ${IMAGE} 2>/dev/null; then
63 for s in 0.5 1 2 4 8 16 32; do
64 sleep $s
65 rbd -p ${POOL} status ${IMAGE} | grep 'Watchers: none' && break
66 done
67 rbd -p ${POOL} remove ${IMAGE}
68 fi
69 }
70
71 function expect_false()
72 {
73 if "$@"; then return 1; else return 0; fi
74 }
75
76 #
77 # main
78 #
79
80 setup
81
82 # exit status test
83 expect_false rbd-nbd
84 expect_false rbd-nbd INVALIDCMD
85 if [ `id -u` -ne 0 ]
86 then
87 expect_false rbd-nbd map ${IMAGE}
88 fi
89 expect_false _sudo rbd-nbd map INVALIDIMAGE
90 expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE}
91
92 # map test using the first unused device
93 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
94 _sudo rbd-nbd list-mapped | grep "^${DEV}$"
95
96 # map test specifying the device
97 expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
98 dev1=${DEV}
99 _sudo rbd-nbd unmap ${DEV}
100 _sudo rbd-nbd list-mapped | expect_false grep "^${DEV}$"
101 DEV=
102 # XXX: race possible when the device is reused by other process
103 DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
104 [ "${DEV}" = "${dev1}" ]
105 _sudo rbd-nbd list-mapped | grep "^${DEV}$"
106
107 # read test
108 [ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
109
110 # write test
111 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
112 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
113 [ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
114
115 # trim test
116 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
117 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
118 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
119 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
120 [ "${used}" -eq "${provisioned}" ]
121 _sudo mkfs.ext4 -E discard ${DEV} # better idea?
122 sync
123 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
124 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
125 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
126 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
127 [ "${used}" -lt "${provisioned}" ]
128
129 # resize test
130 devname=$(basename ${DEV})
131 blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
132 test -n "${blocks}"
133 rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
134 rbd info ${POOL}/${IMAGE}
135 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
136 test -n "${blocks2}"
137 test ${blocks2} -eq $((blocks * 2))
138 rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
139 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
140 test -n "${blocks2}"
141 test ${blocks2} -eq ${blocks}
142
143 # read-only option test
144 _sudo rbd-nbd unmap ${DEV}
145 DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
146 _sudo rbd-nbd list-mapped | grep "^${DEV}$"
147 _sudo dd if=${DEV} of=/dev/null bs=1M
148 expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
149 _sudo rbd-nbd unmap ${DEV}
150
151 # exclusive option test
152 DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
153 _sudo rbd-nbd list-mapped | grep "^${DEV}$"
154 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
155 expect_false timeout 10 \
156 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
157 _sudo rbd-nbd unmap ${DEV}
158 DEV=
159 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
160
161 echo OK