6 from pg_autoscaler
import module
10 def __init__(self
, pools
):
16 def pool_raw_used_rate(pool_id
):
21 def __init__(self
, rules
, osd_dic
):
23 self
.osd_dic
= osd_dic
25 def get_rule_by_id(self
, rule_id
):
26 for rule
in self
.rules
:
27 if rule
['rule_id'] == rule_id
:
32 def get_rule_root(self
, rule_name
):
33 for rule
in self
.rules
:
34 if rule
['rule_name'] == rule_name
:
35 return rule
['root_id']
39 def get_osds_under(self
, root_id
):
40 return self
.osd_dic
[root_id
]
43 class TestPgAutoscaler(object):
45 def setup_method(self
):
46 # a bunch of attributes for testing.
47 self
.autoscaler
= module
.PgAutoscaler('module_name', 0, 0)
49 def helper_test(self
, osd_dic
, rules
, pools
, expected_overlapped_roots
):
52 overlapped_roots
= set()
53 osdmap
= OSDMAP(pools
)
54 crush
= CRUSH(rules
, osd_dic
)
55 roots
, overlapped_roots
= self
.autoscaler
.identify_subtrees_and_overlaps(
56 osdmap
, pools
, crush
, result
, overlapped_roots
, roots
58 assert overlapped_roots
== expected_overlapped_roots
60 def test_subtrees_and_overlaps(self
):
62 -1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
63 -40: [11, 12, 13, 14, 15],
64 -5: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
79 "rule_name": "teuthology-data-ec",
88 "rule_name": "rep-ssd",
100 "pg_num_target": 1024,
103 "capacity_ratio": 0.1624,
107 "expected_final_pg_target": 1024,
111 "pool_name": "metadata",
115 "capacity_ratio": 0.0144,
119 "expected_final_pg_target": 64,
123 "pool_name": "libvirt-pool",
127 "capacity_ratio": 0.0001,
129 "expected_final_pg_target": 128,
133 "pool_name": ".rgw.root",
139 "expected_final_pg_target": 32,
141 "default.rgw.control": {
143 "pool_name": "default.rgw.control",
149 "expected_final_pg_target": 32,
151 "default.rgw.meta": {
153 "pool_name": "default.rgw.meta",
159 "expected_final_pg_target": 32,
163 "pool_name": "default.rgw.log",
169 "expected_final_pg_target": 32,
171 "default.rgw.buckets.index": {
173 "pool_name": "default.rgw.buckets.index",
177 "capacity_ratio": 0.0002,
179 "expected_final_pg_target": 32,
181 "default.rgw.buckets.data": {
183 "pool_name": "default.rgw.buckets.data",
187 "capacity_ratio": 0.0457,
189 "expected_final_pg_target": 128,
191 "default.rgw.buckets.non-ec": {
193 "pool_name": "default.rgw.buckets.non-ec",
199 "expected_final_pg_target": 32,
201 "device_health_metrics": {
203 "pool_name": "device_health_metrics",
211 "expected_final_pg_target": 1,
213 "cephfs.teuthology.meta": {
215 "pool_name": "cephfs.teuthology.meta",
219 "capacity_ratio": 0.1389,
221 "pg_autoscale_bias": 4,
224 "expected_final_pg_target": 512,
226 "cephfs.teuthology.data": {
228 "pool_name": "cephfs.teuthology.data",
229 "pg_num_target": 256,
232 "capacity_ratio": 0.0006,
236 "expected_final_pg_target": 1024,
237 "expected_final_pg_target": 256,
239 "cephfs.scratch.meta": {
241 "pool_name": "cephfs.scratch.meta",
245 "capacity_ratio": 0.0027,
247 "pg_autoscale_bias": 4,
250 "expected_final_pg_target": 64,
252 "cephfs.scratch.data": {
254 "pool_name": "cephfs.scratch.data",
258 "capacity_ratio": 0.0027,
260 "expected_final_pg_target": 128,
262 "cephfs.teuthology.data-ec": {
264 "pool_name": "cephfs.teuthology.data-ec",
265 "pg_num_target": 1024,
268 "capacity_ratio": 0.8490,
272 "expected_final_pg_target": 1024,
276 "pool_name": "cephsqlite",
282 "expected_final_pg_target": 128,
285 expected_overlapped_roots
= {-40, -1, -5}
286 self
.helper_test(osd_dic
, rules
, pools
, expected_overlapped_roots
)
288 def test_no_overlaps(self
):
290 -1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
291 -40: [11, 12, 13, 14, 15],
307 "rule_name": "teuthology-data-ec",
316 "rule_name": "rep-ssd",
328 "pg_num_target": 1024,
331 "capacity_ratio": 0.1624,
335 "expected_final_pg_target": 1024,
339 "pool_name": "metadata",
343 "capacity_ratio": 0.0144,
347 "expected_final_pg_target": 64,
351 "pool_name": "libvirt-pool",
355 "capacity_ratio": 0.0001,
357 "expected_final_pg_target": 128,
361 "pool_name": ".rgw.root",
367 "expected_final_pg_target": 32,
369 "default.rgw.control": {
371 "pool_name": "default.rgw.control",
377 "expected_final_pg_target": 32,
379 "default.rgw.meta": {
381 "pool_name": "default.rgw.meta",
387 "expected_final_pg_target": 32,
391 "pool_name": "default.rgw.log",
397 "expected_final_pg_target": 32,
399 "default.rgw.buckets.index": {
401 "pool_name": "default.rgw.buckets.index",
405 "capacity_ratio": 0.0002,
407 "expected_final_pg_target": 32,
409 "default.rgw.buckets.data": {
411 "pool_name": "default.rgw.buckets.data",
415 "capacity_ratio": 0.0457,
417 "expected_final_pg_target": 128,
419 "default.rgw.buckets.non-ec": {
421 "pool_name": "default.rgw.buckets.non-ec",
427 "expected_final_pg_target": 32,
429 "device_health_metrics": {
431 "pool_name": "device_health_metrics",
439 "expected_final_pg_target": 1,
441 "cephfs.teuthology.meta": {
443 "pool_name": "cephfs.teuthology.meta",
447 "capacity_ratio": 0.1389,
449 "pg_autoscale_bias": 4,
452 "expected_final_pg_target": 512,
454 "cephfs.teuthology.data": {
456 "pool_name": "cephfs.teuthology.data",
457 "pg_num_target": 256,
460 "capacity_ratio": 0.0006,
464 "expected_final_pg_target": 1024,
465 "expected_final_pg_target": 256,
467 "cephfs.scratch.meta": {
469 "pool_name": "cephfs.scratch.meta",
473 "capacity_ratio": 0.0027,
475 "pg_autoscale_bias": 4,
478 "expected_final_pg_target": 64,
480 "cephfs.scratch.data": {
482 "pool_name": "cephfs.scratch.data",
486 "capacity_ratio": 0.0027,
488 "expected_final_pg_target": 128,
490 "cephfs.teuthology.data-ec": {
492 "pool_name": "cephfs.teuthology.data-ec",
493 "pg_num_target": 1024,
496 "capacity_ratio": 0.8490,
500 "expected_final_pg_target": 1024,
504 "pool_name": "cephsqlite",
510 "expected_final_pg_target": 128,
513 expected_overlapped_roots
= set()
514 self
.helper_test(osd_dic
, rules
, pools
, expected_overlapped_roots
)