Skip to content

Commit 9762660

Browse files
Request flavor details when needed
This change handles the case where the server flavor doesn't have the details.
1 parent a41da3a commit 9762660

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "zuul-capacity"
3-
version = "0.3.1"
3+
version = "0.4.0"
44
description = "Zuul capacity exporter"
55
readme = "README.md"
66
requires-python = ">=3.12"

zuul-capacity.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,27 @@ class Resource:
1717

1818
def from_server(server):
1919
flavor = server["flavor"]
20+
if flavor["ram"] == 0:
21+
return None
2022
return Resource(flavor["ram"], flavor["vcpus"])
2123

22-
def get_resources(cloud):
24+
def from_flavor(flavors, cloud, server):
25+
flavor_id = server["flavor"].id
26+
if flavor_id not in flavors:
27+
log.info("Requesting flavor %s", flavor_id)
28+
flavors[flavor_id] = cloud.get_flavor(flavor_id)
29+
flavor = flavors[flavor_id]
30+
return Resource(flavor["ram"], flavor["vcpus"])
31+
32+
def get_resources(flavors, cloud):
2333
"Get the cloud resources."
2434
resources = []
2535
for server in cloud.compute.servers():
2636
try:
27-
resources.append(Resource.from_server(server))
37+
if resource := Resource.from_server(server):
38+
resources.append(resource)
39+
else:
40+
resources.append(Resource.from_flavor(flavors, cloud, server))
2841
except Exception as e:
2942
log.exception("Couldn't get server resource %s: %s", server, e)
3043
return resources
@@ -49,8 +62,8 @@ def get_providers(nodepool_yaml):
4962
providers[provider.get("name", "unknown")] = Provider.from_nodepool(provider)
5063
return providers
5164

52-
def update_provider_metric(metrics, name, provider):
53-
resources = get_resources(provider.cloud)
65+
def update_provider_metric(metrics, flavors, name, provider):
66+
resources = get_resources(flavors, provider.cloud)
5467
metrics["instances"].labels(cloud=name).set(len(resources))
5568
cpu, mem = 0, 0
5669
for resource in resources:
@@ -59,10 +72,10 @@ def update_provider_metric(metrics, name, provider):
5972
metrics["cpu"].labels(cloud=name).set(cpu)
6073
metrics["mem"].labels(cloud=name).set(mem)
6174

62-
def update_providers_metric(metrics, providers):
75+
def update_providers_metric(metrics, flavors, providers):
6376
for (name, provider) in providers.items():
6477
try:
65-
update_provider_metric(metrics, name, provider)
78+
update_provider_metric(metrics, flavors, name, provider)
6679
except Exception as e:
6780
log.exception("Couldn't get provider %s: %s", name, e)
6881
metrics["error"].labels(cloud=name).inc()
@@ -86,16 +99,17 @@ def main():
8699
)
87100

88101
providers = get_providers(args.nodepool)
102+
flavors = dict()
89103

90-
update_providers_metric(metrics, providers)
104+
update_providers_metric(metrics, flavors, providers)
91105

92106
# Initialize connection
93107
log.info("Starting exporter at :%d for %d provider", args.port, len(providers))
94108
start_http_server(args.port)
95109

96110
while True:
97111
time.sleep(300)
98-
update_providers_metric(metrics, providers)
112+
update_providers_metric(metrics, flavors, providers)
99113

100114

101115

0 commit comments

Comments
 (0)