]> git.proxmox.com Git - ceph.git/blob - ceph/qa/workunits/rbd/test_rbd_tasks.sh
import 14.2.4 nautilus point release
[ceph.git] / ceph / qa / workunits / rbd / test_rbd_tasks.sh
1 #!/usr/bin/env bash
2 set -ex
3
4 POOL=rbd_tasks
5 POOL_NS=ns1
6
7 setup() {
8 trap 'cleanup' INT TERM EXIT
9
10 ceph osd pool create ${POOL} 128
11 rbd pool init ${POOL}
12 rbd namespace create ${POOL}/${POOL_NS}
13
14 TEMPDIR=`mktemp -d`
15 }
16
17 cleanup() {
18 ceph osd pool rm ${POOL} ${POOL} --yes-i-really-really-mean-it
19
20 rm -rf ${TEMPDIR}
21 }
22
23 wait_for() {
24 local TEST_FN=$1
25 shift 1
26 local TEST_FN_ARGS=("$@")
27
28 for s in 1 2 4 8 8 8 8 8 8 8 8 16 16; do
29 sleep ${s}
30
31 ${TEST_FN} "${TEST_FN_ARGS[@]}" || continue
32 return 0
33 done
34 return 1
35 }
36
37 task_exists() {
38 local TASK_ID=$1
39 [[ -z "${TASK_ID}" ]] && exit 1
40
41 ceph rbd task list ${TASK_ID} || return 1
42 return 0
43 }
44
45 task_dne() {
46 local TASK_ID=$1
47 [[ -z "${TASK_ID}" ]] && exit 1
48
49 ceph rbd task list ${TASK_ID} || return 0
50 return 1
51 }
52
53 task_in_progress() {
54 local TASK_ID=$1
55 [[ -z "${TASK_ID}" ]] && exit 1
56
57 [[ $(ceph rbd task list ${TASK_ID} | jq '.in_progress') == 'true' ]]
58 }
59
60 test_remove() {
61 echo "test_remove"
62
63 local IMAGE=`uuidgen`
64 rbd create --size 1 --image-shared ${POOL}/${IMAGE}
65
66 # MGR might require some time to discover the OSD map w/ new pool
67 wait_for ceph rbd task add remove ${POOL}/${IMAGE}
68 }
69
70 test_flatten() {
71 echo "test_flatten"
72
73 local PARENT_IMAGE=`uuidgen`
74 local CHILD_IMAGE=`uuidgen`
75
76 rbd create --size 1 --image-shared ${POOL}/${PARENT_IMAGE}
77 rbd snap create ${POOL}/${PARENT_IMAGE}@snap
78 rbd clone ${POOL}/${PARENT_IMAGE}@snap ${POOL}/${POOL_NS}/${CHILD_IMAGE} --rbd-default-clone-format=2
79 [[ "$(rbd info --format json ${POOL}/${POOL_NS}/${CHILD_IMAGE} | jq 'has("parent")')" == "true" ]]
80
81 local TASK_ID=`ceph rbd task add flatten ${POOL}/${POOL_NS}/${CHILD_IMAGE} | jq --raw-output ".id"`
82 wait_for task_dne ${TASK_ID}
83
84 [[ "$(rbd info --format json ${POOL}/${POOL_NS}/${CHILD_IMAGE} | jq 'has("parent")')" == "false" ]]
85 }
86
87 test_trash_remove() {
88 echo "test_trash_remove"
89
90 local IMAGE=`uuidgen`
91 rbd create --size 1 --image-shared ${POOL}/${IMAGE}
92 local IMAGE_ID=`rbd info --format json ${POOL}/${IMAGE} | jq --raw-output ".id"`
93 rbd trash mv ${POOL}/${IMAGE}
94 [[ -n "$(rbd trash list ${POOL})" ]] || exit 1
95
96 local TASK_ID=`ceph rbd task add trash remove ${POOL}/${IMAGE_ID} | jq --raw-output ".id"`
97 wait_for task_dne ${TASK_ID}
98
99 [[ -z "$(rbd trash list ${POOL})" ]] || exit 1
100 }
101
102 test_migration_execute() {
103 echo "test_migration_execute"
104
105 local SOURCE_IMAGE=`uuidgen`
106 local TARGET_IMAGE=`uuidgen`
107 rbd create --size 1 --image-shared ${POOL}/${SOURCE_IMAGE}
108 rbd migration prepare ${POOL}/${SOURCE_IMAGE} ${POOL}/${TARGET_IMAGE}
109 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq --raw-output '.migration.state')" == "prepared" ]]
110
111 local TASK_ID=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
112 wait_for task_dne ${TASK_ID}
113
114 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq --raw-output '.migration.state')" == "executed" ]]
115 }
116
117 test_migration_commit() {
118 echo "test_migration_commit"
119
120 local SOURCE_IMAGE=`uuidgen`
121 local TARGET_IMAGE=`uuidgen`
122 rbd create --size 1 --image-shared ${POOL}/${SOURCE_IMAGE}
123 rbd migration prepare ${POOL}/${SOURCE_IMAGE} ${POOL}/${TARGET_IMAGE}
124 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq --raw-output '.migration.state')" == "prepared" ]]
125
126 local TASK_ID=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
127 wait_for task_dne ${TASK_ID}
128
129 TASK_ID=`ceph rbd task add migration commit ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
130 wait_for task_dne ${TASK_ID}
131
132 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq 'has("migration")')" == "false" ]]
133 (rbd info ${POOL}/${SOURCE_IMAGE} && return 1) || true
134 rbd info ${POOL}/${TARGET_IMAGE}
135 }
136
137 test_migration_abort() {
138 echo "test_migration_abort"
139
140 local SOURCE_IMAGE=`uuidgen`
141 local TARGET_IMAGE=`uuidgen`
142 rbd create --size 1 --image-shared ${POOL}/${SOURCE_IMAGE}
143 rbd migration prepare ${POOL}/${SOURCE_IMAGE} ${POOL}/${TARGET_IMAGE}
144 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq --raw-output '.migration.state')" == "prepared" ]]
145
146 local TASK_ID=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
147 wait_for task_dne ${TASK_ID}
148
149 TASK_ID=`ceph rbd task add migration abort ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
150 wait_for task_dne ${TASK_ID}
151
152 [[ "$(rbd status --format json ${POOL}/${SOURCE_IMAGE} | jq 'has("migration")')" == "false" ]]
153 rbd info ${POOL}/${SOURCE_IMAGE}
154 (rbd info ${POOL}/${TARGET_IMAGE} && return 1) || true
155 }
156
157 test_list() {
158 echo "test_list"
159
160 local IMAGE_1=`uuidgen`
161 local IMAGE_2=`uuidgen`
162
163 rbd create --size 1T --image-shared ${POOL}/${IMAGE_1}
164 rbd create --size 1T --image-shared ${POOL}/${IMAGE_2}
165
166 local TASK_ID_1=`ceph rbd task add remove ${POOL}/${IMAGE_1} | jq --raw-output ".id"`
167 local TASK_ID_2=`ceph rbd task add remove ${POOL}/${IMAGE_2} | jq --raw-output ".id"`
168
169 local LIST_FILE="${TEMPDIR}/list_file"
170 ceph rbd task list > ${LIST_FILE}
171 cat ${LIST_FILE}
172
173 [[ $(jq "[.[] | .id] | contains([\"${TASK_ID_1}\", \"${TASK_ID_2}\"])" ${LIST_FILE}) == "true" ]]
174
175 ceph rbd task cancel ${TASK_ID_1}
176 ceph rbd task cancel ${TASK_ID_2}
177 }
178
179 test_cancel() {
180 echo "test_cancel"
181
182 local IMAGE=`uuidgen`
183 rbd create --size 1T --image-shared ${POOL}/${IMAGE}
184 local TASK_ID=`ceph rbd task add remove ${POOL}/${IMAGE} | jq --raw-output ".id"`
185
186 wait_for task_exists ${TASK_ID}
187
188 ceph rbd task cancel ${TASK_ID}
189 wait_for task_dne ${TASK_ID}
190 }
191
192 test_duplicate_task() {
193 echo "test_duplicate_task"
194
195 local IMAGE=`uuidgen`
196 rbd create --size 1T --image-shared ${POOL}/${IMAGE}
197 local IMAGE_ID=`rbd info --format json ${POOL}/${IMAGE} | jq --raw-output ".id"`
198 rbd trash mv ${POOL}/${IMAGE}
199
200 local TASK_ID_1=`ceph rbd task add trash remove ${POOL}/${IMAGE_ID} | jq --raw-output ".id"`
201 local TASK_ID_2=`ceph rbd task add trash remove ${POOL}/${IMAGE_ID} | jq --raw-output ".id"`
202
203 [[ "${TASK_ID_1}" == "${TASK_ID_2}" ]]
204
205 ceph rbd task cancel ${TASK_ID_1}
206 }
207
208 test_duplicate_name() {
209 echo "test_duplicate_name"
210
211 local IMAGE=`uuidgen`
212 rbd create --size 1G --image-shared ${POOL}/${IMAGE}
213 local TASK_ID_1=`ceph rbd task add remove ${POOL}/${IMAGE} | jq --raw-output ".id"`
214
215 wait_for task_dne ${TASK_ID_1}
216
217 rbd create --size 1G --image-shared ${POOL}/${IMAGE}
218 local TASK_ID_2=`ceph rbd task add remove ${POOL}/${IMAGE} | jq --raw-output ".id"`
219
220 [[ "${TASK_ID_1}" != "${TASK_ID_2}" ]]
221 wait_for task_dne ${TASK_ID_2}
222
223 local TASK_ID_3=`ceph rbd task add remove ${POOL}/${IMAGE} | jq --raw-output ".id"`
224
225 [[ "${TASK_ID_2}" == "${TASK_ID_3}" ]]
226 }
227
228 test_progress() {
229 echo "test_progress"
230
231 local IMAGE_1=`uuidgen`
232 local IMAGE_2=`uuidgen`
233
234 rbd create --size 1 --image-shared ${POOL}/${IMAGE_1}
235 local TASK_ID_1=`ceph rbd task add remove ${POOL}/${IMAGE_1} | jq --raw-output ".id"`
236
237 wait_for task_dne ${TASK_ID_1}
238
239 local PROGRESS_FILE="${TEMPDIR}/progress_file"
240 ceph progress json > ${PROGRESS_FILE}
241 cat ${PROGRESS_FILE}
242
243 [[ $(jq "[.completed | .[].id] | contains([\"${TASK_ID_1}\"])" ${PROGRESS_FILE}) == "true" ]]
244
245 rbd create --size 1T --image-shared ${POOL}/${IMAGE_2}
246 local TASK_ID_2=`ceph rbd task add remove ${POOL}/${IMAGE_2} | jq --raw-output ".id"`
247
248 wait_for task_in_progress ${TASK_ID_2}
249 ceph progress json > ${PROGRESS_FILE}
250 cat ${PROGRESS_FILE}
251
252 [[ $(jq "[.events | .[].id] | contains([\"${TASK_ID_2}\"])" ${PROGRESS_FILE}) == "true" ]]
253
254 ceph rbd task cancel ${TASK_ID_2}
255 wait_for task_dne ${TASK_ID_2}
256
257 ceph progress json > ${PROGRESS_FILE}
258 cat ${PROGRESS_FILE}
259
260 [[ $(jq "[.completed | map(select(.failed)) | .[].id] | contains([\"${TASK_ID_2}\"])" ${PROGRESS_FILE}) == "true" ]]
261 }
262
263 setup
264 test_remove
265 test_flatten
266 test_trash_remove
267 test_migration_execute
268 test_migration_commit
269 test_migration_abort
270 test_list
271 test_cancel
272 test_duplicate_task
273 test_duplicate_name
274 test_progress
275
276 echo OK