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