]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/rbd-ggate.sh
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / qa / workunits / rbd / rbd-ggate.sh
CommitLineData
d2e6a577
FG
1#!/bin/sh -ex
2
3POOL=testrbdggate$$
11fdf7f2 4NS=ns
d2e6a577
FG
5IMAGE=test
6SIZE=64
7DATA=
8DEV=
9
10if which xmlstarlet > /dev/null 2>&1; then
11 XMLSTARLET=xmlstarlet
12elif which xml > /dev/null 2>&1; then
13 XMLSTARLET=xml
14else
15 echo "Missing xmlstarlet binary!"
16 exit 1
17fi
18
11fdf7f2
TL
19if [ `uname -K` -ge 1200078 ] ; then
20 RBD_GGATE_RESIZE_SUPPORTED=1
21fi
22
d2e6a577
FG
23_sudo()
24{
25 local cmd
26
27 if [ `id -u` -eq 0 ]
28 then
29 "$@"
30 return $?
31 fi
32
33 # Look for the command in the user path. If it fails run it as is,
34 # supposing it is in sudo path.
35 cmd=`which $1 2>/dev/null` || cmd=$1
36 shift
37 sudo -nE "${cmd}" "$@"
38}
39
11fdf7f2
TL
40check_geom_gate()
41{
42 # See if geom_date is load, or can be loaded.
43 # Otherwise the tests can not run
44 if ! kldstat -q -n geom_gate ; then
45 # See if we can load it
46 if ! _sudo kldload geom_gate ; then
47 echo Not able to load geom_gate
48 echo check /var/log/messages as to why
49 exit 1
50 fi
51 fi
52}
53
d2e6a577
FG
54setup()
55{
11fdf7f2
TL
56 local ns x
57
d2e6a577
FG
58 if [ -e CMakeCache.txt ]; then
59 # running under cmake build dir
60
61 CEPH_SRC=$(readlink -f $(dirname $0)/../../../src)
62 CEPH_ROOT=${PWD}
63 CEPH_BIN=${CEPH_ROOT}/bin
64
65 export LD_LIBRARY_PATH=${CEPH_ROOT}/lib:${LD_LIBRARY_PATH}
66 export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind
67 for x in ${CEPH_ROOT}/lib/cython_modules/lib* ; do
68 PYTHONPATH="${PYTHONPATH}:${x}"
69 done
70 PATH=${CEPH_BIN}:${PATH}
71 fi
72
73 _sudo echo test sudo
11fdf7f2 74 check_geom_gate
d2e6a577
FG
75
76 trap cleanup INT TERM EXIT
77 TEMPDIR=`mktemp -d`
78 DATA=${TEMPDIR}/data
79 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
11fdf7f2
TL
80 ceph osd pool create ${POOL} 32
81
82 rbd namespace create ${POOL}/${NS}
83 for ns in '' ${NS}; do
84 rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \
85 ${DATA} ${IMAGE}
86 done
d2e6a577
FG
87}
88
89cleanup()
90{
11fdf7f2
TL
91 local ns s
92
d2e6a577
FG
93 set +e
94 rm -Rf ${TEMPDIR}
95 if [ -n "${DEV}" ]
96 then
97 _sudo rbd-ggate unmap ${DEV}
98 fi
11fdf7f2 99
d2e6a577
FG
100 ceph osd pool delete ${POOL} ${POOL} --yes-i-really-really-mean-it
101}
102
103expect_false()
104{
105 if "$@"; then return 1; else return 0; fi
106}
107
108#
109# main
110#
111
112setup
113
11fdf7f2 114echo exit status test
d2e6a577
FG
115expect_false rbd-ggate
116expect_false rbd-ggate INVALIDCMD
117if [ `id -u` -ne 0 ]
118then
119 expect_false rbd-ggate map ${IMAGE}
120fi
121expect_false _sudo rbd-ggate map INVALIDIMAGE
122
11fdf7f2 123echo map test using the first unused device
d2e6a577 124DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}`
11fdf7f2 125rbd-ggate list | grep " ${DEV} *$"
d2e6a577 126
11fdf7f2 127echo map test specifying the device
d2e6a577
FG
128expect_false _sudo rbd-ggate --device ${DEV} map ${POOL}/${IMAGE}
129dev1=${DEV}
130_sudo rbd-ggate unmap ${DEV}
11fdf7f2 131rbd-ggate list | expect_false grep " ${DEV} *$"
d2e6a577
FG
132DEV=
133# XXX: race possible when the device is reused by other process
134DEV=`_sudo rbd-ggate --device ${dev1} map ${POOL}/${IMAGE}`
135[ "${DEV}" = "${dev1}" ]
11fdf7f2
TL
136rbd-ggate list | grep " ${DEV} *$"
137
138echo list format test
139expect_false _sudo rbd-ggate --format INVALID list
140rbd-ggate --format json --pretty-format list
141rbd-ggate --format xml list
d2e6a577 142
11fdf7f2 143echo read test
d2e6a577
FG
144[ "`dd if=${DATA} bs=1M | md5`" = "`_sudo dd if=${DEV} bs=1M | md5`" ]
145
11fdf7f2 146echo write test
d2e6a577
FG
147dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
148_sudo dd if=${DATA} of=${DEV} bs=1M
149_sudo sync
150[ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
151
11fdf7f2 152echo trim test
d2e6a577
FG
153provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
154 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
155used=`rbd -p ${POOL} --format xml du ${IMAGE} |
156 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
157[ "${used}" -eq "${provisioned}" ]
158_sudo newfs -E ${DEV}
159_sudo sync
160provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
161 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
162used=`rbd -p ${POOL} --format xml du ${IMAGE} |
163 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
164[ "${used}" -lt "${provisioned}" ]
165
11fdf7f2 166echo resize test
d2e6a577
FG
167devname=$(basename ${DEV})
168size=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
169test -n "${size}"
170rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
171rbd info ${POOL}/${IMAGE}
172if [ -z "$RBD_GGATE_RESIZE_SUPPORTED" ]; then
11fdf7f2
TL
173 # when resizing is not supported:
174 # resizing the underlying image for a GEOM ggate will stop the
175 # ggate process servicing the device. So we can resize and test
176 # the disappearance of the device
177 rbd-ggate list | expect_false grep " ${DEV} *$"
d2e6a577 178else
11fdf7f2 179 rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
180 size2=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
181 test -n "${size2}"
182 test ${size2} -eq $((size * 2))
183 dd if=/dev/urandom of=${DATA} bs=1M count=$((SIZE * 2))
184 _sudo dd if=${DATA} of=${DEV} bs=1M
185 _sudo sync
186 [ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
187 rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
188 rbd info ${POOL}/${IMAGE}
189 size2=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
190 test -n "${size2}"
191 test ${size2} -eq ${size}
192 truncate -s ${SIZE}M ${DATA}
193 [ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
194 _sudo rbd-ggate unmap ${DEV}
195fi
196DEV=
197
11fdf7f2 198echo read-only option test
d2e6a577
FG
199DEV=`_sudo rbd-ggate map --read-only ${POOL}/${IMAGE}`
200devname=$(basename ${DEV})
11fdf7f2 201rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
202access=$(geom gate list ${devname} | awk '$1 == "access:" {print $2}')
203test "${access}" = "read-only"
204_sudo dd if=${DEV} of=/dev/null bs=1M
205expect_false _sudo dd if=${DATA} of=${DEV} bs=1M
206_sudo rbd-ggate unmap ${DEV}
207
11fdf7f2 208echo exclusive option test
d2e6a577 209DEV=`_sudo rbd-ggate map --exclusive ${POOL}/${IMAGE}`
11fdf7f2 210rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
211_sudo dd if=${DATA} of=${DEV} bs=1M
212_sudo sync
213expect_false timeout 10 \
214 rbd -p ${POOL} bench ${IMAGE} --io-type=write --io-size=1024 --io-total=1024
215_sudo rbd-ggate unmap ${DEV}
216DEV=
217rbd bench -p ${POOL} ${IMAGE} --io-type=write --io-size=1024 --io-total=1024
218
11fdf7f2
TL
219echo unmap by image name test
220DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}`
221rbd-ggate list | grep " ${DEV} *$"
222_sudo rbd-ggate unmap "${POOL}/${IMAGE}"
223rbd-ggate list | expect_false grep " ${DEV} *$"
224DEV=
225
226echo map/unmap snap test
227rbd snap create ${POOL}/${IMAGE}@snap
228DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}@snap`
229rbd-ggate list | grep " ${DEV} *$"
230_sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap"
231rbd-ggate list | expect_false grep " ${DEV} *$"
232DEV=
233
234echo map/unmap namespace test
235rbd snap create ${POOL}/${NS}/${IMAGE}@snap
236DEV=`_sudo rbd-ggate map ${POOL}/${NS}/${IMAGE}@snap`
237rbd-ggate list | grep " ${DEV} *$"
238_sudo rbd-ggate unmap "${POOL}/${NS}/${IMAGE}@snap"
239rbd-ggate list | expect_false grep "${DEV} $"
240DEV=
241
d2e6a577 242echo OK