diff --git a/changelogs/fragments/1438-fix-inventory-service-collection.yml b/changelogs/fragments/1438-fix-inventory-service-collection.yml new file mode 100644 index 000000000..a908e39bc --- /dev/null +++ b/changelogs/fragments/1438-fix-inventory-service-collection.yml @@ -0,0 +1,2 @@ +bugfixes: + - nb_inventory - Fix service collection for version greater than 4.3 diff --git a/plugins/inventory/nb_inventory.py b/plugins/inventory/nb_inventory.py index ac4998da5..cbac91ab6 100644 --- a/plugins/inventory/nb_inventory.py +++ b/plugins/inventory/nb_inventory.py @@ -1328,6 +1328,15 @@ def refresh_services(self): if self.fetch_all: services = self.get_resource_list(url) + elif self.api_version >= version.parse("4.3.0"): + services = self.get_resource_list_chunked( + api_url=url, + query_key="parent_object_id", + # Query only affected devices and vms and sanitize the list to only contain every ID once + query_values=set( + chain(self.vms_lookup.keys(), self.devices_lookup.keys()) + ), + ) else: device_services = self.get_resource_list_chunked( api_url=url, @@ -1349,15 +1358,26 @@ def refresh_services(self): for service in services: service_id = service["id"] - if service.get("device"): - self.device_services_lookup[service["device"]["id"]][ - service_id - ] = service + if self.api_version >= version.parse("4.3.0"): + if service.get("parent_object_type") == "dcim.device": + self.device_services_lookup[service["parent_object_id"]][ + service_id + ] = service - if service.get("virtual_machine"): - self.vm_services_lookup[service["virtual_machine"]["id"]][ - service_id - ] = service + if service.get("parent_object_type") == "virtualization.virtualmachine": + self.vm_services_lookup[service["parent_object_id"]][ + service_id + ] = service + else: + if service.get("device"): + self.device_services_lookup[service["device"]["id"]][ + service_id + ] = service + + if service.get("virtual_machine"): + self.vm_services_lookup[service["virtual_machine"]["id"]][ + service_id + ] = service def refresh_virtual_disks(self): url_vm_virtual_disks = ( diff --git a/tests/integration/targets/inventory-v4.1/compare_inventory_json.py b/tests/integration/targets/inventory-v4.1/compare_inventory_json.py index ccdf8bd52..20b39e83e 100755 --- a/tests/integration/targets/inventory-v4.1/compare_inventory_json.py +++ b/tests/integration/targets/inventory-v4.1/compare_inventory_json.py @@ -141,7 +141,7 @@ def main(): if result: # Dictionary is not empty - print differences - print(json.dumps(result, sort_keys=True, indent=4)) + print(result.to_json(indent=4)) sys.exit(1) else: # Success, no differences diff --git a/tests/integration/targets/inventory-v4.2/compare_inventory_json.py b/tests/integration/targets/inventory-v4.2/compare_inventory_json.py index ccdf8bd52..20b39e83e 100755 --- a/tests/integration/targets/inventory-v4.2/compare_inventory_json.py +++ b/tests/integration/targets/inventory-v4.2/compare_inventory_json.py @@ -141,7 +141,7 @@ def main(): if result: # Dictionary is not empty - print differences - print(json.dumps(result, sort_keys=True, indent=4)) + print(result.to_json(indent=4)) sys.exit(1) else: # Success, no differences diff --git a/tests/integration/targets/inventory-v4.3/compare_inventory_json.py b/tests/integration/targets/inventory-v4.3/compare_inventory_json.py index ccdf8bd52..20b39e83e 100755 --- a/tests/integration/targets/inventory-v4.3/compare_inventory_json.py +++ b/tests/integration/targets/inventory-v4.3/compare_inventory_json.py @@ -141,7 +141,7 @@ def main(): if result: # Dictionary is not empty - print differences - print(json.dumps(result, sort_keys=True, indent=4)) + print(result.to_json(indent=4)) sys.exit(1) else: # Success, no differences