-
Notifications
You must be signed in to change notification settings - Fork 1
/
generate_stats.py
85 lines (67 loc) · 2.32 KB
/
generate_stats.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/python
import concurrent.futures
import json
import subprocess
import openstack
def new_project(uuid):
return {
"name": project_map[uuid],
"server_count": 0,
"flavor_ram": 0,
"flavor_vcpus": 0,
"volume_count": 0,
"volume_size": 0,
"floating_ips": 0,
}
stats = {}
project_map = {}
pool = concurrent.futures.ThreadPoolExecutor(max_workers=50)
futures = []
# Our OpenStack is slow. This script is designed to submit everything in
# parallel and then process results as they are returned.
vols = pool.submit(openstack.list_volumes)
servers = pool.submit(openstack.list_servers)
fips = pool.submit(openstack.list_floating_ips)
projects = pool.submit(openstack.list_projects)
for volume in vols.result():
futures.append(
pool.submit(lambda vid: ("volume", openstack.get_volume(vid)), volume["ID"])
)
for server in servers.result():
futures.append(
pool.submit(lambda sid: ("server", openstack.get_server(sid)), server["ID"])
)
for fip in fips.result():
futures.append(
pool.submit(lambda fid: ("fip", openstack.get_floating_ip(fid)), fip["ID"])
)
for project in projects.result():
project_map[project["ID"]] = project["Name"]
for future in concurrent.futures.as_completed(futures):
try:
rtype, rinfo = future.result()
except subprocess.CalledProcessError as err:
print("ignoring failed result:", err.stderr)
if rtype == "fip":
pid = rinfo["project_id"]
if pid not in stats:
stats[pid] = new_project(pid)
if rinfo["port_id"]:
stats[pid]["floating_ips"] += 1
elif rtype == "volume":
pid = rinfo["os-vol-tenant-attr:tenant_id"]
if pid not in stats:
stats[pid] = new_project(pid)
stats[pid]["volume_count"] += 1
stats[pid]["volume_size"] += rinfo["size"]
elif rtype == "server":
pid = rinfo["project_id"]
if pid not in stats:
stats[pid] = new_project(pid)
flavor_id = rinfo["flavor"].split("(")[1].split(")")[0]
flavor = openstack.get_flavor(flavor_id)
stats[pid]["server_count"] += 1
stats[pid]["flavor_ram"] += flavor["ram"]
stats[pid]["flavor_vcpus"] += flavor["vcpus"]
with open("stats.json", "w") as fd:
json.dump(stats, fd, indent=2)