@@ -173,13 +173,15 @@ def print_host_details(compute_client, placement_client):
173
173
)
174
174
free_space_found = True
175
175
if not free_space_found :
176
+ # TODO(johngarbutt) allocation candidates only returns some not all candidates!
176
177
print (f"# WARNING - no free spaces found for { hostname } " )
177
178
178
179
for project , names in project_to_aggregate .items ():
179
180
for name in names :
180
181
print (
181
182
f'openstack_project_filter_aggregate{{project_id="{ project } ",aggregate="{ name } "}} 1'
182
183
)
184
+ return resource_providers
183
185
184
186
185
187
def print_project_usage (indentity_client , placement_client , compute_client ):
@@ -226,11 +228,46 @@ def print_project_usage(indentity_client, placement_client, compute_client):
226
228
)
227
229
228
230
231
+ def print_host_usage (resource_providers , placement_client ):
232
+ for name , data in resource_providers .items ():
233
+ rp_id = data ["uuid" ]
234
+ response = placement_client .get (
235
+ f"/resource_providers/{ rp_id } /usages" ,
236
+ headers = {"OpenStack-API-Version" : "placement 1.19" },
237
+ )
238
+ response .raise_for_status ()
239
+ rp_usages = response .json ()["usages" ]
240
+ resource_providers [name ]["usages" ] = rp_usages
241
+
242
+ for resource , amount in rp_usages .items ():
243
+ print (
244
+ f'openstack_hypervisor_usage{{hypervisor="{ name } ",'
245
+ f'resource="{ resource } "}} { amount } '
246
+ )
247
+
248
+ response = placement_client .get (
249
+ f"/resource_providers/{ rp_id } /inventories" ,
250
+ headers = {"OpenStack-API-Version" : "placement 1.19" },
251
+ )
252
+ response .raise_for_status ()
253
+ inventories = response .json ()["inventories" ]
254
+ resource_providers [name ]["inventories" ] = inventories
255
+
256
+ for resource , data in inventories .items ():
257
+ amount = data ["total" ] - data ["reserved" ]
258
+ print (
259
+ f'openstack_hypervisor_allocatable_capacity{{hypervisor="{ name } ",'
260
+ f'resource="{ resource } "}} { amount } '
261
+ )
262
+ # print(json.dumps(resource_providers, indent=2))
263
+
264
+
229
265
def print_exporter_data (app ):
230
266
print_host_free_details (app .compute_client , app .placement_client )
231
267
232
268
233
269
if __name__ == "__main__" :
234
270
conn = openstack .connect ()
235
- print_host_details (conn .compute , conn .placement )
271
+ resource_providers = print_host_details (conn .compute , conn .placement )
236
272
print_project_usage (conn .identity , conn .placement , conn .compute )
273
+ print_host_usage (resource_providers , conn .placement )
0 commit comments