Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / qa / workunits / rbd / rbd-nbd.sh
1 #!/bin/bash -ex
2
3 . $(dirname $0)/../../standalone/ceph-helpers.sh
4
5 POOL=rbd
6 IMAGE=testrbdnbd$$
7 SIZE=64
8 DATA=
9 DEV=
10
11 _sudo()
12 {
13     local cmd
14
15     if [ `id -u` -eq 0 ]
16     then
17         "$@"
18         return $?
19     fi
20
21     # Look for the command in the user path. If it fails run it as is,
22     # supposing it is in sudo path.
23     cmd=`which $1 2>/dev/null` || cmd=$1
24     shift
25     sudo -nE "${cmd}" "$@"
26 }
27
28 setup()
29 {
30     if [ -e CMakeCache.txt ]; then
31         # running under cmake build dir
32
33         CEPH_SRC=$(readlink -f $(dirname $0)/../../../src)
34         CEPH_ROOT=${PWD}
35         CEPH_BIN=${CEPH_ROOT}/bin
36
37         export LD_LIBRARY_PATH=${CEPH_ROOT}/lib:${LD_LIBRARY_PATH}
38         export PYTHONPATH=${PYTHONPATH}:${CEPH_SRC}/pybind
39         for x in ${CEPH_ROOT}/lib/cython_modules/lib* ; do
40             PYTHONPATH="${PYTHONPATH}:${x}"
41         done
42         PATH=${CEPH_BIN}:${PATH}
43     fi
44
45     _sudo echo test sudo
46
47     trap cleanup INT TERM EXIT
48     TEMPDIR=`mktemp -d`
49     DATA=${TEMPDIR}/data
50     dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
51     rbd --dest-pool ${POOL} --no-progress import ${DATA} ${IMAGE}
52 }
53
54 function cleanup()
55 {
56     set +e
57     rm -Rf ${TMPDIR}
58     if [ -n "${DEV}" ]
59     then
60         _sudo rbd-nbd unmap ${DEV}
61     fi
62     if rbd -p ${POOL} status ${IMAGE} 2>/dev/null; then
63         for s in 0.5 1 2 4 8 16 32; do
64             sleep $s
65             rbd -p ${POOL} status ${IMAGE} | grep 'Watchers: none' && break
66         done
67         rbd -p ${POOL} remove ${IMAGE}
68     fi
69 }
70
71 function expect_false()
72 {
73   if "$@"; then return 1; else return 0; fi
74 }
75
76 #
77 # main
78 #
79
80 setup
81
82 # exit status test
83 expect_false rbd-nbd
84 expect_false rbd-nbd INVALIDCMD
85 if [ `id -u` -ne 0 ]
86 then
87     expect_false rbd-nbd map ${IMAGE}
88 fi
89 expect_false _sudo rbd-nbd map INVALIDIMAGE
90 expect_false _sudo rbd-nbd --device INVALIDDEV map ${IMAGE}
91
92 # map test using the first unused device
93 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
94 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
95     '$2 == pool && $3 == img && $5 == dev {print $1}')
96 test -n "${PID}"
97 ps -p ${PID} -o cmd | grep rbd-nbd
98 # map test specifying the device
99 expect_false _sudo rbd-nbd --device ${DEV} map ${POOL}/${IMAGE}
100 dev1=${DEV}
101 _sudo rbd-nbd unmap ${DEV}
102 rbd-nbd list-mapped | expect_false grep "${DEV} $"
103 DEV=
104 # XXX: race possible when the device is reused by other process
105 DEV=`_sudo rbd-nbd --device ${dev1} map ${POOL}/${IMAGE}`
106 [ "${DEV}" = "${dev1}" ]
107 rbd-nbd list-mapped | grep "${IMAGE}"
108 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
109     '$2 == pool && $3 == img && $5 == dev {print $1}')
110 test -n "${PID}"
111 ps -p ${PID} -o cmd | grep rbd-nbd
112
113 # read test
114 [ "`dd if=${DATA} bs=1M | md5sum`" = "`_sudo dd if=${DEV} bs=1M | md5sum`" ]
115
116 # write test
117 dd if=/dev/urandom of=${DATA} bs=1M count=${SIZE}
118 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
119 [ "`dd if=${DATA} bs=1M | md5sum`" = "`rbd -p ${POOL} --no-progress export ${IMAGE} - | md5sum`" ]
120
121 # trim test
122 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
123   $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
124 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
125   $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
126 [ "${used}" -eq "${provisioned}" ]
127 _sudo mkfs.ext4 -E discard ${DEV} # better idea?
128 sync
129 provisioned=`rbd -p ${POOL} --format xml du ${IMAGE} |
130   $XMLSTARLET sel -t -m "//stats/images/image/provisioned_size" -v .`
131 used=`rbd -p ${POOL} --format xml du ${IMAGE} |
132   $XMLSTARLET sel -t -m "//stats/images/image/used_size" -v .`
133 [ "${used}" -lt "${provisioned}" ]
134
135 # resize test
136 devname=$(basename ${DEV})
137 blocks=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
138 test -n "${blocks}"
139 rbd resize ${POOL}/${IMAGE} --size $((SIZE * 2))M
140 rbd info ${POOL}/${IMAGE}
141 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
142 test -n "${blocks2}"
143 test ${blocks2} -eq $((blocks * 2))
144 rbd resize ${POOL}/${IMAGE} --allow-shrink --size ${SIZE}M
145 blocks2=$(awk -v dev=${devname} '$4 == dev {print $3}' /proc/partitions)
146 test -n "${blocks2}"
147 test ${blocks2} -eq ${blocks}
148
149 # read-only option test
150 _sudo rbd-nbd unmap ${DEV}
151 DEV=`_sudo rbd-nbd map --read-only ${POOL}/${IMAGE}`
152 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
153     '$2 == pool && $3 == img && $5 == dev {print $1}')
154 test -n "${PID}"
155 ps -p ${PID} -o cmd | grep rbd-nbd
156
157 _sudo dd if=${DEV} of=/dev/null bs=1M
158 expect_false _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
159 _sudo rbd-nbd unmap ${DEV}
160
161 # exclusive option test
162 DEV=`_sudo rbd-nbd map --exclusive ${POOL}/${IMAGE}`
163 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
164     '$2 == pool && $3 == img && $5 == dev {print $1}')
165 test -n "${PID}"
166 ps -p ${PID} -o cmd | grep rbd-nbd
167
168 _sudo dd if=${DATA} of=${DEV} bs=1M oflag=direct
169 expect_false timeout 10 \
170         rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
171 _sudo rbd-nbd unmap ${DEV}
172
173 # auto unmap test
174 DEV=`_sudo rbd-nbd map ${POOL}/${IMAGE}`
175 PID=$(rbd-nbd list-mapped | awk -v pool=${POOL} -v img=${IMAGE} -v dev=${DEV} \
176     '$2 == pool && $3 == img && $5 == dev {print $1}')
177 test -n "${PID}"
178 ps -p ${PID} -o cmd | grep rbd-nbd
179 _sudo kill ${PID}
180 for i in `seq 10`; do
181   rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}" && break
182   sleep 1
183 done
184 rbd-nbd list-mapped | expect_false grep "^${PID} *${POOL} *${IMAGE}"
185
186 DEV=
187 rbd bench ${IMAGE} --io-type write --io-size=1024 --io-total=1024
188
189 echo OK