1
1
#!/usr/bin/env python3
2
2
3
- import openstack
3
+ import collections
4
+ import json
4
5
6
+ import openstack
5
7
6
- def get_capacity (conn ):
7
- flavors = list (conn .compute .flavors ())
8
- print ("Flavor count: " + str (len (flavors )))
9
8
9
+ def get_capacity_per_flavor (conn , flavors ):
10
10
capacity_per_flavor = {}
11
+
11
12
for flavor in flavors :
12
13
resources , traits = get_placement_request (flavor )
13
- candidates = get_candidates (conn , resources , traits , flavor . name )
14
- # intentionally add empty responses into this
15
- capacity_per_flavor [ flavor . name ] = candidates
14
+ max_per_host = get_max_per_host (conn , resources , traits )
15
+ capacity_per_flavor [ flavor . name ] = max_per_host
16
+
16
17
return capacity_per_flavor
17
18
18
19
@@ -31,7 +32,7 @@ def get_placement_request(flavor):
31
32
return resources , required_traits
32
33
33
34
34
- def get_candidates (conn , resources , required_traits , flavor_name ):
35
+ def get_max_per_host (conn , resources , required_traits ):
35
36
resource_str = "," .join (
36
37
[key + ":" + str (value ) for key , value in resources .items () if value ]
37
38
)
@@ -59,15 +60,34 @@ def get_candidates(conn, resources, required_traits, flavor_name):
59
60
if max_counts :
60
61
count_per_rp [rp_uuid ] = min (max_counts )
61
62
62
- print ("Found " + str (len (count_per_rp .keys ())) + " candidate hosts for " + flavor_name )
63
63
return count_per_rp
64
64
65
65
66
66
def main ():
67
67
conn = openstack .connect ()
68
- capacity_per_flavor = get_capacity (conn )
69
- import json
70
- print (json .dumps (capacity_per_flavor , indent = 2 ))
68
+
69
+ flavors = list (conn .compute .flavors ())
70
+ capacity_per_flavor = get_capacity_per_flavor (conn , flavors )
71
+
72
+ # total capacity per flavor
73
+ flavor_names = sorted ([f .name for f in flavors ])
74
+ for flavor_name in flavor_names :
75
+ counts = capacity_per_flavor .get (flavor_name , {}).values ()
76
+ total = 0 if not counts else sum (counts )
77
+ print (f'openstack_total_capacity_per_flavor{{flavor="{ flavor_name } "}} { total } ' )
78
+
79
+ # capacity per host
80
+ raw_rps = list (conn .placement .resource_providers ())
81
+ resource_providers = {rp .name : rp .id for rp in raw_rps }
82
+ hostnames = sorted (resource_providers .keys ())
83
+ for hostname in hostnames :
84
+ rp_id = resource_providers [hostname ]
85
+ for flavor_name in flavor_names :
86
+ all_counts = capacity_per_flavor .get (flavor_name , {})
87
+ our_count = all_counts .get (rp_id , 0 )
88
+ print (
89
+ f'openstack_capacity_by_hostname{{hypervisor="{ hostname } ",flavor="{ flavor_name } "}} { our_count } '
90
+ )
71
91
72
92
73
93
main ()
0 commit comments