@@ -5,12 +5,16 @@ TEMPDIR=
55IMAGE1=image1
66IMAGE2=image2
77IMAGE3=image3
8- IMAGES=" ${IMAGE1} ${IMAGE2} ${IMAGE3} "
8+ NAMESPACE1=namespace1
9+ NAMESPACE2=namespace2
10+ NAMESPACES=" ${NAMESPACE1} ${NAMESPACE2} "
11+ IMAGES=" ${IMAGE1} ${IMAGE2} ${IMAGE3} rbd/${NAMESPACE1} /${IMAGE1} rbd/${NAMESPACE2} /${IMAGE2} "
912
1013cleanup () {
1114 kill_nbd_server
1215 cleanup_tempdir
1316 remove_images
17+ remove_namespaces
1418}
1519
1620setup_tempdir () {
@@ -42,8 +46,11 @@ create_base_image() {
4246export_raw_image () {
4347 local image=$1
4448
45- rm -rf " ${TEMPDIR} /${image} "
46- rbd export ${image} " ${TEMPDIR} /${image} "
49+ # Replace slashes (/) with underscores (_) for namespace images
50+ local export_image=" ${image// \/ / _} "
51+
52+ rm -rf " ${TEMPDIR} /${export_image} "
53+ rbd export " ${image} " " ${TEMPDIR} /${export_image} "
4754}
4855
4956export_base_image () {
@@ -69,6 +76,13 @@ remove_images() {
6976 done
7077}
7178
79+ remove_namespaces () {
80+ for namespace in ${NAMESPACES}
81+ do
82+ rbd namespace remove rbd/${namespace} || true
83+ done
84+ }
85+
7286kill_nbd_server () {
7387 pkill -9 qemu-nbd || true
7488}
@@ -90,6 +104,11 @@ compare_images() {
90104 local ret=0
91105
92106 export_raw_image ${dst_image}
107+
108+ # Replace slashes (/) with underscores (_) for namespace images
109+ src_image=" ${src_image// \/ / _} "
110+ dst_image=" ${dst_image// \/ / _} "
111+
93112 if ! cmp " ${TEMPDIR} /${src_image} " " ${TEMPDIR} /${dst_image} "
94113 then
95114 show_diff " ${TEMPDIR} /${src_image} " " ${TEMPDIR} /${dst_image} "
@@ -99,104 +118,112 @@ compare_images() {
99118}
100119
101120test_import_native_format () {
102- local base_image=$1
103- local dest_image=$2
121+ local base_image_spec=$1
122+ local dest_image_spec=$2
123+
124+ # if base image is from namespace
125+ local base_namespace=" "
126+ local base_image=${base_image_spec}
127+ if [[ " ${base_image_spec} " == rbd/* /* ]]; then
128+ base_namespace=$( basename " $( dirname " ${base_image_spec} " ) " )
129+ base_image=$( basename " ${base_image_spec} " )
130+ fi
104131
105- rbd migration prepare --import-only " rbd/ ${base_image } @2" ${dest_image }
106- rbd migration abort ${dest_image }
132+ rbd migration prepare --import-only " ${base_image_spec } @2" ${dest_image_spec }
133+ rbd migration abort ${dest_image_spec }
107134
108135 local pool_id=$( ceph osd pool ls detail --format xml | xmlstarlet sel -t -v " //pools/pool[pool_name='rbd']/pool_id" )
109136 cat > ${TEMPDIR} /spec.json << EOF
110137{
111138 "type": "native",
112139 "pool_id": ${pool_id} ,
113- "pool_namespace": "",
140+ "pool_namespace": "${base_namespace} ",
114141 "image_name": "${base_image} ",
115142 "snap_name": "2"
116143}
117144EOF
118145 cat ${TEMPDIR} /spec.json
119146
120147 rbd migration prepare --import-only \
121- --source-spec-path ${TEMPDIR} /spec.json ${dest_image }
148+ --source-spec-path ${TEMPDIR} /spec.json ${dest_image_spec }
122149
123- compare_images " ${base_image } @1" " ${dest_image } @1"
124- compare_images " ${base_image } @2" " ${dest_image } @2"
150+ compare_images " ${base_image_spec } @1" " ${dest_image_spec } @1"
151+ compare_images " ${base_image_spec } @2" " ${dest_image_spec } @2"
125152
126- rbd migration abort ${dest_image }
153+ rbd migration abort ${dest_image_spec }
127154
128155 rbd migration prepare --import-only \
129- --source-spec-path ${TEMPDIR} /spec.json ${dest_image }
130- rbd migration execute ${dest_image }
156+ --source-spec-path ${TEMPDIR} /spec.json ${dest_image_spec }
157+ rbd migration execute ${dest_image_spec }
131158
132- compare_images " ${base_image } @1" " ${dest_image } @1"
133- compare_images " ${base_image } @2" " ${dest_image } @2"
159+ compare_images " ${base_image_spec } @1" " ${dest_image_spec } @1"
160+ compare_images " ${base_image_spec } @2" " ${dest_image_spec } @2"
134161
135- rbd migration abort ${dest_image }
162+ rbd migration abort ${dest_image_spec }
136163
137164 # no snap name or snap id
138165 expect_false rbd migration prepare --import-only \
139- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" }" \
140- ${dest_image }
166+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" }" \
167+ ${dest_image_spec }
141168
142169 # invalid source spec JSON
143170 expect_false rbd migration prepare --import-only \
144- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_name\" : non-existing}" \
145- ${dest_image }
171+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : non-existing}" \
172+ ${dest_image_spec }
146173
147174 # non-existing snap name
148175 expect_false rbd migration prepare --import-only \
149- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" non-existing\" }" \
150- ${dest_image }
176+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" non-existing\" }" \
177+ ${dest_image_spec }
151178
152179 # invalid snap name
153180 expect_false rbd migration prepare --import-only \
154- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_name\" : 123456}" \
155- ${dest_image }
181+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : 123456}" \
182+ ${dest_image_spec }
156183
157184 # non-existing snap id passed as int
158185 expect_false rbd migration prepare --import-only \
159- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_id\" : 123456}" \
160- ${dest_image }
186+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_id\" : 123456}" \
187+ ${dest_image_spec }
161188
162189 # non-existing snap id passed as string
163190 expect_false rbd migration prepare --import-only \
164- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" 123456\" }" \
165- ${dest_image }
191+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" 123456\" }" \
192+ ${dest_image_spec }
166193
167194 # invalid snap id
168195 expect_false rbd migration prepare --import-only \
169- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" foobar\" }" \
170- ${dest_image }
196+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" foobar\" }" \
197+ ${dest_image_spec }
171198
172199 # snap id passed as int
173- local snap_id=$( rbd snap ls ${base_image } --format xml | xmlstarlet sel -t -v " //snapshots/snapshot[name='2']/id" )
200+ local snap_id=$( rbd snap ls ${base_image_spec } --format xml | xmlstarlet sel -t -v " //snapshots/snapshot[name='2']/id" )
174201 rbd migration prepare --import-only \
175- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_id\" : ${snap_id} }" \
176- ${dest_image }
177- rbd migration abort ${dest_image }
202+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_id\" : ${snap_id} }" \
203+ ${dest_image_spec }
204+ rbd migration abort ${dest_image_spec }
178205
179206 # snap id passed as string
180207 rbd migration prepare --import-only \
181- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" ${snap_id} \" }" \
182- ${dest_image }
183- rbd migration abort ${dest_image }
208+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_id\" : \" ${snap_id} \" }" \
209+ ${dest_image_spec }
210+ rbd migration abort ${dest_image_spec }
184211
185212 rbd migration prepare --import-only \
186- --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" 2\" }" \
187- ${dest_image }
188- rbd migration abort ${dest_image }
213+ --source-spec " {\" type\" : \" native\" , \" pool_id\" : ${pool_id} , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" 2\" }" \
214+ ${dest_image_spec }
215+ rbd migration abort ${dest_image_spec }
189216
190217 rbd migration prepare --import-only \
191- --source-spec " {\" type\" : \" native\" , \" pool_name\" : \" rbd\" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" 2\" }" \
192- ${dest_image }
193- rbd migration execute ${dest_image }
194- rbd migration commit ${dest_image }
218+ --source-spec " {\" type\" : \" native\" , \" pool_name\" : \" rbd\" , \" pool_namespace \" : \" ${base_namespace} \" , \" image_name\" : \" ${base_image} \" , \" snap_name\" : \" 2\" }" \
219+ ${dest_image_spec }
220+ rbd migration execute ${dest_image_spec }
221+ rbd migration commit ${dest_image_spec }
195222
196- compare_images " ${base_image } @1" " ${dest_image } @1"
197- compare_images " ${base_image } @2" " ${dest_image } @2"
223+ compare_images " ${base_image_spec } @1" " ${dest_image_spec } @1"
224+ compare_images " ${base_image_spec } @2" " ${dest_image_spec } @2"
198225
199- remove_image " ${dest_image } "
226+ remove_image " ${dest_image_spec } "
200227}
201228
202229test_import_qcow_format () {
@@ -337,12 +364,12 @@ EOF
337364 cat ${TEMPDIR} /spec.json
338365
339366 cat ${TEMPDIR} /spec.json | rbd migration prepare --import-only \
340- --source-spec-path - ${dest_image}
367+ --source-spec-path - ${dest_image}
341368 compare_images ${base_image} ${dest_image}
342369 rbd migration abort ${dest_image}
343370
344371 rbd migration prepare --import-only \
345- --source-spec-path ${TEMPDIR} /spec.json ${dest_image}
372+ --source-spec-path ${TEMPDIR} /spec.json ${dest_image}
346373 rbd migration execute ${dest_image}
347374 rbd migration commit ${dest_image}
348375
@@ -587,4 +614,18 @@ test_import_nbd_stream_qcow2 ${IMAGE2} ${IMAGE3}
587614test_import_raw_format ${IMAGE1} ${IMAGE2}
588615test_import_nbd_stream_raw ${IMAGE1} ${IMAGE2}
589616
617+ rbd namespace create rbd/${NAMESPACE1}
618+ rbd namespace create rbd/${NAMESPACE2}
619+ create_base_image rbd/${NAMESPACE1} /${IMAGE1}
620+ export_base_image rbd/${NAMESPACE1} /${IMAGE1}
621+
622+ # Migration from namespace to namespace
623+ test_import_native_format rbd/${NAMESPACE1} /${IMAGE1} rbd/${NAMESPACE2} /${IMAGE2}
624+
625+ # Migration from namespace to non-namespace
626+ test_import_native_format rbd/${NAMESPACE1} /${IMAGE1} ${IMAGE2}
627+
628+ # Migration from non-namespace to namespace
629+ test_import_native_format ${IMAGE1} rbd/${NAMESPACE2} /${IMAGE2}
630+
590631echo OK
0 commit comments