]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/rbd-nbd.sh
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / workunits / rbd / rbd-nbd.sh
CommitLineData
11fdf7f2
TL
1#!/usr/bin/env bash
2set -ex
7c673cae 3
c07f9fc5 4. $(dirname $0)/../../standalone/ceph-helpers.sh
7c673cae
FG
5
6POOL=rbd
11fdf7f2 7NS=ns
7c673cae
FG
8IMAGE=testrbdnbd$$
9SIZE=64
10DATA=
11DEV=
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
30setup()
31{
11fdf7f2
TL
32 local ns x
33
7c673cae
FG
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}
11fdf7f2
TL
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
7c673cae
FG
62}
63
64function cleanup()
65{
11fdf7f2
TL
66 local ns s
67
7c673cae 68 set +e
11fdf7f2 69 rm -Rf ${TEMPDIR}
7c673cae
FG
70 if [ -n "${DEV}" ]
71 then
72 _sudo rbd-nbd unmap ${DEV}
73 fi
11fdf7f2
TL
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}
7c673cae
FG
87}
88
89function expect_false()
90{
91 if "$@"; then return 1; else return 0; fi
92}
93
11fdf7f2
TL
94function 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
7c673cae
FG
104#
105# main
106#
107
108setup
109
110# exit status test
111expect_false rbd-nbd
112expect_false rbd-nbd INVALIDCMD
113if [ `id -u` -ne 0 ]
114then
115 expect_false rbd-nbd map ${IMAGE}
116fi
117expect_false _sudo rbd-nbd map INVALIDIMAGE
118expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE}
119
11fdf7f2
TL
120# list format test
121expect_false rbd-nbd --format INVALID list-mapped
122rbd-nbd --format json --pretty-format list-mapped
123rbd-nbd --format xml list-mapped
124
7c673cae
FG
125# map test using the first unused device
126DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
11fdf7f2 127get_pid
7c673cae
FG
128# map test specifying the device
129expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
130dev1=${DEV}
131_sudo rbd-nbd unmap ${DEV}
31f18b77 132rbd-nbd list-mapped | expect_false grep "${DEV} $"
7c673cae
FG
133DEV=
134# XXX: race possible when the device is reused by other process
135DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
136[ "${DEV}" = "${dev1}" ]
31f18b77 137rbd-nbd list-mapped | grep "${IMAGE}"
11fdf7f2 138get_pid
7c673cae
FG
139
140# read test
141[ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
142
143# write test
144dd 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
149provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
150 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
151used=`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?
155sync
156provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
157 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
158used=`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
163devname=$(basename ${DEV})
164blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
165test -n "${blocks}"
166rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
167rbd info ${POOL}/${IMAGE}
168blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
169test -n "${blocks2}"
170test ${blocks2} -eq $((blocks * 2))
171rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
172blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
173test -n "${blocks2}"
174test ${blocks2} -eq ${blocks}
175
176# read-only option test
177_sudo rbd-nbd unmap ${DEV}
178DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
31f18b77
FG
179PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
180 '$2 == pool && $3 == img && $5 == dev {print $1}')
181test -n "${PID}"
182ps -p ${PID} -o cmd | grep rbd-nbd
183
7c673cae
FG
184_sudo dd if=${DEV} of=/dev/null bs=1M
185expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
186_sudo rbd-nbd unmap ${DEV}
187
188# exclusive option test
189DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
11fdf7f2 190get_pid
31f18b77 191
7c673cae
FG
192_sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
193expect_false timeout 10 \
194 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
195_sudo rbd-nbd unmap ${DEV}
11fdf7f2
TL
196DEV=
197rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
198
199# unmap by image name test
200DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
201get_pid
202_sudo rbd-nbd unmap "${IMAGE}"
203rbd-nbd list-mapped | expect_false grep "${DEV} $"
204DEV=
205ps -p ${PID} -o cmd | expect_false grep rbd-nbd
206
207# map/unmap snap test
208rbd snap create ${POOL}/${IMAGE}@snap
209DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}@snap`
210get_pid
211_sudo rbd-nbd unmap "${IMAGE}@snap"
212rbd-nbd list-mapped | expect_false grep "${DEV} $"
213DEV=
214ps -p ${PID} -o cmd | expect_false grep rbd-nbd
215
216# map/unmap namespace test
217rbd snap create ${POOL}/${NS}/${IMAGE}@snap
218DEV=`_sudo rbd-nbd map ${POOL}/${NS}/${IMAGE}@snap`
219get_pid ${NS}
220_sudo rbd-nbd unmap "${POOL}/${NS}/${IMAGE}@snap"
221rbd-nbd list-mapped | expect_false grep "${DEV} $"
222DEV=
223ps -p ${PID} -o cmd | expect_false grep rbd-nbd
31f18b77
FG
224
225# auto unmap test
226DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
11fdf7f2 227get_pid
31f18b77
FG
228_sudo kill ${PID}
229for i in `seq 10`; do
230 rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" && break
231 sleep 1
232done
233rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}"
234
7c673cae 235echo OK