diff --git a/openstack_controller/assets/configuration/spec.yaml b/openstack_controller/assets/configuration/spec.yaml index c415166b0dac6..94ea3b6c07c5b 100644 --- a/openstack_controller/assets/configuration/spec.yaml +++ b/openstack_controller/assets/configuration/spec.yaml @@ -132,7 +132,7 @@ files: paginated_limit sets the number of items some api calls should return. value: example: 1000 - display_default: 1000 + default: null type: integer - name: openstack_config_file_path description: | diff --git a/openstack_controller/changelog.d/16400.added b/openstack_controller/changelog.d/16400.added new file mode 100644 index 0000000000000..72d0f734f1e01 --- /dev/null +++ b/openstack_controller/changelog.d/16400.added @@ -0,0 +1 @@ +Add pagination support for ironic nodes endpoint diff --git a/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py b/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py index 2533bb362d2f7..6bdbb2e0864f0 100644 --- a/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py +++ b/openstack_controller/datadog_checks/openstack_controller/api/api_rest.py @@ -292,6 +292,43 @@ def get_network_quota(self, project_id): response.raise_for_status() return response.json().get('quota', []) + def make_paginated_request(self, url, resource_name, marker_name, params=None): + marker = None + item_list = [] + params = {} if params is None else params + while True: + self.log.debug( + "making paginated request [limit=%s, marker=%s]", + self.config.paginated_limit, + marker, + ) + + params['limit'] = self.config.paginated_limit + if marker is not None: + params['marker'] = marker + + response = self.http.get(url, params=params) + response.raise_for_status() + + response_json = response.json() + resources = response_json.get(resource_name, []) + if len(resources) > 0: + last_item = resources[-1] + next = last_item.get('next') + item_list.extend(resources) + if next is None: + break + + marker = last_item.get(marker_name) + else: + marker = None + break + + if marker is None: + break + + return item_list + def get_baremetal_nodes(self): def use_legacy_nodes_resource(microversion): self.log.debug("Configured ironic microversion: %s", microversion) @@ -308,18 +345,24 @@ def use_legacy_nodes_resource(microversion): self.log.debug("Collecting baremetal nodes with use_legacy_nodes_resource =%s", legacy_microversion) return legacy_microversion - self.log.debug("getting baremetal nodes [microversion=%s]", self.config.ironic_microversion) ironic_endpoint = self._catalog.get_endpoint_by_type(Component.Types.BAREMETAL.value) + params = {} if use_legacy_nodes_resource(self.config.ironic_microversion): - response = self.http.get('{}/v1/nodes/detail'.format(ironic_endpoint)) + url = '{}/v1/nodes/detail'.format(ironic_endpoint) else: params = {'detail': True} + url = '{}/v1/nodes'.format(ironic_endpoint) - response = self.http.get('{}/v1/nodes'.format(ironic_endpoint), params=params) + if self.config.paginated_limit is not None: + return self.make_paginated_request(url, 'nodes', 'uuid', params) - response.raise_for_status() - return response.json().get('nodes', []) + else: + response = self.http.get(url, params=params) + response.raise_for_status() + + response_json = response.json() + return response_json.get("nodes", []) def get_baremetal_conductors(self): response = self.http.get( diff --git a/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py b/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py index cc0de3cf3f71f..6fd3a6aa0ac9e 100644 --- a/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py +++ b/openstack_controller/datadog_checks/openstack_controller/api/api_sdk.py @@ -118,6 +118,12 @@ def get_response_time(self, endpoint_types): response.raise_for_status() return response.elapsed.total_seconds() * 1000 + def call_paginated_api(self, method_name, *args, **kwargs): + if kwargs.get('limit') is None: + kwargs.pop('limit') + + return method_name(*args, **kwargs) + def get_identity_regions(self): return [region.to_dict(original_names=True) for region in self.connection.identity.regions()] @@ -202,7 +208,12 @@ def get_network_quota(self, project_id): return self.connection.network.get_quota(project_id, details=True).to_dict(original_names=True) def get_baremetal_nodes(self): - return [node.to_dict(original_names=True) for node in self.connection.baremetal.nodes(details=True)] + return [ + node.to_dict(original_names=True) + for node in self.call_paginated_api( + self.connection.baremetal.nodes, details=True, limit=self.config.paginated_limit + ) + ] def get_baremetal_conductors(self): return [conductor.to_dict(original_names=True) for conductor in self.connection.baremetal.conductors()] diff --git a/openstack_controller/datadog_checks/openstack_controller/config.py b/openstack_controller/datadog_checks/openstack_controller/config.py index dae7fb610c4ed..5eac0b4de7c0b 100644 --- a/openstack_controller/datadog_checks/openstack_controller/config.py +++ b/openstack_controller/datadog_checks/openstack_controller/config.py @@ -47,6 +47,7 @@ def __init__(self, logger, config): self.ironic_microversion = config.ironic_microversion self.endpoint_interface = config.endpoint_interface self.endpoint_region_id = config.endpoint_region_id + self.paginated_limit = config.paginated_limit self.api_type = None self.validate() diff --git a/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py index f277ba8880fdb..750583a5a5c9b 100644 --- a/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py +++ b/openstack_controller/datadog_checks/openstack_controller/config_models/defaults.py @@ -97,7 +97,7 @@ def instance_min_collection_interval(): def instance_paginated_limit(): - return 1000 + return None def instance_persist_connections(): diff --git a/openstack_controller/tests/conftest.py b/openstack_controller/tests/conftest.py index 77f4d6b24f58a..cf4532ca168d1 100644 --- a/openstack_controller/tests/conftest.py +++ b/openstack_controller/tests/conftest.py @@ -167,7 +167,7 @@ def method(method, url, file='response', headers=None, params=None): filename = file request_path = url request_path = request_path.replace('?', '/') - if params is not None: + if params: param_string = '/'.join('{}={}'.format(key, str(val)) for key, val in params.items()) request_path = '{}/{}'.format(url, param_string) if any(re.search(pattern, request_path) for pattern in NOVA_ENDPOINTS): @@ -546,7 +546,7 @@ def connection_baremetal(request, mock_responses): param = request.param if hasattr(request, 'param') and request.param is not None else {} http_error = param.get('http_error') - def nodes(details): + def nodes(details, limit=None): if http_error and 'nodes' in http_error: raise requests.exceptions.HTTPError(response=http_error['nodes']) return [ diff --git a/openstack_controller/tests/endpoints.py b/openstack_controller/tests/endpoints.py index 81e9caf305431..11682359bc431 100644 --- a/openstack_controller/tests/endpoints.py +++ b/openstack_controller/tests/endpoints.py @@ -3,17 +3,17 @@ # Licensed under a 3-clause BSD style license (see LICENSE) NOVA_ENDPOINTS = [ - '^/compute/v2\\.1/limits$', - '^/compute/v2\\.1/os-services$', - '^/compute/v2\\.1/flavors/detail$', - '^/compute/v2\\.1/os-hypervisors/detail$', - '^/compute/v2\\.1/os-quota-sets/[^/]+$', - '^/compute/v2\\.1/servers/detail/project_id=[^/]+$', - '^/compute/v2\\.1/servers/[^/]+/diagnostics$', + '^/compute/v2\\.1/limits', + '^/compute/v2\\.1/os-services', + '^/compute/v2\\.1/flavors/detail', + '^/compute/v2\\.1/os-hypervisors/detail', + '^/compute/v2\\.1/os-quota-sets/[^/]+', + '^/compute/v2\\.1/servers/detail/project_id=[^/]+', + '^/compute/v2\\.1/servers/[^/]+/diagnostics', ] IRONIC_ENDPOINTS = [ - '^/baremetal/v1/nodes/detail$', - '^/baremetal/v1/nodes/detail=True$', - '^/baremetal/v1/conductors$', + '^/baremetal/v1/nodes/detail', + '^/baremetal/v1/nodes/detail=True', + '^/baremetal/v1/conductors', ] diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json new file mode 100644 index 0000000000000..c661c19a10638 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json @@ -0,0 +1,116 @@ +{ + "nodes": [ + { + "uuid": "20512deb-e493-4796-a046-5d6e4e072c95", + "created_at": "2023-04-06T16:55:34+00:00", + "updated_at": "2023-04-06T16:57:38+00:00", + "automated_clean": null, + "bios_interface": "fake", + "boot_interface": "fake", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "fake", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "fake-hardware", + "driver_info": {}, + "driver_internal_info": { + "last_power_state_change": "2023-04-06T16:55:42.474124" + }, + "extra": {}, + "fault": null, + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "fake", + "instance_info": {}, + "instance_uuid": null, + "last_error": null, + "lessee": null, + "maintenance": false, + "maintenance_reason": null, + "management_interface": "fake", + "name": "test", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "fake", + "power_state": "power on", + "properties": {}, + "protected": false, + "protected_reason": null, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:56:21+00:00", + "raid_config": {}, + "raid_interface": "fake", + "rescue_interface": "fake", + "reservation": null, + "resource_class": null, + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [], + "vendor_interface": "fake", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": null, + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume", + "rel": "bookmark" + } + ] + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json new file mode 100644 index 0000000000000..efaf4d245ab9a --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json @@ -0,0 +1,47 @@ +{ + "nodes": [ + { + "uuid": "20512deb-e493-4796-a046-5d6e4e072c95", + "created_at": "2023-04-06T16:55:34+00:00", + "updated_at": "2023-04-06T16:57:38+00:00", + "console_enabled": false, + "driver": "fake-hardware", + "driver_info": {}, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": null, + "maintenance": false, + "maintenance_reason": null, + "power_state": "power on", + "properties": {}, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:56:21+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "bookmark" + } + ], + "chassis_uuid": null, + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "bookmark" + } + ] + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json new file mode 100644 index 0000000000000..6a15631c294f2 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "created_at": "2023-04-06T15:27:05+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6231 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:54:04.258902", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:56.433647", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.508661" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-1", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "available", + "provision_updated_at": "2023-04-06T15:33:46+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json new file mode 100644 index 0000000000000..5aad67bb15c95 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json @@ -0,0 +1,60 @@ +{ + "nodes": [ + { + "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "created_at": "2023-04-06T15:27:05+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "console_enabled": false, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6231 + }, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "provision_state": null, + "provision_updated_at": "2023-04-06T15:33:46+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "bookmark" + } + ], + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json new file mode 100644 index 0000000000000..e352c78bdcce2 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656", + "created_at": "2023-04-06T15:27:22+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6232 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:54:09.291881", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:56.628016", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.857774" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-2", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "available", + "provision_updated_at": "2023-04-06T15:33:44+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=54855e59-83ca-46f8-a78f-55d3370e0656" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json new file mode 100644 index 0000000000000..9838009d5620d --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json @@ -0,0 +1,60 @@ +{ + "nodes": [ + { + "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656", + "created_at": "2023-04-06T15:27:22+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "console_enabled": false, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6232 + }, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "provision_state": null, + "provision_updated_at": "2023-04-06T15:33:44+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "bookmark" + } + ], + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=54855e59-83ca-46f8-a78f-55d3370e0656" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response-1.80.json new file mode 100644 index 0000000000000..e38e34e2f889c --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response-1.80.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "created_at": "2023-04-06T15:26:48+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6230 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:52:27.251280", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:50.985822", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:43.388480" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-0", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:58:16+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response.json new file mode 100644 index 0000000000000..332a69a97b2ef --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail/limit=1/response.json @@ -0,0 +1,60 @@ +{ + "nodes": [ + { + "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "created_at": "2023-04-06T15:26:48+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "console_enabled": false, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6230 + }, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:58:16+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "bookmark" + } + ], + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json new file mode 100644 index 0000000000000..c661c19a10638 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response-1.80.json @@ -0,0 +1,116 @@ +{ + "nodes": [ + { + "uuid": "20512deb-e493-4796-a046-5d6e4e072c95", + "created_at": "2023-04-06T16:55:34+00:00", + "updated_at": "2023-04-06T16:57:38+00:00", + "automated_clean": null, + "bios_interface": "fake", + "boot_interface": "fake", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "fake", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "fake-hardware", + "driver_info": {}, + "driver_internal_info": { + "last_power_state_change": "2023-04-06T16:55:42.474124" + }, + "extra": {}, + "fault": null, + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "fake", + "instance_info": {}, + "instance_uuid": null, + "last_error": null, + "lessee": null, + "maintenance": false, + "maintenance_reason": null, + "management_interface": "fake", + "name": "test", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "fake", + "power_state": "power on", + "properties": {}, + "protected": false, + "protected_reason": null, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:56:21+00:00", + "raid_config": {}, + "raid_interface": "fake", + "rescue_interface": "fake", + "reservation": null, + "resource_class": null, + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [], + "vendor_interface": "fake", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": null, + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/volume", + "rel": "bookmark" + } + ] + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json new file mode 100644 index 0000000000000..efaf4d245ab9a --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=54855e59-83ca-46f8-a78f-55d3370e0656/response.json @@ -0,0 +1,47 @@ +{ + "nodes": [ + { + "uuid": "20512deb-e493-4796-a046-5d6e4e072c95", + "created_at": "2023-04-06T16:55:34+00:00", + "updated_at": "2023-04-06T16:57:38+00:00", + "console_enabled": false, + "driver": "fake-hardware", + "driver_info": {}, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": null, + "maintenance": false, + "maintenance_reason": null, + "power_state": "power on", + "properties": {}, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:56:21+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95", + "rel": "bookmark" + } + ], + "chassis_uuid": null, + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/20512deb-e493-4796-a046-5d6e4e072c95/ports", + "rel": "bookmark" + } + ] + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json new file mode 100644 index 0000000000000..07e7f6123a8fe --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response-1.80.json @@ -0,0 +1,145 @@ +{ + "nodes": [ + { + "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "created_at": "2023-04-06T15:27:05+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6231 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:54:04.258902", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:56.433647", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.508661" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-1", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "available", + "provision_updated_at": "2023-04-06T15:33:46+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e" + } + ] +} \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json new file mode 100644 index 0000000000000..d6fac595a3deb --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0/response.json @@ -0,0 +1,60 @@ +{ + "nodes": [ + { + "uuid": "bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "created_at": "2023-04-06T15:27:05+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "console_enabled": false, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6231 + }, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node bd7a61bb-5fe0-4c93-9628-55e312f9ef0e, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "provision_state": null, + "provision_updated_at": "2023-04-06T15:33:46+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e", + "rel": "bookmark" + } + ], + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/ports", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json new file mode 100644 index 0000000000000..e352c78bdcce2 --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response-1.80.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656", + "created_at": "2023-04-06T15:27:22+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6232 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:54:09.291881", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:56.628016", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:49.857774" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-2", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "available", + "provision_updated_at": "2023-04-06T15:33:44+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=54855e59-83ca-46f8-a78f-55d3370e0656" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json new file mode 100644 index 0000000000000..9838009d5620d --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/marker=bd7a61bb-5fe0-4c93-9628-55e312f9ef0e/response.json @@ -0,0 +1,60 @@ +{ + "nodes": [ + { + "uuid": "54855e59-83ca-46f8-a78f-55d3370e0656", + "created_at": "2023-04-06T15:27:22+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "console_enabled": false, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6232 + }, + "extra": {}, + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 54855e59-83ca-46f8-a78f-55d3370e0656, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "provision_state": null, + "provision_updated_at": "2023-04-06T15:33:44+00:00", + "reservation": null, + "target_power_state": null, + "target_provision_state": null, + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656", + "rel": "bookmark" + } + ], + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/54855e59-83ca-46f8-a78f-55d3370e0656/ports", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=54855e59-83ca-46f8-a78f-55d3370e0656" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response-1.80.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response-1.80.json new file mode 100644 index 0000000000000..e38e34e2f889c --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response-1.80.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "created_at": "2023-04-06T15:26:48+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6230 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:52:27.251280", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:50.985822", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:43.388480" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-0", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:58:16+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response.json b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response.json new file mode 100644 index 0000000000000..e38e34e2f889c --- /dev/null +++ b/openstack_controller/tests/fixtures/GET/baremetal/v1/nodes/detail=True/limit=1/response.json @@ -0,0 +1,146 @@ +{ + "nodes": [ + { + "uuid": "9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "created_at": "2023-04-06T15:26:48+00:00", + "updated_at": "2023-04-11T19:10:40+00:00", + "automated_clean": null, + "bios_interface": "no-bios", + "boot_interface": "ipxe", + "boot_mode": null, + "clean_step": {}, + "conductor_group": "", + "console_enabled": false, + "console_interface": "no-console", + "deploy_interface": "direct", + "deploy_step": {}, + "description": null, + "driver": "ipmi", + "driver_info": { + "ipmi_address": "10.164.0.32", + "ipmi_username": "admin", + "ipmi_password": "******", + "ipmi_port": 6230 + }, + "driver_internal_info": { + "clean_steps": null, + "agent_erase_devices_iterations": 1, + "agent_erase_devices_zeroize": true, + "agent_continue_if_secure_erase_failed": false, + "agent_continue_if_ata_erase_failed": false, + "agent_enable_nvme_secure_erase": true, + "agent_enable_ata_secure_erase": true, + "disk_erasure_concurrency": 4, + "agent_erase_skip_read_only": false, + "last_power_state_change": "2023-04-06T16:52:27.251280", + "agent_version": "9.5.0.dev4", + "agent_last_heartbeat": "2023-04-06T15:32:50.985822", + "hardware_manager_version": { + "generic_hardware_manager": "1.1" + }, + "agent_cached_clean_steps_refreshed": "2023-04-06T15:32:43.388480" + }, + "extra": {}, + "fault": "power failure", + "inspection_finished_at": null, + "inspection_started_at": null, + "inspect_interface": "no-inspect", + "instance_info": {}, + "instance_uuid": null, + "last_error": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "lessee": null, + "maintenance": true, + "maintenance_reason": "During sync_power_state, max retries exceeded for node 9d72cf53-19c8-4942-9314-005fa5d2a6a0, node state None does not match expected state 'power on'. Updating DB state to 'None' Switching node to maintenance mode. Error: IPMI call failed: power status.", + "management_interface": "ipmitool", + "name": "node-0", + "network_data": {}, + "network_interface": "flat", + "owner": "01b21103a92d4997ab09e46ff8346bd5", + "power_interface": "ipmitool", + "power_state": null, + "properties": { + "cpu_arch": "x86_64", + "capabilities": "boot_mode:uefi", + "vendor": "unknown", + "root_device": { + "vendor": "0x1af4" + } + }, + "protected": false, + "protected_reason": null, + "provision_state": "active", + "provision_updated_at": "2023-04-06T16:58:16+00:00", + "raid_config": {}, + "raid_interface": "no-raid", + "rescue_interface": "no-rescue", + "reservation": null, + "resource_class": "baremetal", + "retired": false, + "retired_reason": null, + "secure_boot": null, + "storage_interface": "noop", + "target_power_state": null, + "target_provision_state": null, + "target_raid_config": {}, + "traits": [ + "CUSTOM_GOLD" + ], + "vendor_interface": "ipmitool", + "links": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0", + "rel": "bookmark" + } + ], + "conductor": "agent-integrations-openstack-ironic", + "allocation_uuid": null, + "chassis_uuid": "64c4893f-6a49-4b2c-b5d8-ab955367b504", + "ports": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/ports", + "rel": "bookmark" + } + ], + "states": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/states", + "rel": "bookmark" + } + ], + "portgroups": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/portgroups", + "rel": "bookmark" + } + ], + "volume": [ + { + "href": "http://34.141.226.224/baremetal/v1/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "self" + }, + { + "href": "http://34.141.226.224/baremetal/nodes/9d72cf53-19c8-4942-9314-005fa5d2a6a0/volume", + "rel": "bookmark" + } + ], + "next": "http://34.141.226.224/baremetal/v1/nodes/detail?sort_key=id&sort_dir=asc&limit=1&marker=9d72cf53-19c8-4942-9314-005fa5d2a6a0" + } + ] + } + \ No newline at end of file diff --git a/openstack_controller/tests/test_unit_ironic.py b/openstack_controller/tests/test_unit_ironic.py index 9b9ad7fd7db6c..238ffc1507c6e 100644 --- a/openstack_controller/tests/test_unit_ironic.py +++ b/openstack_controller/tests/test_unit_ironic.py @@ -11,6 +11,7 @@ from datadog_checks.base import AgentCheck from datadog_checks.dev.http import MockResponse from datadog_checks.openstack_controller.api.type import ApiType +from datadog_checks.openstack_controller.openstack_controller import OpenStackControllerCheck from tests.common import remove_service_from_catalog from tests.metrics import ( CONDUCTORS_METRICS_IRONIC_MICROVERSION_1_80, @@ -328,6 +329,71 @@ def test_nodes_metrics(aggregator, check, dd_run_check, metrics): ) +@pytest.mark.parametrize( + ('connection_baremetal', 'instance', 'metrics', 'api_type'), + [ + pytest.param( + None, + configs.REST, + NODES_METRICS_IRONIC_MICROVERSION_DEFAULT, + ApiType.REST, + id='api rest no microversion', + ), + pytest.param( + None, + configs.REST_IRONIC_MICROVERSION_1_80, + NODES_METRICS_IRONIC_MICROVERSION_1_80, + ApiType.REST, + id='api rest microversion 1.80', + ), + pytest.param( + None, + configs.SDK, + NODES_METRICS_IRONIC_MICROVERSION_DEFAULT, + ApiType.SDK, + id='api sdk no microversion', + ), + pytest.param( + None, + configs.SDK_IRONIC_MICROVERSION_1_80, + NODES_METRICS_IRONIC_MICROVERSION_1_80, + ApiType.SDK, + id='api sdk microversion 1.80', + ), + ], + indirect=['connection_baremetal'], +) +@pytest.mark.usefixtures('mock_http_get', 'mock_http_post', 'openstack_connection') +def test_ironic_nodes_pagination( + aggregator, dd_run_check, instance, metrics, api_type, mock_http_get, connection_baremetal +): + instance['paginated_limit'] = 1 + dd_run_check(OpenStackControllerCheck('test', {}, [instance])) + for metric in metrics: + aggregator.assert_metric( + metric['name'], + count=metric['count'], + value=metric['value'], + tags=metric['tags'], + hostname=metric.get('hostname'), + ) + + if api_type == ApiType.REST: + args_list = [] + for call in mock_http_get.call_args_list: + args, _ = call + args_list += list(args) + + baremetal_url = ( + 'http://127.0.0.1:6385/baremetal/v1/nodes/detail' + if instance.get("ironic_microversion", None) != "1.80" + else 'http://127.0.0.1:6385/baremetal/v1/nodes' + ) + assert args_list.count(baremetal_url) == 4 + if api_type == ApiType.SDK: + assert connection_baremetal.nodes.call_count == 1 + + @pytest.mark.parametrize( ('mock_http_get', 'connection_baremetal', 'instance', 'api_type'), [