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