)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4046a18405f0246f6637408bfa414ef389ab64cc","unresolved":true,"context_lines":[{"line_number":16,"context_line":"yet another flag to the test helper to serve as an escape hatch."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"This patch stabilize the test suit against the race conditions that can"},{"line_number":19,"context_line":"be forced by injecting a sleep at:"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":" diff --git a/nova/scheduler/utils.py b/nova/scheduler/utils.py"},{"line_number":22,"context_line":" index e8d832574e..9e9d9d816b 100644"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"8859ec2e_6fcb677e","line":19,"range":{"start_line":19,"start_character":3,"end_line":19,"end_character":30},"updated":"2026-08-17 16:27:03.000000000","message":"ah for a second i tought you were suggeting addign a time.sleep but that just how you forced it locally it got it.","commit_id":"ffef2d1a5324c5ec01a16c7d343f3f00db0885f5"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f02e9e5200c1c5a6f2da27812526e967020233a2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d5adf8ca_5346f250","updated":"2026-07-28 08:40:14.000000000","message":"Something relevant\n```\n\nTraceback (most recent call last):\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/test.py\", line 352, in setUp\n    self.notifier \u003d self.useFixture(\n                    ~~~~~~~~~~~~~~~^\n        nova_fixtures.NotificationFixture(self))\n        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313-threading/lib/python3.13/site-packages/testtools/testcase.py\", line 1038, in useFixture\n    raise exc_info[1].with_traceback(exc_info[2])\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313-threading/lib/python3.13/site-packages/testtools/testcase.py\", line 1014, in useFixture\n    fixture.setUp()\n    ~~~~~~~~~~~~~^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/tests/fixtures/notifications.py\", line 210, in setUp\n    rpc.LEGACY_NOTIFIER.transport,\n    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nAttributeError: \u0027NoneType\u0027 object has no attribute \u0027transport\u0027\n\n```","commit_id":"d457c843fd5c7f35092d9d20107d7bb8c8280298"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aae63019a304d3c4a5499e44e500595b46866b2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c2fc8e05_4e7c6add","in_reply_to":"d5adf8ca_5346f250","updated":"2026-07-28 14:34:53.000000000","message":"Done","commit_id":"d457c843fd5c7f35092d9d20107d7bb8c8280298"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"49f532e6e9a8864901c3e8869bcf558b8652da65","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6da09b4a_7efaa35c","updated":"2026-08-05 02:47:40.000000000","message":"1 question inline in case you have tried that and it did not work?","commit_id":"1a934c82f599158e8ccc7f521707fbd9bfc3f12f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f0e2d7138ddccbb64f3a4ce37b022344e5b65a9c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"85947da5_6b0d8bfc","updated":"2026-08-14 17:18:16.000000000","message":"lgtm, thanks","commit_id":"ffef2d1a5324c5ec01a16c7d343f3f00db0885f5"}],"nova/tests/functional/compute/test_init_host.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4046a18405f0246f6637408bfa414ef389ab64cc","unresolved":true,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        def sleep_forever(*args, **kwargs):"},{"line_number":163,"context_line":"            stop.wait(1000000)"},{"line_number":164,"context_line":"            return orig_claim(*args, **kwargs)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        with mock.patch(\u0027nova.compute.resource_tracker.ResourceTracker.\u0027"},{"line_number":167,"context_line":"                        \u0027instance_claim\u0027, new\u003dsleep_forever):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4e80d55f_98a2efd5","line":164,"range":{"start_line":164,"start_character":19,"end_line":164,"end_character":46},"updated":"2026-08-17 16:27:03.000000000","message":"ok so before we were not acctully doing the isntance claim at all and now we will after the tread event is notifed.\n\ni guess this is more corect overall.","commit_id":"ffef2d1a5324c5ec01a16c7d343f3f00db0885f5"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"49f532e6e9a8864901c3e8869bcf558b8652da65","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        self, server, expected_status, max_retries\u003d10,"},{"line_number":146,"context_line":"        error_event_type\u003dNone"},{"line_number":147,"context_line":"    ):"},{"line_number":148,"context_line":"        if expected_status \u003d\u003d \"ERROR\":"},{"line_number":149,"context_line":"            # Nova sets the ERROR state on the instance before recording the"},{"line_number":150,"context_line":"            # actual fault in the DB or sending the error notification. So"},{"line_number":151,"context_line":"            # most of the cases when a test needs to wait for an instance to"},{"line_number":152,"context_line":"            # reach ERROR state is actually also wants to assert the fault."},{"line_number":153,"context_line":"            # To avoid occasional test failure where a test sees the ERROR"},{"line_number":154,"context_line":"            # state but fails to found the fault in the server response"},{"line_number":155,"context_line":"            # lets enforce that the test also waits for the error notification."},{"line_number":156,"context_line":"            if error_event_type is None:"},{"line_number":157,"context_line":"                self.fail(\"To avoid race conditions waiting for the \""},{"line_number":158,"context_line":"                          \"ERROR state and having the actual error recorded \""},{"line_number":159,"context_line":"                          \"in the DB pass the action specific \""},{"line_number":160,"context_line":"                          \"error_event_type to this call.\")"},{"line_number":161,"context_line":"            if getattr(self, \u0027notifier\u0027, None) is None:"},{"line_number":162,"context_line":"                self.fail(\"_wait_for_state_change() needs a \""},{"line_number":163,"context_line":"                          \"NotificationFixture added to your test as \""},{"line_number":164,"context_line":"                          \"\u0027notifier\u0027\")"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            self.notifier.wait_for_versioned_notifications(error_event_type)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dbc1447a_0c8faac4","line":164,"range":{"start_line":148,"start_character":0,"end_line":164,"end_character":39},"updated":"2026-08-05 02:47:40.000000000","message":"We do load the faults during get servers right so I am wondering why it is not reflecting the fault when _wait_for_state_change() calls the get_server (L131)\n\nor can we just wait here for fault to be uploaded in the instance if error state change is asked to wait? means if the server is asked to wait for an error state, then this wait method should wait for error state as well as wait for the fault to be populated (for example, we can call InstanceList.fill_faults()) so that tests can check/assert on error/fault details.\n\nif you have tried it and it could not work for any reason, please add in comment so that we know why we did not populate the \u0027fault\u0027 here","commit_id":"1a934c82f599158e8ccc7f521707fbd9bfc3f12f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8753a90e0ec7770be16b614599fa88871c0cdb22","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        self, server, expected_status, max_retries\u003d10,"},{"line_number":146,"context_line":"        error_event_type\u003dNone"},{"line_number":147,"context_line":"    ):"},{"line_number":148,"context_line":"        if expected_status \u003d\u003d \"ERROR\":"},{"line_number":149,"context_line":"            # Nova sets the ERROR state on the instance before recording the"},{"line_number":150,"context_line":"            # actual fault in the DB or sending the error notification. So"},{"line_number":151,"context_line":"            # most of the cases when a test needs to wait for an instance to"},{"line_number":152,"context_line":"            # reach ERROR state is actually also wants to assert the fault."},{"line_number":153,"context_line":"            # To avoid occasional test failure where a test sees the ERROR"},{"line_number":154,"context_line":"            # state but fails to found the fault in the server response"},{"line_number":155,"context_line":"            # lets enforce that the test also waits for the error notification."},{"line_number":156,"context_line":"            if error_event_type is None:"},{"line_number":157,"context_line":"                self.fail(\"To avoid race conditions waiting for the \""},{"line_number":158,"context_line":"                          \"ERROR state and having the actual error recorded \""},{"line_number":159,"context_line":"                          \"in the DB pass the action specific \""},{"line_number":160,"context_line":"                          \"error_event_type to this call.\")"},{"line_number":161,"context_line":"            if getattr(self, \u0027notifier\u0027, None) is None:"},{"line_number":162,"context_line":"                self.fail(\"_wait_for_state_change() needs a \""},{"line_number":163,"context_line":"                          \"NotificationFixture added to your test as \""},{"line_number":164,"context_line":"                          \"\u0027notifier\u0027\")"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            self.notifier.wait_for_versioned_notifications(error_event_type)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ed1a1326_88ba61d3","line":164,"range":{"start_line":148,"start_character":0,"end_line":164,"end_character":39},"in_reply_to":"dbc1447a_0c8faac4","updated":"2026-08-14 15:01:27.000000000","message":"\u003e We do load the faults during get servers right so I am wondering why it is not reflecting the fault when _wait_for_state_change() calls the get_server (L131)\n\nThe fault key is optional in the response:\n\n```\nfault (Optional)  body object\nA fault object. Only displayed when the server status is ERROR or DELETED and a fault occurred.\n```\n\nAnd the code only include the key if there is fault recorded on the instance:\n\nhttps://github.com/openstack/nova/blob/48d4b3f7032364e2030035a33596c0f407cb0279/nova/api/openstack/compute/views/servers.py#L322\n\nSo when the instance is in ERROR but no fault is recorded (yet) then the response does not have the fault key.\n\n\u003e or can we just wait here for fault to be uploaded in the instance if error state change is asked to wait? means if the server is asked to wait for an error state, then this wait method should wait for error state as well as wait for the fault to be populated (for example, we can call InstanceList.fill_faults()) so that tests can check/assert on error/fault details.\n\nI tried the polling for the fault key approach that seems cleaner so lets go with it.","commit_id":"1a934c82f599158e8ccc7f521707fbd9bfc3f12f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f0e2d7138ddccbb64f3a4ce37b022344e5b65a9c","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self, server, expected_status, max_retries\u003d10,"},{"line_number":146,"context_line":"        error_event_type\u003dNone"},{"line_number":147,"context_line":"    ):"},{"line_number":148,"context_line":"        if expected_status \u003d\u003d \"ERROR\":"},{"line_number":149,"context_line":"            # Nova sets the ERROR state on the instance before recording the"},{"line_number":150,"context_line":"            # actual fault in the DB or sending the error notification. So"},{"line_number":151,"context_line":"            # most of the cases when a test needs to wait for an instance to"},{"line_number":152,"context_line":"            # reach ERROR state is actually also wants to assert the fault."},{"line_number":153,"context_line":"            # To avoid occasional test failure where a test sees the ERROR"},{"line_number":154,"context_line":"            # state but fails to found the fault in the server response"},{"line_number":155,"context_line":"            # lets enforce that the test also waits for the error notification."},{"line_number":156,"context_line":"            if error_event_type is None:"},{"line_number":157,"context_line":"                self.fail(\"To avoid race conditions waiting for the \""},{"line_number":158,"context_line":"                          \"ERROR state and having the actual error recorded \""},{"line_number":159,"context_line":"                          \"in the DB pass the action specific \""},{"line_number":160,"context_line":"                          \"error_event_type to this call.\")"},{"line_number":161,"context_line":"            if getattr(self, \u0027notifier\u0027, None) is None:"},{"line_number":162,"context_line":"                self.fail(\"_wait_for_state_change() needs a \""},{"line_number":163,"context_line":"                          \"NotificationFixture added to your test as \""},{"line_number":164,"context_line":"                          \"\u0027notifier\u0027\")"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"            self.notifier.wait_for_versioned_notifications(error_event_type)"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1c4275b9_dc0395c5","line":164,"range":{"start_line":148,"start_character":0,"end_line":164,"end_character":39},"in_reply_to":"ed1a1326_88ba61d3","updated":"2026-08-14 17:18:16.000000000","message":"right fault is only populated in response when it is recorded.","commit_id":"1a934c82f599158e8ccc7f521707fbd9bfc3f12f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"f0e2d7138ddccbb64f3a4ce37b022344e5b65a9c","unresolved":true,"context_lines":[{"line_number":146,"context_line":"            server \u003d api.get_server(server[\u0027id\u0027])"},{"line_number":147,"context_line":"            if all([server[attr] \u003d\u003d expected_params[attr]"},{"line_number":148,"context_line":"                    for attr in expected_params]):"},{"line_number":149,"context_line":"                if not wait_for_fault or \u0027fault\u0027 in server:"},{"line_number":150,"context_line":"                    break"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            retry_count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"ab584dc2_0b166a38","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":59},"updated":"2026-08-14 17:18:16.000000000","message":"++","commit_id":"ffef2d1a5324c5ec01a16c7d343f3f00db0885f5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"64f42bfc55b7a53233e5051be343af5351ddbaa7","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            server \u003d api.get_server(server[\u0027id\u0027])"},{"line_number":147,"context_line":"            if all([server[attr] \u003d\u003d expected_params[attr]"},{"line_number":148,"context_line":"                    for attr in expected_params]):"},{"line_number":149,"context_line":"                if not wait_for_fault or \u0027fault\u0027 in server:"},{"line_number":150,"context_line":"                    break"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"            retry_count +\u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"26f96caa_4b940bd6","line":149,"range":{"start_line":149,"start_character":0,"end_line":149,"end_character":59},"in_reply_to":"ab584dc2_0b166a38","updated":"2026-08-17 09:07:37.000000000","message":"Acknowledged","commit_id":"ffef2d1a5324c5ec01a16c7d343f3f00db0885f5"}]}
