8 trap 'cleanup' INT TERM EXIT
10 ceph osd pool create
${POOL} 128
12 rbd namespace create
${POOL}/${POOL_NS}
18 ceph osd pool
rm ${POOL} ${POOL} --yes-i-really-really-mean-it
26 local TEST_FN_ARGS
=("$@")
28 for s
in 1 2 4 8 8 8 8 8 8 8 8 16 16; do
31 ${TEST_FN} "${TEST_FN_ARGS[@]}" ||
continue
39 [[ -z "${TASK_ID}" ]] && exit 1
41 ceph rbd task list
${TASK_ID} ||
return 1
47 [[ -z "${TASK_ID}" ]] && exit 1
49 ceph rbd task list
${TASK_ID} ||
return 0
55 [[ -z "${TASK_ID}" ]] && exit 1
57 [[ $
(ceph rbd task list
${TASK_ID} | jq
'.in_progress') == 'true' ]]
64 rbd create
--size 1 --image-shared ${POOL}/${IMAGE}
66 # MGR might require some time to discover the OSD map w/ new pool
67 wait_for ceph rbd task add remove
${POOL}/${IMAGE}
73 local PARENT_IMAGE
=`uuidgen`
74 local CHILD_IMAGE
=`uuidgen`
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" ]]
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}
84 [[ "$(rbd info --format json ${POOL}/${POOL_NS}/${CHILD_IMAGE} | jq 'has("parent
")')" == "false" ]]
88 echo "test_trash_remove"
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
96 local TASK_ID
=`ceph rbd task add trash remove ${POOL}/${IMAGE_ID} | jq --raw-output ".id"`
97 wait_for task_dne
${TASK_ID}
99 [[ -z "$(rbd trash list ${POOL})" ]] ||
exit 1
102 test_migration_execute
() {
103 echo "test_migration_execute"
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" ]]
111 local TASK_ID
=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
112 wait_for task_dne
${TASK_ID}
114 [[ "$(rbd status --format json ${POOL}/${TARGET_IMAGE} | jq --raw-output '.migration.state')" == "executed" ]]
117 test_migration_commit
() {
118 echo "test_migration_commit"
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" ]]
126 local TASK_ID
=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
127 wait_for task_dne
${TASK_ID}
129 TASK_ID
=`ceph rbd task add migration commit ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
130 wait_for task_dne
${TASK_ID}
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}
137 test_migration_abort
() {
138 echo "test_migration_abort"
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" ]]
146 local TASK_ID
=`ceph rbd task add migration execute ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
147 wait_for task_dne
${TASK_ID}
149 TASK_ID
=`ceph rbd task add migration abort ${POOL}/${TARGET_IMAGE} | jq --raw-output ".id"`
150 wait_for task_dne
${TASK_ID}
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
160 local IMAGE_1
=`uuidgen`
161 local IMAGE_2
=`uuidgen`
163 rbd create
--size 1T
--image-shared ${POOL}/${IMAGE_1}
164 rbd create
--size 1T
--image-shared ${POOL}/${IMAGE_2}
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"`
169 local LIST_FILE
="${TEMPDIR}/list_file"
170 ceph rbd task list
> ${LIST_FILE}
173 [[ $
(jq
"[.[] | .id] | contains([\"${TASK_ID_1}\", \"${TASK_ID_2}\"])" ${LIST_FILE}) == "true
" ]]
175 ceph rbd task cancel ${TASK_ID_1}
176 ceph rbd task cancel ${TASK_ID_2}
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
"`
186 wait_for task_exists ${TASK_ID}
188 ceph rbd task cancel ${TASK_ID}
189 wait_for task_dne ${TASK_ID}
192 test_duplicate_task() {
193 echo "test_duplicate_task
"
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}
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
"`
203 [[ "${TASK_ID_1}" == "${TASK_ID_2}" ]]
205 ceph rbd task cancel ${TASK_ID_1}
208 test_duplicate_name() {
209 echo "test_duplicate_name
"
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
"`
215 wait_for task_dne ${TASK_ID_1}
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
"`
220 [[ "${TASK_ID_1}" != "${TASK_ID_2}" ]]
221 wait_for task_dne ${TASK_ID_2}
223 local TASK_ID_3=`ceph rbd task add remove ${POOL}/${IMAGE} | jq --raw-output ".id
"`
225 [[ "${TASK_ID_2}" == "${TASK_ID_3}" ]]
231 local IMAGE_1=`uuidgen`
232 local IMAGE_2=`uuidgen`
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
"`
237 wait_for task_dne ${TASK_ID_1}
239 local PROGRESS_FILE="${TEMPDIR}/progress_file
"
240 ceph progress json > ${PROGRESS_FILE}
243 [[ $(jq "[.completed | .
[].id
] | contains
([\"${TASK_ID_1}\"])" ${PROGRESS_FILE}) == "true
" ]]
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
"`
248 wait_for task_in_progress ${TASK_ID_2}
249 ceph progress json > ${PROGRESS_FILE}
252 [[ $(jq "[.events | .
[].id
] | contains
([\"${TASK_ID_2}\"])" ${PROGRESS_FILE}) == "true
" ]]
254 ceph rbd task cancel ${TASK_ID_2}
255 wait_for task_dne ${TASK_ID_2}
257 ceph progress json > ${PROGRESS_FILE}
260 [[ $(jq "[.completed | map
(select(.failed
)) | .
[].id
] | contains
([\"${TASK_ID_2}\"])" ${PROGRESS_FILE}) == "true
" ]]
267 test_migration_execute
268 test_migration_commit