]> git.proxmox.com Git - ceph.git/blame - ceph/qa/workunits/rbd/rbd-ggate.sh
bump version to 18.2.4-pve3
[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}
9f95a23c 66 export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind:${CEPH_ROOT}/lib/cython_modules/lib.3
d2e6a577
FG
67 PATH=${CEPH_BIN}:${PATH}
68 fi
69
70 _sudo echo test sudo
11fdf7f2 71 check_geom_gate
d2e6a577
FG
72
73 trap cleanup INT TERM EXIT
74 TEMPDIR=`mktemp -d`
75 DATA=${TEMPDIR}/data
76 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
11fdf7f2
TL
77 ceph osd pool create ${POOL} 32
78
79 rbd namespace create ${POOL}/${NS}
80 for ns in '' ${NS}; do
81 rbd --dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \
82 ${DATA} ${IMAGE}
83 done
d2e6a577
FG
84}
85
86cleanup()
87{
11fdf7f2
TL
88 local ns s
89
d2e6a577
FG
90 set +e
91 rm -Rf ${TEMPDIR}
92 if [ -n "${DEV}" ]
93 then
94 _sudo rbd-ggate unmap ${DEV}
95 fi
11fdf7f2 96
d2e6a577
FG
97 ceph osd pool delete ${POOL} ${POOL} --yes-i-really-really-mean-it
98}
99
100expect_false()
101{
102 if "$@"; then return 1; else return 0; fi
103}
104
105#
106# main
107#
108
109setup
110
11fdf7f2 111echo exit status test
d2e6a577
FG
112expect_false rbd-ggate
113expect_false rbd-ggate INVALIDCMD
114if [ `id -u` -ne 0 ]
115then
116 expect_false rbd-ggate map ${IMAGE}
117fi
118expect_false _sudo rbd-ggate map INVALIDIMAGE
119
11fdf7f2 120echo map test using the first unused device
d2e6a577 121DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}`
11fdf7f2 122rbd-ggate list | grep " ${DEV} *$"
d2e6a577 123
11fdf7f2 124echo map test specifying the device
d2e6a577
FG
125expect_false _sudo rbd-ggate --device ${DEV} map ${POOL}/${IMAGE}
126dev1=${DEV}
127_sudo rbd-ggate unmap ${DEV}
11fdf7f2 128rbd-ggate list | expect_false grep " ${DEV} *$"
d2e6a577
FG
129DEV=
130# XXX: race possible when the device is reused by other process
131DEV=`_sudo rbd-ggate --device ${dev1} map ${POOL}/${IMAGE}`
132[ "${DEV}" = "${dev1}" ]
11fdf7f2
TL
133rbd-ggate list | grep " ${DEV} *$"
134
135echo list format test
136expect_false _sudo rbd-ggate --format INVALID list
137rbd-ggate --format json --pretty-format list
138rbd-ggate --format xml list
d2e6a577 139
11fdf7f2 140echo read test
d2e6a577
FG
141[ "`dd if=${DATA} bs=1M | md5`" = "`_sudo dd if=${DEV} bs=1M | md5`" ]
142
11fdf7f2 143echo write test
d2e6a577
FG
144dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
145_sudo dd if=${DATA} of=${DEV} bs=1M
146_sudo sync
147[ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
148
11fdf7f2 149echo trim test
d2e6a577
FG
150provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
151 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
152used=`rbd -p ${POOL} --format xml du ${IMAGE} |
153 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
154[ "${used}" -eq "${provisioned}" ]
155_sudo newfs -E ${DEV}
156_sudo sync
157provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
158 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
159used=`rbd -p ${POOL} --format xml du ${IMAGE} |
160 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
161[ "${used}" -lt "${provisioned}" ]
162
11fdf7f2 163echo resize test
d2e6a577
FG
164devname=$(basename ${DEV})
165size=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
166test -n "${size}"
167rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
168rbd info ${POOL}/${IMAGE}
169if [ -z "$RBD_GGATE_RESIZE_SUPPORTED" ]; then
11fdf7f2
TL
170 # when resizing is not supported:
171 # resizing the underlying image for a GEOM ggate will stop the
172 # ggate process servicing the device. So we can resize and test
173 # the disappearance of the device
174 rbd-ggate list | expect_false grep " ${DEV} *$"
d2e6a577 175else
11fdf7f2 176 rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
177 size2=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
178 test -n "${size2}"
179 test ${size2} -eq $((size * 2))
180 dd if=/dev/urandom of=${DATA} bs=1M count=$((SIZE * 2))
181 _sudo dd if=${DATA} of=${DEV} bs=1M
182 _sudo sync
183 [ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
184 rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
185 rbd info ${POOL}/${IMAGE}
186 size2=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}')
187 test -n "${size2}"
188 test ${size2} -eq ${size}
189 truncate -s ${SIZE}M ${DATA}
190 [ "`dd if=${DATA} bs=1M | md5`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5`" ]
191 _sudo rbd-ggate unmap ${DEV}
192fi
193DEV=
194
11fdf7f2 195echo read-only option test
d2e6a577
FG
196DEV=`_sudo rbd-ggate map --read-only ${POOL}/${IMAGE}`
197devname=$(basename ${DEV})
11fdf7f2 198rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
199access=$(geom gate list ${devname} | awk '$1 == "access:" {print $2}')
200test "${access}" = "read-only"
201_sudo dd if=${DEV} of=/dev/null bs=1M
202expect_false _sudo dd if=${DATA} of=${DEV} bs=1M
203_sudo rbd-ggate unmap ${DEV}
204
11fdf7f2 205echo exclusive option test
d2e6a577 206DEV=`_sudo rbd-ggate map --exclusive ${POOL}/${IMAGE}`
11fdf7f2 207rbd-ggate list | grep " ${DEV} *$"
d2e6a577
FG
208_sudo dd if=${DATA} of=${DEV} bs=1M
209_sudo sync
210expect_false timeout 10 \
211 rbd -p ${POOL} bench ${IMAGE} --io-type=write --io-size=1024 --io-total=1024
212_sudo rbd-ggate unmap ${DEV}
213DEV=
214rbd bench -p ${POOL} ${IMAGE} --io-type=write --io-size=1024 --io-total=1024
215
11fdf7f2
TL
216echo unmap by image name test
217DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}`
218rbd-ggate list | grep " ${DEV} *$"
219_sudo rbd-ggate unmap "${POOL}/${IMAGE}"
220rbd-ggate list | expect_false grep " ${DEV} *$"
221DEV=
222
223echo map/unmap snap test
224rbd snap create ${POOL}/${IMAGE}@snap
225DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}@snap`
226rbd-ggate list | grep " ${DEV} *$"
227_sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap"
228rbd-ggate list | expect_false grep " ${DEV} *$"
229DEV=
230
231echo map/unmap namespace test
232rbd snap create ${POOL}/${NS}/${IMAGE}@snap
233DEV=`_sudo rbd-ggate map ${POOL}/${NS}/${IMAGE}@snap`
234rbd-ggate list | grep " ${DEV} *$"
235_sudo rbd-ggate unmap "${POOL}/${NS}/${IMAGE}@snap"
236rbd-ggate list | expect_false grep "${DEV} $"
237DEV=
238
d2e6a577 239echo OK