3 # Copyright (C) 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:7104" # git grep '\<7104\>' : 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_crush_rule_create_simple
() {
41 run_mon
$dir a ||
return 1
43 ceph
--format xml osd crush rule dump replicated_rule | \
44 egrep '<op>take</op><item>[^<]+</item><item_name>default</item_name>' | \
45 grep '<op>choose_firstn</op><num>0</num><type>osd</type>' ||
return 1
46 local ruleset
=ruleset0
48 ceph osd crush add-bucket
$root host
49 local failure_domain
=osd
50 ceph osd crush rule create-simple
$ruleset $root $failure_domain ||
return 1
51 ceph osd crush rule create-simple
$ruleset $root $failure_domain 2>&1 | \
52 grep "$ruleset already exists" ||
return 1
53 ceph
--format xml osd crush rule dump
$ruleset | \
54 egrep '<op>take</op><item>[^<]+</item><item_name>'$root'</item_name>' | \
55 grep '<op>choose_firstn</op><num>0</num><type>'$failure_domain'</type>' ||
return 1
56 ceph osd crush rule
rm $ruleset ||
return 1
59 function TEST_crush_rule_dump
() {
62 run_mon
$dir a ||
return 1
64 local ruleset
=ruleset1
65 ceph osd crush rule create-erasure
$ruleset ||
return 1
66 test $
(ceph
--format json osd crush rule dump
$ruleset | \
67 jq
".rule_name == \"$ruleset\"") == true ||
return 1
68 test $
(ceph
--format json osd crush rule dump | \
69 jq
"map(select(.rule_name == \"$ruleset\")) | length == 1") == true ||
return 1
70 ! ceph osd crush rule dump non_existent_ruleset ||
return 1
71 ceph osd crush rule
rm $ruleset ||
return 1
74 function TEST_crush_rule_rm
() {
75 local ruleset
=erasure2
77 run_mon
$dir a ||
return 1
79 ceph osd crush rule create-erasure
$ruleset default ||
return 1
80 ceph osd crush rule
ls |
grep $ruleset ||
return 1
81 ceph osd crush rule
rm $ruleset ||
return 1
82 ! ceph osd crush rule
ls |
grep $ruleset ||
return 1
85 function TEST_crush_rule_create_erasure
() {
88 run_mon
$dir a ||
return 1
89 # should have at least one OSD
90 run_osd
$dir 0 ||
return 1
92 local ruleset
=ruleset3
94 # create a new ruleset with the default profile, implicitly
96 ceph osd crush rule create-erasure
$ruleset ||
return 1
97 ceph osd crush rule create-erasure
$ruleset 2>&1 | \
98 grep "$ruleset already exists" ||
return 1
99 ceph
--format xml osd crush rule dump
$ruleset | \
100 egrep '<op>take</op><item>[^<]+</item><item_name>default</item_name>' | \
101 grep '<op>chooseleaf_indep</op><num>0</num><type>host</type>' ||
return 1
102 ceph osd crush rule
rm $ruleset ||
return 1
103 ! ceph osd crush rule
ls |
grep $ruleset ||
return 1
105 # create a new ruleset with the default profile, explicitly
107 ceph osd crush rule create-erasure
$ruleset default ||
return 1
108 ceph osd crush rule
ls |
grep $ruleset ||
return 1
109 ceph osd crush rule
rm $ruleset ||
return 1
110 ! ceph osd crush rule
ls |
grep $ruleset ||
return 1
112 # create a new ruleset and the default profile, implicitly
114 ceph osd erasure-code-profile
rm default ||
return 1
115 ! ceph osd erasure-code-profile
ls |
grep default ||
return 1
116 ceph osd crush rule create-erasure
$ruleset ||
return 1
117 CEPH_ARGS
='' ceph
--admin-daemon $dir/ceph-mon.a.asok log flush ||
return 1
118 grep 'profile set default' $dir/mon.a.log ||
return 1
119 ceph osd erasure-code-profile
ls |
grep default ||
return 1
120 ceph osd crush rule
rm $ruleset ||
return 1
121 ! ceph osd crush rule
ls |
grep $ruleset ||
return 1
124 function check_ruleset_id_match_rule_id
() {
126 rule_id
=`ceph osd crush rule dump $rule_name | grep "\"rule_id\":" | awk -F ":|," '{print int($2)}'`
127 ruleset_id
=`ceph osd crush rule dump $rule_name | grep "\"ruleset\":"| awk -F ":|," '{print int($2)}'`
128 test $ruleset_id = $rule_id ||
return 1
131 function generate_manipulated_rules
() {
133 ceph osd crush add-bucket
$root host
134 ceph osd crush rule create-simple test_rule1
$root osd firstn ||
return 1
135 ceph osd crush rule create-simple test_rule2
$root osd firstn ||
return 1
136 ceph osd getcrushmap
-o $dir/original_map
137 crushtool
-d $dir/original_map
-o $dir/decoded_original_map
138 #manipulate the rulesets , to make the rule_id != ruleset_id
139 ${SED} -i 's/ruleset 0/ruleset 3/' $dir/decoded_original_map
140 ${SED} -i 's/ruleset 2/ruleset 0/' $dir/decoded_original_map
141 ${SED} -i 's/ruleset 1/ruleset 2/' $dir/decoded_original_map
143 crushtool
-c $dir/decoded_original_map
-o $dir/new_map
144 ceph osd setcrushmap
-i $dir/new_map
146 ceph osd crush rule dump
149 function TEST_crush_ruleset_match_rule_when_creating
() {
152 run_mon
$dir a ||
return 1
156 generate_manipulated_rules
$dir
158 ceph osd crush rule create-simple special_rule_simple
$root osd firstn ||
return 1
160 ceph osd crush rule dump
161 #show special_rule_simple has same rule_id and ruleset_id
162 check_ruleset_id_match_rule_id special_rule_simple ||
return 1
165 function TEST_add_ruleset_failed
() {
168 run_mon
$dir a ||
return 1
172 ceph osd crush add-bucket
$root host
173 ceph osd crush rule create-simple test_rule1
$root osd firstn ||
return 1
174 ceph osd crush rule create-simple test_rule2
$root osd firstn ||
return 1
175 ceph osd getcrushmap
> $dir/crushmap ||
return 1
176 crushtool
--decompile $dir/crushmap
> $dir/crushmap.txt ||
return 1
177 for i
in $
(seq 3 255)
186 step choose firstn 0 type osd
190 done >> $dir/crushmap.txt
191 crushtool
--compile $dir/crushmap.txt
-o $dir/crushmap ||
return 1
192 ceph osd setcrushmap
-i $dir/crushmap ||
return 1
193 ceph osd crush rule create-simple test_rule_nospace
$root osd firstn
2>&1 |
grep "Error ENOSPC" ||
return 1
197 function TEST_crush_rename_bucket
() {
200 run_mon
$dir a ||
return 1
202 ceph osd crush add-bucket host1
host
204 ! ceph osd tree |
grep host2 ||
return 1
205 ceph osd crush rename-bucket host1 host2 ||
return 1
207 ceph osd tree |
grep host2 ||
return 1
208 ceph osd crush rename-bucket host1 host2 ||
return 1 # idempotency
209 ceph osd crush rename-bucket nonexistent something
2>&1 |
grep "Error ENOENT" ||
return 1
212 function TEST_crush_reject_empty
() {
214 run_mon
$dir a ||
return 1
215 # should have at least one OSD
216 run_osd
$dir 0 ||
return 1
218 local empty_map
=$dir/empty_map
220 crushtool
-c $empty_map.txt
-o $empty_map.map ||
return 1
221 expect_failure
$dir "Error EINVAL" \
222 ceph osd setcrushmap
-i $empty_map.map ||
return 1
225 function TEST_crush_tree
() {
227 run_mon
$dir a ||
return 1
229 ceph osd crush tree
--format=xml | \
230 $XMLSTARLET val
-e -r $CEPH_ROOT/src
/test
/mon
/osd-crush-tree.rng
- ||
return 1
236 # compile-command: "cd ../.. ; make -j4 && test/mon/osd-crush.sh"