]>
Commit | Line | Data |
---|---|---|
494da23a TL |
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 |