]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/rbd-nbd.sh
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / workunits / rbd / rbd-nbd.sh
1 #!/usr/bin/env bash
2 set -ex
3
4 . $(dirname $0)/../../standalone/ceph-helpers.sh
5
6 POOL=rbd
7 NS=ns
8 IMAGE=testrbdnbd$$
9 SIZE=64
10 DATA=
11 DEV=
12
13 _sudo()
14 {
15 local cmd
16
17 if [ `id -u` -eq 0 ]
18 then
19 "$@"
20 return $?
21 fi
22
23 # Look for the command in the user path. If it fails run it as is,
24 # supposing it is in sudo path.
25 cmd=`which $1 2>/dev/null` || cmd=$1
26 shift
27 sudo -nE "${cmd}" "$@"
28 }
29
30 setup()
31 {
32 local ns x
33
34 if [ -e CMakeCache.txt ]; then
35 # running under cmake build dir
36
37 CEPH_SRC=$(readlink -f $(dirname $0)/../../../src)
38 CEPH_ROOT=${PWD}
39 CEPH_BIN=${CEPH_ROOT}/bin
40
41 export LD_LIBRARY_PATH=${CEPH_ROOT}/lib:${LD_LIBRARY_PATH}
42 export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind
43 for x in ${CEPH_ROOT}/lib/cython_modules/lib* ; do
44 PYTHONPATH="${PYTHONPATH}:${x}"
45 done
46 PATH=${CEPH_BIN}:${PATH}
47 fi
48
49 _sudo echo test sudo
50
51 trap cleanup INT TERM EXIT
52 TEMPDIR=`mktemp -d`
53 DATA=${TEMPDIR}/data
54 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
55
56 rbd namespace create ${POOL}/${NS}
57
58 for ns in '' ${NS}; do
59 rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \
60 ${DATA} ${IMAGE}
61 done
62 }
63
64 function cleanup()
65 {
66 local ns s
67
68 set +e
69 rm -Rf ${TEMPDIR}
70 if [ -n "${DEV}" ]
71 then
72 _sudo rbd-nbd unmap ${DEV}
73 fi
74
75 for ns in '' ${NS}; do
76 if rbd -p ${POOL} --namespace "${ns}" status ${IMAGE} 2>/dev/null; then
77 for s in 0.5 1 2 4 8 16 32; do
78 sleep $s
79 rbd -p ${POOL} --namespace "${ns}" status ${IMAGE} |
80 grep 'Watchers: none' && break
81 done
82 rbd -p ${POOL} --namespace "${ns}" snap purge ${IMAGE}
83 rbd -p ${POOL} --namespace "${ns}" remove ${IMAGE}
84 fi
85 done
86 rbd namespace remove ${POOL}/${NS}
87 }
88
89 function expect_false()
90 {
91 if "$@"; then return 1; else return 0; fi
92 }
93
94 function get_pid()
95 {
96 local ns=$1
97
98 PID=$(rbd-nbd --format xml list-mapped | $XMLSTARLET sel -t -v \
99 "//devices/device[pool='${POOL}'][namespace='${ns}'][image='${IMAGE}'][device='${DEV}']/id")
100 test -n "${PID}"
101 ps -p ${PID} -o cmd | grep rbd-nbd
102 }
103
104 #
105 # main
106 #
107
108 setup
109
110 # exit status test
111 expect_false rbd-nbd
112 expect_false rbd-nbd INVALIDCMD
113 if [ `id -u` -ne 0 ]
114 then
115 expect_false rbd-nbd map ${IMAGE}
116 fi
117 expect_false _sudo rbd-nbd map INVALIDIMAGE
118 expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE}
119
120 # list format test
121 expect_false rbd-nbd --format INVALID list-mapped
122 rbd-nbd --format json --pretty-format list-mapped
123 rbd-nbd --format xml list-mapped
124
125 # map test using the first unused device
126 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
127 get_pid
128 # map test specifying the device
129 expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
130 dev1=${DEV}
131 _sudo rbd-nbd unmap ${DEV}
132 rbd-nbd list-mapped | expect_false grep "${DEV} $"
133 DEV=
134 # XXX: race possible when the device is reused by other process
135 DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
136 [ "${DEV}" = "${dev1}" ]
137 rbd-nbd list-mapped | grep "${IMAGE}"
138 get_pid
139
140 # read test
141 [ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
142
143 # write test
144 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
145 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
146 [ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
147
148 # trim test
149 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
150 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
151 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
152 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
153 [ "${used}" -eq "${provisioned}" ]
154 _sudo mkfs.ext4 -E discard ${DEV} # better idea?
155 sync
156 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
157 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
158 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
159 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
160 [ "${used}" -lt "${provisioned}" ]
161
162 # resize test
163 devname=$(basename ${DEV})
164 blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
165 test -n "${blocks}"
166 rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
167 rbd info ${POOL}/${IMAGE}
168 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
169 test -n "${blocks2}"
170 test ${blocks2} -eq $((blocks * 2))
171 rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
172 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
173 test -n "${blocks2}"
174 test ${blocks2} -eq ${blocks}
175
176 # read-only option test
177 _sudo rbd-nbd unmap ${DEV}
178 DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
179 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
180 '$2 == pool && $3 == img && $5 == dev {print $1}')
181 test -n "${PID}"
182 ps -p ${PID} -o cmd | grep rbd-nbd
183
184 _sudo dd if=${DEV} of=/dev/null bs=1M
185 expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
186 _sudo rbd-nbd unmap ${DEV}
187
188 # exclusive option test
189 DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
190 get_pid
191
192 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
193 expect_false timeout 10 \
194 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
195 _sudo rbd-nbd unmap ${DEV}
196 DEV=
197 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
198
199 # unmap by image name test
200 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
201 get_pid
202 _sudo rbd-nbd unmap "${IMAGE}"
203 rbd-nbd list-mapped | expect_false grep "${DEV} $"
204 DEV=
205 ps -p ${PID} -o cmd | expect_false grep rbd-nbd
206
207 # map/unmap snap test
208 rbd snap create ${POOL}/${IMAGE}@snap
209 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}@snap`
210 get_pid
211 _sudo rbd-nbd unmap "${IMAGE}@snap"
212 rbd-nbd list-mapped | expect_false grep "${DEV} $"
213 DEV=
214 ps -p ${PID} -o cmd | expect_false grep rbd-nbd
215
216 # map/unmap namespace test
217 rbd snap create ${POOL}/${NS}/${IMAGE}@snap
218 DEV=`_sudo rbd-nbd map ${POOL}/${NS}/${IMAGE}@snap`
219 get_pid ${NS}
220 _sudo rbd-nbd unmap "${POOL}/${NS}/${IMAGE}@snap"
221 rbd-nbd list-mapped | expect_false grep "${DEV} $"
222 DEV=
223 ps -p ${PID} -o cmd | expect_false grep rbd-nbd
224
225 # auto unmap test
226 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
227 get_pid
228 _sudo kill ${PID}
229 for i in `seq 10`; do
230 rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" && break
231 sleep 1
232 done
233 rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}"
234
235 echo OK