]>
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} | |
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 | ||
89 | cleanup() | |
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 | ||
103 | expect_false() | |
104 | { | |
105 | if "$@"; then return 1; else return 0; fi | |
106 | } | |
107 | ||
108 | # | |
109 | # main | |
110 | # | |
111 | ||
112 | setup | |
113 | ||
11fdf7f2 | 114 | echo exit status test |
d2e6a577 FG |
115 | expect_false rbd-ggate |
116 | expect_false rbd-ggate INVALIDCMD | |
117 | if [ `id -u` -ne 0 ] | |
118 | then | |
119 | expect_false rbd-ggate map ${IMAGE} | |
120 | fi | |
121 | expect_false _sudo rbd-ggate map INVALIDIMAGE | |
122 | ||
11fdf7f2 | 123 | echo map test using the first unused device |
d2e6a577 | 124 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` |
11fdf7f2 | 125 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 | 126 | |
11fdf7f2 | 127 | echo map test specifying the device |
d2e6a577 FG |
128 | expect_false _sudo rbd-ggate --device ${DEV} map ${POOL}/${IMAGE} |
129 | dev1=${DEV} | |
130 | _sudo rbd-ggate unmap ${DEV} | |
11fdf7f2 | 131 | rbd-ggate list | expect_false grep " ${DEV} *$" |
d2e6a577 FG |
132 | DEV= |
133 | # XXX: race possible when the device is reused by other process | |
134 | DEV=`_sudo rbd-ggate --device ${dev1} map ${POOL}/${IMAGE}` | |
135 | [ "${DEV}" = "${dev1}" ] | |
11fdf7f2 TL |
136 | rbd-ggate list | grep " ${DEV} *$" |
137 | ||
138 | echo list format test | |
139 | expect_false _sudo rbd-ggate --format INVALID list | |
140 | rbd-ggate --format json --pretty-format list | |
141 | rbd-ggate --format xml list | |
d2e6a577 | 142 | |
11fdf7f2 | 143 | echo read test |
d2e6a577 FG |
144 | [ "`dd if=${DATA} bs=1M | md5`" = "`_sudo dd if=${DEV} bs=1M | md5`" ] |
145 | ||
11fdf7f2 | 146 | echo write test |
d2e6a577 FG |
147 | dd 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 | 152 | echo trim test |
d2e6a577 FG |
153 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | |
154 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
155 | used=`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 | |
160 | provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
161 | $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .` | |
162 | used=`rbd -p ${POOL} --format xml du ${IMAGE} | | |
163 | $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .` | |
164 | [ "${used}" -lt "${provisioned}" ] | |
165 | ||
11fdf7f2 | 166 | echo resize test |
d2e6a577 FG |
167 | devname=$(basename ${DEV}) |
168 | size=$(geom gate list ${devname} | awk '$1 ~ /Mediasize:/ {print $2}') | |
169 | test -n "${size}" | |
170 | rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M | |
171 | rbd info ${POOL}/${IMAGE} | |
172 | if [ -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 | 178 | else |
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} | |
195 | fi | |
196 | DEV= | |
197 | ||
11fdf7f2 | 198 | echo read-only option test |
d2e6a577 FG |
199 | DEV=`_sudo rbd-ggate map --read-only ${POOL}/${IMAGE}` |
200 | devname=$(basename ${DEV}) | |
11fdf7f2 | 201 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 FG |
202 | access=$(geom gate list ${devname} | awk '$1 == "access:" {print $2}') |
203 | test "${access}" = "read-only" | |
204 | _sudo dd if=${DEV} of=/dev/null bs=1M | |
205 | expect_false _sudo dd if=${DATA} of=${DEV} bs=1M | |
206 | _sudo rbd-ggate unmap ${DEV} | |
207 | ||
11fdf7f2 | 208 | echo exclusive option test |
d2e6a577 | 209 | DEV=`_sudo rbd-ggate map --exclusive ${POOL}/${IMAGE}` |
11fdf7f2 | 210 | rbd-ggate list | grep " ${DEV} *$" |
d2e6a577 FG |
211 | _sudo dd if=${DATA} of=${DEV} bs=1M |
212 | _sudo sync | |
213 | expect_false timeout 10 \ | |
214 | rbd -p ${POOL} bench ${IMAGE} --io-type=write --io-size=1024 --io-total=1024 | |
215 | _sudo rbd-ggate unmap ${DEV} | |
216 | DEV= | |
217 | rbd bench -p ${POOL} ${IMAGE} --io-type=write --io-size=1024 --io-total=1024 | |
218 | ||
11fdf7f2 TL |
219 | echo unmap by image name test |
220 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}` | |
221 | rbd-ggate list | grep " ${DEV} *$" | |
222 | _sudo rbd-ggate unmap "${POOL}/${IMAGE}" | |
223 | rbd-ggate list | expect_false grep " ${DEV} *$" | |
224 | DEV= | |
225 | ||
226 | echo map/unmap snap test | |
227 | rbd snap create ${POOL}/${IMAGE}@snap | |
228 | DEV=`_sudo rbd-ggate map ${POOL}/${IMAGE}@snap` | |
229 | rbd-ggate list | grep " ${DEV} *$" | |
230 | _sudo rbd-ggate unmap "${POOL}/${IMAGE}@snap" | |
231 | rbd-ggate list | expect_false grep " ${DEV} *$" | |
232 | DEV= | |
233 | ||
234 | echo map/unmap namespace test | |
235 | rbd snap create ${POOL}/${NS}/${IMAGE}@snap | |
236 | DEV=`_sudo rbd-ggate map ${POOL}/${NS}/${IMAGE}@snap` | |
237 | rbd-ggate list | grep " ${DEV} *$" | |
238 | _sudo rbd-ggate unmap "${POOL}/${NS}/${IMAGE}@snap" | |
239 | rbd-ggate list | expect_false grep "${DEV} $" | |
240 | DEV= | |
241 | ||
d2e6a577 | 242 | echo OK |