]>
Commit | Line | Data |
---|---|---|
d2e6a577 FG |
1 | #!/bin/sh -ex |
2 | ||
3 | POOL=testrbdggate$$ | |
11fdf7f2 | 4 | NS=ns |
d2e6a577 FG |
5 | IMAGE=test |
6 | SIZE=64 | |
7 | DATA= | |
8 | DEV= | |
9 | ||
10 | if which xmlstarlet > /dev/null 2>&1; then | |
11 | XMLSTARLET=xmlstarlet | |
12 | elif which xml > /dev/null 2>&1; then | |
13 | XMLSTARLET=xml | |
14 | else | |
15 | echo "Missing xmlstarlet binary!" | |
16 | exit 1 | |
17 | fi | |
18 | ||
11fdf7f2 TL |
19 | if [ `uname -K` -ge 1200078 ] ; then |
20 | RBD_GGATE_RESIZE_SUPPORTED=1 | |
21 | fi | |
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 |
40 | check_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 |
54 | setup() |
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 | ||
86 | cleanup() | |
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 | ||
100 | expect_false() | |
101 | { | |
102 | if "$@"; then return 1; else return 0; fi | |
103 | } | |
104 | ||
105 | # | |
106 | # main | |
107 | # | |
108 | ||
109 | setup | |
110 | ||
11fdf7f2 | 111 | echo exit status test |
d2e6a577 FG |
112 | expect_false rbd-ggate |
113 | expect_false rbd-ggate INVALIDCMD | |
114 | if [ `id -u` -ne 0 ] | |
115 | then | |
116 | expect_false rbd-ggate map ${IMAGE} | |
117 | fi | |
118 | expect_false _sudo rbd-ggate map INVALIDIMAGE | |
119 | ||
11fdf7f2 | 120 | echo map test using the first unused device |
d2e6a577 | 121 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` |
11fdf7f2 | 122 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 | 123 | |
11fdf7f2 | 124 | echo map test specifying the device |
d2e6a577 FG |
125 | expect_false _sudo rbd-ggate --device ${DEV} map ${POOL}/${IMAGE} |
126 | dev1=${DEV} | |
127 | _sudo rbd-ggate unmap ${DEV} | |
11fdf7f2 | 128 | rbd-ggate list | expect_false grep " ${DEV} *$" |
d2e6a577 FG |
129 | DEV= |
130 | # XXX: race possible when the device is reused by other process | |
131 | DEV=`_sudo rbd-ggate --device ${dev1} map ${POOL}/${IMAGE}` | |
132 | [ "${DEV}" = "${dev1}" ] | |
11fdf7f2 TL |
133 | rbd-ggate list | grep " ${DEV} *$" |
134 | ||
135 | echo list format test | |
136 | expect_false _sudo rbd-ggate --format INVALID list | |
137 | rbd-ggate --format json --pretty-format list | |
138 | rbd-ggate --format xml list | |
d2e6a577 | 139 | |
11fdf7f2 | 140 | echo read test |
d2e6a577 FG |
141 | [ "`dd if=${DATA} bs=1M | md5`" = "`_sudo dd if=${DEV} bs=1M | md5`" ] |
142 | ||
11fdf7f2 | 143 | echo write test |
d2e6a577 FG |
144 | dd 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 | 149 | echo trim test |
d2e6a577 FG |
150 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | |
151 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
152 | used=`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 | |
157 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
158 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
159 | used=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
160 | $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .` | |
161 | [ "${used}" -lt "${provisioned}" ] | |
162 | ||
11fdf7f2 | 163 | echo resize test |
d2e6a577 FG |
164 | devname=$(basename ${DEV}) |
165 | size=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}') | |
166 | test -n "${size}" | |
167 | rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M | |
168 | rbd info ${POOL}/${IMAGE} | |
169 | if [ -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 | 175 | else |
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} | |
192 | fi | |
193 | DEV= | |
194 | ||
11fdf7f2 | 195 | echo read-only option test |
d2e6a577 FG |
196 | DEV=`_sudo rbd-ggate map --read-only ${POOL}/${IMAGE}` |
197 | devname=$(basename ${DEV}) | |
11fdf7f2 | 198 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 FG |
199 | access=$(geom gate list ${devname} | awk '$1 == "access:" {print $2}') |
200 | test "${access}" = "read-only" | |
201 | _sudo dd if=${DEV} of=/dev/null bs=1M | |
202 | expect_false _sudo dd if=${DATA} of=${DEV} bs=1M | |
203 | _sudo rbd-ggate unmap ${DEV} | |
204 | ||
11fdf7f2 | 205 | echo exclusive option test |
d2e6a577 | 206 | DEV=`_sudo rbd-ggate map --exclusive ${POOL}/${IMAGE}` |
11fdf7f2 | 207 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 FG |
208 | _sudo dd if=${DATA} of=${DEV} bs=1M |
209 | _sudo sync | |
210 | expect_false timeout 10 \ | |
211 | rbd -p ${POOL} bench ${IMAGE} --io-type=write --io-size=1024 --io-total=1024 | |
212 | _sudo rbd-ggate unmap ${DEV} | |
213 | DEV= | |
214 | rbd bench -p ${POOL} ${IMAGE} --io-type=write --io-size=1024 --io-total=1024 | |
215 | ||
11fdf7f2 TL |
216 | echo unmap by image name test |
217 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` | |
218 | rbd-ggate list | grep " ${DEV} *$" | |
219 | _sudo rbd-ggate unmap "${POOL}/${IMAGE}" | |
220 | rbd-ggate list | expect_false grep " ${DEV} *$" | |
221 | DEV= | |
222 | ||
223 | echo map/unmap snap test | |
224 | rbd snap create ${POOL}/${IMAGE}@snap | |
225 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}@snap` | |
226 | rbd-ggate list | grep " ${DEV} *$" | |
227 | _sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap" | |
228 | rbd-ggate list | expect_false grep " ${DEV} *$" | |
229 | DEV= | |
230 | ||
231 | echo map/unmap namespace test | |
232 | rbd snap create ${POOL}/${NS}/${IMAGE}@snap | |
233 | DEV=`_sudo rbd-ggate map ${POOL}/${NS}/${IMAGE}@snap` | |
234 | rbd-ggate list | grep " ${DEV} *$" | |
235 | _sudo rbd-ggate unmap "${POOL}/${NS}/${IMAGE}@snap" | |
236 | rbd-ggate list | expect_false grep "${DEV} $" | |
237 | DEV= | |
238 | ||
d2e6a577 | 239 | echo OK |