4 . $
(dirname $0)/..
/..
/standalone
/ceph-helpers.sh
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
27 sudo
-nE "${cmd}" "$@"
34 if [ -e CMakeCache.txt
]; then
35 # running under cmake build dir
37 CEPH_SRC
=$
(readlink
-f $
(dirname $0)/..
/..
/..
/src
)
39 CEPH_BIN
=${CEPH_ROOT}/bin
41 export LD_LIBRARY_PATH
=${CEPH_ROOT}/lib
:${LD_LIBRARY_PATH}
42 export PYTHONPATH
=${PYTHONPATH}:${CEPH_SRC}/pybind:${CEPH_ROOT}/lib
/cython_modules
/lib
.3
43 PATH
=${CEPH_BIN}:${PATH}
48 trap cleanup INT TERM EXIT
51 dd if=/dev
/urandom of
=${DATA} bs
=1M count
=${SIZE}
53 rbd namespace create
${POOL}/${NS}
55 for ns
in '' ${NS}; do
56 rbd
--dest-pool ${POOL} --dest-namespace "${ns}" --no-progress import \
69 _sudo rbd-nbd unmap
${DEV}
72 for ns
in '' ${NS}; do
73 if rbd
-p ${POOL} --namespace "${ns}" status ${IMAGE} 2>/dev
/null
; then
74 for s
in 0.5 1 2 4 8 16 32; do
76 rbd
-p ${POOL} --namespace "${ns}" status ${IMAGE} |
77 grep 'Watchers: none' && break
79 rbd
-p ${POOL} --namespace "${ns}" snap purge ${IMAGE}
80 rbd
-p ${POOL} --namespace "${ns}" remove ${IMAGE}
83 rbd namespace remove
${POOL}/${NS}
86 function expect_false
()
88 if "$@"; then return 1; else return 0; fi
95 PID
=$
(rbd-nbd
--format xml list-mapped |
$XMLSTARLET sel
-t -v \
96 "//devices/device[pool='${POOL}'][namespace='${ns}'][image='${IMAGE}'][device='${DEV}']/id")
98 ps
-p ${PID} -o cmd |
grep rbd-nbd
104 local list_dev
=${2:-$1}
105 _sudo rbd-nbd unmap
${unmap_dev}
107 for s
in 0.5 1 2 4 8 16 32; do
109 rbd-nbd list-mapped | expect_false
grep "${list_dev} *$" && return 0
122 expect_false rbd-nbd INVALIDCMD
125 expect_false rbd-nbd map
${IMAGE}
127 expect_false _sudo rbd-nbd map INVALIDIMAGE
128 expect_false _sudo rbd-nbd
--device INVALIDDEV map
${IMAGE}
131 expect_false rbd-nbd
--format INVALID list-mapped
132 rbd-nbd
--format json
--pretty-format list-mapped
133 rbd-nbd
--format xml list-mapped
135 # map test using the first unused device
136 DEV
=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
138 # map test specifying the device
139 expect_false _sudo rbd-nbd
--device ${DEV} map ${POOL}/${IMAGE}
143 # XXX: race possible when the device is reused by other process
144 DEV
=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
145 [ "${DEV}" = "${dev1}" ]
146 rbd-nbd list-mapped |
grep "${IMAGE}"
150 [ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
153 dd if=/dev
/urandom of
=${DATA} bs
=1M count
=${SIZE}
154 _sudo
dd if=${DATA} of
=${DEV} bs
=1M oflag
=direct
155 [ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
158 provisioned
=`rbd -p ${POOL} --format xml du ${IMAGE} |
159 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
160 used
=`rbd -p ${POOL} --format xml du ${IMAGE} |
161 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
162 [ "${used}" -eq "${provisioned}" ]
163 _sudo mkfs.ext4
-E discard
${DEV} # better idea?
165 provisioned
=`rbd -p ${POOL} --format xml du ${IMAGE} |
166 $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
167 used
=`rbd -p ${POOL} --format xml du ${IMAGE} |
168 $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
169 [ "${used}" -lt "${provisioned}" ]
172 devname
=$
(basename ${DEV})
173 blocks
=$
(awk -v dev
=${devname} '$4 == dev {print $3}' /proc
/partitions
)
175 rbd resize
${POOL}/${IMAGE} --size $
((SIZE
* 2))M
176 rbd info
${POOL}/${IMAGE}
177 blocks2
=$
(awk -v dev
=${devname} '$4 == dev {print $3}' /proc
/partitions
)
179 test ${blocks2} -eq $
((blocks
* 2))
180 rbd resize
${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
181 blocks2
=$
(awk -v dev
=${devname} '$4 == dev {print $3}' /proc
/partitions
)
183 test ${blocks2} -eq ${blocks}
185 # read-only option test
187 DEV
=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
188 PID
=$
(rbd-nbd list-mapped |
awk -v pool
=${POOL} -v img=${IMAGE} -v dev=${DEV} \
189 '$2 == pool && $3 == img && $5 == dev {print $1}')
191 ps
-p ${PID} -o cmd |
grep rbd-nbd
193 _sudo
dd if=${DEV} of
=/dev
/null bs
=1M
194 expect_false _sudo
dd if=${DATA} of
=${DEV} bs
=1M oflag
=direct
197 # exclusive option test
198 DEV
=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
201 _sudo
dd if=${DATA} of
=${DEV} bs
=1M oflag
=direct
202 expect_false timeout
10 \
203 rbd bench
${IMAGE} --io-type write --io-size=1024 --io-total=1024
206 rbd bench
${IMAGE} --io-type write --io-size=1024 --io-total=1024
208 # unmap by image name test
209 DEV
=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
211 unmap_device
${IMAGE} ${DEV}
213 ps
-p ${PID} -o cmd | expect_false
grep rbd-nbd
215 # map/unmap snap test
216 rbd snap create
${POOL}/${IMAGE}@snap
217 DEV
=`_sudo rbd-nbd map ${POOL}/${IMAGE}@snap`
219 unmap_device
"${IMAGE}@snap" ${DEV}
221 ps
-p ${PID} -o cmd | expect_false
grep rbd-nbd
223 # map/unmap namespace test
224 rbd snap create
${POOL}/${NS}/${IMAGE}@snap
225 DEV
=`_sudo rbd-nbd map ${POOL}/${NS}/${IMAGE}@snap`
227 unmap_device
"${POOL}/${NS}/${IMAGE}@snap" ${DEV}
229 ps -p ${PID} -o cmd | expect_false grep rbd-nbd
232 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
235 for i in `seq 10`; do
236 rbd-nbd list-mapped | expect_false grep "^
${PID} *${POOL} *${IMAGE}" && break
239 rbd-nbd list-mapped | expect_false grep "^
${PID} *${POOL} *${IMAGE}"