3 # Copyright (C) 2013, 2014 Cloudwatt <libre.licensing@cloudwatt.com>
4 # Copyright (C) 2014, 2015 Red Hat <contact@redhat.com>
6 # Author: Loic Dachary <loic@dachary.org>
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU Library Public License as published by
10 # the Free Software Foundation; either version 2, or (at your option)
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Library Public License for more details.
18 source $
(dirname $0)/..
/detect-build-env-vars.sh
19 source $CEPH_ROOT/qa
/workunits
/ceph-helpers.sh
25 export CEPH_MON
="127.0.0.1:7105" # git grep '\<7105\>' : there must be only one
27 CEPH_ARGS
+="--fsid=$(uuidgen) --auth-supported=none "
28 CEPH_ARGS
+="--mon-host=$CEPH_MON "
30 local funcs
=${@:-$(set | sed -n -e 's/^\(TEST_[0-9a-z_]*\) .*/\1/p')}
31 for func
in $funcs ; do
32 setup
$dir ||
return 1
33 $func $dir ||
return 1
34 teardown
$dir ||
return 1
38 function TEST_default_deprectated_0
() {
40 # explicitly set the default crush rule
43 --osd_pool_default_crush_replicated_ruleset $expected ||
return 1
44 ceph osd pool get rbd crush_ruleset |
grep 'ruleset: '$expected ||
return 1
45 ceph osd crush rule dump replicated_ruleset |
grep '"ruleset": '$expected ||
return 1
46 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
47 ! grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
50 function TEST_default_deprectated_1
() {
52 # explicitly set the default crush rule using deprecated option
55 --osd_pool_default_crush_rule $expected ||
return 1
56 ceph osd pool get rbd crush_ruleset |
grep 'ruleset: '$expected ||
return 1
57 ceph osd crush rule dump replicated_ruleset |
grep '"ruleset": '$expected ||
return 1
58 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
59 grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
62 function TEST_default_deprectated_2
() {
67 --osd_pool_default_crush_rule $expected \
68 --osd_pool_default_crush_replicated_ruleset $unexpected ||
return 1
69 ceph osd pool get rbd crush_ruleset |
grep 'ruleset: '$expected ||
return 1
70 ! ceph
--format json osd dump |
grep '"crush_ruleset":'$unexpected ||
return 1
71 ceph osd crush rule dump replicated_ruleset |
grep '"ruleset": '$expected ||
return 1
72 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
73 grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
76 # Before http://tracker.ceph.com/issues/8307 the invalid profile was created
77 function TEST_erasure_invalid_profile
() {
79 run_mon
$dir a ||
return 1
80 local poolname
=pool_erasure
81 local notaprofile
=not-a-valid-erasure-code-profile
82 ! ceph osd pool create
$poolname 12 12 erasure
$notaprofile ||
return 1
83 ! ceph osd erasure-code-profile
ls |
grep $notaprofile ||
return 1
86 function TEST_erasure_crush_rule
() {
88 run_mon
$dir a ||
return 1
90 # choose the crush ruleset used with an erasure coded pool
92 local crush_ruleset
=myruleset
93 ! ceph osd crush rule
ls |
grep $crush_ruleset ||
return 1
94 ceph osd crush rule create-erasure
$crush_ruleset
95 ceph osd crush rule
ls |
grep $crush_ruleset
97 poolname
=pool_erasure1
98 ! ceph
--format json osd dump |
grep '"crush_ruleset":1' ||
return 1
99 ceph osd pool create
$poolname 12 12 erasure default
$crush_ruleset
100 ceph
--format json osd dump |
grep '"crush_ruleset":1' ||
return 1
102 # a crush ruleset by the name of the pool is implicitly created
104 poolname
=pool_erasure2
105 ceph osd erasure-code-profile
set myprofile
106 ceph osd pool create
$poolname 12 12 erasure myprofile
107 ceph osd crush rule
ls |
grep $poolname ||
return 1
109 # a non existent crush ruleset given in argument is an error
110 # http://tracker.ceph.com/issues/9304
112 poolname
=pool_erasure3
113 ! ceph osd pool create
$poolname 12 12 erasure myprofile INVALIDRULESET ||
return 1
116 function TEST_erasure_code_profile_default
() {
118 run_mon
$dir a ||
return 1
119 ceph osd erasure-code-profile
rm default ||
return 1
120 ! ceph osd erasure-code-profile
ls |
grep default ||
return 1
121 ceph osd pool create
$poolname 12 12 erasure default
122 ceph osd erasure-code-profile
ls |
grep default ||
return 1
125 function TEST_erasure_crush_stripe_unit
() {
127 # the default stripe unit is used to initialize the pool
128 run_mon
$dir a
--public-addr $CEPH_MON
129 stripe_unit
=$
(ceph-conf
--show-config-value osd_pool_erasure_code_stripe_unit
)
130 eval local $
(ceph osd erasure-code-profile get myprofile |
grep k
=)
131 stripe_width
= $
((stripe_unit
* k
))
132 ceph osd pool create pool_erasure
12 12 erasure
133 ceph
--format json osd dump |
tee $dir/osd.json
134 grep '"stripe_width":'$stripe_width $dir/osd.json
> /dev
/null ||
return 1
137 function TEST_erasure_crush_stripe_unit_padded
() {
139 # setting osd_pool_erasure_code_stripe_unit modifies the stripe_width
140 # and it is padded as required by the default plugin
141 profile
+=" plugin=jerasure"
142 profile
+=" technique=reed_sol_van"
146 actual_stripe_unit
=2048
147 desired_stripe_unit
=$
((actual_stripe_unit
- 1))
148 actual_stripe_width
=$
((actual_stripe_unit
* k
))
150 --osd_pool_erasure_code_stripe_unit $desired_stripe_unit \
151 --osd_pool_default_erasure_code_profile "$profile" ||
return 1
152 ceph osd pool create pool_erasure
12 12 erasure
153 ceph osd dump |
tee $dir/osd.json
154 grep "stripe_width $actual_stripe_width" $dir/osd.json
> /dev
/null ||
return 1
157 function TEST_erasure_code_pool
() {
159 run_mon
$dir a ||
return 1
160 ceph
--format json osd dump
> $dir/osd.json
161 local expected
='"erasure_code_profile":"default"'
162 ! grep "$expected" $dir/osd.json ||
return 1
163 ceph osd pool create erasurecodes
12 12 erasure
164 ceph
--format json osd dump |
tee $dir/osd.json
165 grep "$expected" $dir/osd.json
> /dev
/null ||
return 1
167 ceph osd pool create erasurecodes
12 12 erasure
2>&1 | \
168 grep 'already exists' ||
return 1
169 ceph osd pool create erasurecodes
12 12 2>&1 | \
170 grep 'cannot change to type replicated' ||
return 1
173 function TEST_replicated_pool_with_ruleset
() {
176 local ruleset
=ruleset0
178 ceph osd crush add-bucket
$root host
179 local failure_domain
=osd
180 local poolname
=mypool
181 ceph osd crush rule create-simple
$ruleset $root $failure_domain ||
return 1
182 ceph osd crush rule
ls |
grep $ruleset
183 ceph osd pool create
$poolname 12 12 replicated
$ruleset 2>&1 | \
184 grep "pool 'mypool' created" ||
return 1
185 rule_id
=`ceph osd crush rule dump $ruleset | grep "rule_id" | awk -F[' ':,] '{print $4}'`
186 ceph osd pool get
$poolname crush_ruleset
2>&1 | \
187 grep "crush_ruleset: $rule_id" ||
return 1
188 #non-existent crush ruleset
189 ceph osd pool create newpool
12 12 replicated non-existent
2>&1 | \
190 grep "doesn't exist" ||
return 1
193 function TEST_replicated_pool_with_non_existent_default_ruleset_0
() {
195 run_mon
$dir a ||
return 1
196 # change the default crush rule
197 ceph tell mon.a injectargs
-- \
198 --osd_pool_default_crush_replicated_ruleset 66 ||
return 1
199 ceph osd pool create mypool
12 12 replicated
2>&1 | \
200 grep "No suitable CRUSH ruleset exists" ||
return 1
201 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
202 ! grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
205 function TEST_replicated_pool_with_non_existent_default_ruleset_1
() {
207 run_mon
$dir a ||
return 1
208 # change the default crush rule using deprecated option
209 ceph tell mon.a injectargs
-- \
210 --osd_pool_default_crush_rule 55 ||
return 1
211 ceph osd pool create mypool
12 12 replicated
2>&1 | \
212 grep "No suitable CRUSH ruleset exists" ||
return 1
213 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
214 grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
217 function TEST_replicated_pool_with_non_existent_default_ruleset_2
() {
219 run_mon
$dir a ||
return 1
220 ceph tell mon.a injectargs
-- \
221 --osd_pool_default_crush_rule 77 \
222 --osd_pool_default_crush_replicated_ruleset 33 ||
return 1
223 ceph osd pool create mypool
12 12 replicated
2>&1 | \
224 grep "No suitable CRUSH ruleset exists" ||
return 1
225 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
226 grep "osd_pool_default_crush_rule is deprecated " $dir/mon.a.log ||
return 1
229 function TEST_erasure_code_pool_lrc
() {
231 run_mon
$dir a ||
return 1
233 ceph osd erasure-code-profile
set LRCprofile \
236 layers
='[ [ "DDc", "" ] ]' ||
return 1
238 ceph
--format json osd dump
> $dir/osd.json
239 local expected
='"erasure_code_profile":"LRCprofile"'
240 local poolname
=erasurecodes
241 ! grep "$expected" $dir/osd.json ||
return 1
242 ceph osd pool create
$poolname 12 12 erasure LRCprofile
243 ceph
--format json osd dump |
tee $dir/osd.json
244 grep "$expected" $dir/osd.json
> /dev
/null ||
return 1
245 ceph osd crush rule
ls |
grep $poolname ||
return 1
248 function TEST_replicated_pool
() {
250 run_mon
$dir a ||
return 1
251 ceph osd pool create replicated
12 12 replicated replicated_ruleset
2>&1 | \
252 grep "pool 'replicated' created" ||
return 1
253 ceph osd pool create replicated
12 12 replicated replicated_ruleset
2>&1 | \
254 grep 'already exists' ||
return 1
255 # default is replicated
256 ceph osd pool create replicated1
12 12 2>&1 | \
257 grep "pool 'replicated1' created" ||
return 1
258 # default is replicated, pgp_num = pg_num
259 ceph osd pool create replicated2
12 2>&1 | \
260 grep "pool 'replicated2' created" ||
return 1
261 ceph osd pool create replicated
12 12 erasure
2>&1 | \
262 grep 'cannot change to type erasure' ||
return 1
265 function TEST_no_pool_delete
() {
267 run_mon
$dir a ||
return 1
268 ceph osd pool create foo
1 ||
return 1
269 ceph tell mon.a injectargs
-- --no-mon-allow-pool-delete ||
return 1
270 ! ceph osd pool delete foo foo
--yes-i-really-really-mean-it ||
return 1
271 ceph tell mon.a injectargs
-- --mon-allow-pool-delete ||
return 1
272 ceph osd pool delete foo foo
--yes-i-really-really-mean-it ||
return 1
275 function TEST_utf8_cli
() {
277 run_mon
$dir a ||
return 1
278 # Hopefully it's safe to include literal UTF-8 characters to test
279 # the fix for http://tracker.ceph.com/issues/7387. If it turns out
280 # to not be OK (when is the default encoding *not* UTF-8?), maybe
281 # the character '黄' can be replaced with the escape $'\xe9\xbb\x84'
282 ceph osd pool create 黄
1024 2>&1 | \
283 grep "pool '黄' created" ||
return 1
284 ceph osd lspools
2>&1 | \
286 ceph
-f json-pretty osd dump | \
287 python
-c "import json; import sys; json.load(sys.stdin)" ||
return 1
288 ceph osd pool delete 黄 黄
--yes-i-really-really-mean-it
291 main osd-pool-create
"$@"
294 # compile-command: "cd ../.. ; make -j4 && test/mon/osd-pool-create.sh"