)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c27497fb_cc1494b3","updated":"2025-12-03 12:10:26.000000000","message":"please rebase https://review.opendev.org/c/openstack/nova/+/968446 on top of this so that they are in a patch change.\n\nalso the topic for both should be \"bug/2132020\"\n\nwe use the same topic when back-porting and to keep all patches related to the bug together for easy review.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"87bc9038_227cf1a4","in_reply_to":"c27497fb_cc1494b3","updated":"2025-12-04 14:40:38.000000000","message":"Thank you, I\u0027ve done just that.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8e22f43695a29b1e88eb9d441bdef6c4c2a3900d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"771dbf1d_b2f131e9","updated":"2026-01-23 15:38:23.000000000","message":"teim-ci: manual","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"47bd82f44b0a83a9a3a4e7485d35870b81700c28","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"8b9b54df_f92ee61b","updated":"2026-03-11 13:37:01.000000000","message":"Thanks for the quick reply","commit_id":"76711f87dfd8ec4e5e8549ee20566b1a8c89665c"}],"nova/tests/functional/regressions/test_bug_2132020.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestBase, self).setUp()"},{"line_number":41,"context_line":"        self.useFixture(nova_fixtures.RealPolicyFixture())"},{"line_number":42,"context_line":"        self.useFixture(nova_fixtures.NeutronFixture(self))"},{"line_number":43,"context_line":"        self.glance \u003d self.useFixture(nova_fixtures.GlanceFixture(self))"}],"source_content_type":"text/x-python","patch_set":1,"id":"99f1e0dd_ff9d49eb","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":76},"updated":"2025-12-03 12:10:26.000000000","message":"nit: you should use new style python super calls in new code.\n\nwe have not supoted python 2.7 in many years\n\n```suggestion\n        super().setUp()\n```","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def setUp(self):"},{"line_number":40,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestBase, self).setUp()"},{"line_number":41,"context_line":"        self.useFixture(nova_fixtures.RealPolicyFixture())"},{"line_number":42,"context_line":"        self.useFixture(nova_fixtures.NeutronFixture(self))"},{"line_number":43,"context_line":"        self.glance \u003d self.useFixture(nova_fixtures.GlanceFixture(self))"}],"source_content_type":"text/x-python","patch_set":1,"id":"910ee7da_28ba6698","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":76},"in_reply_to":"99f1e0dd_ff9d49eb","updated":"2025-12-04 14:40:38.000000000","message":"Fix applied.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        # Now we need to stub out the quota check routine so that we can"},{"line_number":60,"context_line":"        # simulate the race where the initial quota check in the API passes"},{"line_number":61,"context_line":"        # but fails in conductor once the instance has been created."},{"line_number":62,"context_line":"        self._setup_quota_mock(context)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        server \u003d self.api.post_server("},{"line_number":65,"context_line":"            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})"}],"source_content_type":"text/x-python","patch_set":1,"id":"8f9c5064_e976b370","line":62,"updated":"2025-12-03 12:10:26.000000000","message":"so this would normlaly raise a not impletned error.\n\nbut that is not happenign because you did not make this calss intherit form \ntest.TestCase\n\nto make that more clear i would rename the class \n\nOverQuotaRacePlacementAllocationsDeleteTestMixin","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        # Now we need to stub out the quota check routine so that we can"},{"line_number":60,"context_line":"        # simulate the race where the initial quota check in the API passes"},{"line_number":61,"context_line":"        # but fails in conductor once the instance has been created."},{"line_number":62,"context_line":"        self._setup_quota_mock(context)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        server \u003d self.api.post_server("},{"line_number":65,"context_line":"            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})"}],"source_content_type":"text/x-python","patch_set":1,"id":"ccca120c_7659cfa5","line":62,"in_reply_to":"8f9c5064_e976b370","updated":"2025-12-04 14:40:38.000000000","message":"Done","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        self._setup_quota_mock(context)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        server \u003d self.api.post_server("},{"line_number":65,"context_line":"            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})"},{"line_number":66,"context_line":"        server \u003d self._wait_for_state_change(server, \u0027ERROR\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # Assert Placement allocations for the instance remain despite"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f85f631_a6a7fdbb","line":65,"range":{"start_line":65,"start_character":23,"end_line":65,"end_character":58},"updated":"2025-12-03 12:10:26.000000000","message":"it woudl be better to create the flavor in the test so that its clear why this will exceed quota or at least document the values for cpu/ram/disk.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"f0f9e090e08c97282a5242d700a3783a79ce2c41","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        self._setup_quota_mock(context)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        server \u003d self.api.post_server("},{"line_number":65,"context_line":"            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})"},{"line_number":66,"context_line":"        server \u003d self._wait_for_state_change(server, \u0027ERROR\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # Assert Placement allocations for the instance remain despite"}],"source_content_type":"text/x-python","patch_set":1,"id":"a55e3732_1fac1bd1","line":65,"range":{"start_line":65,"start_character":23,"end_line":65,"end_character":58},"in_reply_to":"4adf2e8b_d0033c6e","updated":"2025-12-09 12:38:28.000000000","message":"I added the comment explaining why we\u0027re fine with using the default flavour.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        self._setup_quota_mock(context)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        server \u003d self.api.post_server("},{"line_number":65,"context_line":"            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})"},{"line_number":66,"context_line":"        server \u003d self._wait_for_state_change(server, \u0027ERROR\u0027)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # Assert Placement allocations for the instance remain despite"}],"source_content_type":"text/x-python","patch_set":1,"id":"4adf2e8b_d0033c6e","line":65,"range":{"start_line":65,"start_character":23,"end_line":65,"end_character":58},"in_reply_to":"7f85f631_a6a7fdbb","updated":"2025-12-04 14:40:38.000000000","message":"Does the exact flavour matter here? The functions overriding _setup_quota_mock() are written in a way that the respective overcomittment exception will be raised on recheck no matter what resource values are used. The first comment from test_allocations_delete_after_quota_fail() refers to that, but perhaps it\u0027s not quite clear.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestLegacy("},{"line_number":77,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestLegacy, self).setUp()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4a53d1fe_8549b587","line":77,"updated":"2025-12-03 12:10:26.000000000","message":"and then here follow the convetion that base classes come first then mixins\n\n```suggestion\n        test.TestCase, OverQuotaRacePlacementAllocationsDeleteTestMixin,):\n```","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestLegacy("},{"line_number":77,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestLegacy, self).setUp()"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7650b5d6_d03a0b12","line":77,"in_reply_to":"4a53d1fe_8549b587","updated":"2025-12-04 14:40:38.000000000","message":"Done","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":76,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestLegacy("},{"line_number":77,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestLegacy, self).setUp()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":82,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"}],"source_content_type":"text/x-python","patch_set":1,"id":"a98053d9_f5bb6407","line":79,"updated":"2025-12-03 12:10:26.000000000","message":"```suggestion\n        super().setUp()\n```","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":76,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestLegacy("},{"line_number":77,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestLegacy, self).setUp()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":82,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"}],"source_content_type":"text/x-python","patch_set":1,"id":"00c94c19_7f8b9247","line":79,"in_reply_to":"a98053d9_f5bb6407","updated":"2025-12-04 14:40:38.000000000","message":"Fix applied.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                    \u0027test_allocations_delete_after_quota_fail\u0027)"},{"line_number":88,"context_line":"            return original_check(_self, ctxt, flavor, min_count, *a, **kw)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.stub_out(\u0027nova.compute.utils.check_num_instances_quota\u0027,"},{"line_number":91,"context_line":"                      _legacy_quota_race_stub)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("}],"source_content_type":"text/x-python","patch_set":1,"id":"dd92a5c6_8ce6ed8f","line":91,"range":{"start_line":90,"start_character":8,"end_line":91,"end_character":46},"updated":"2025-12-03 12:10:26.000000000","message":"using self.stub_out is ok\n\nthere was a some dicussion about remvoign that in the past in favor of just using self.usefixture and fixtures.Mockpath or fixtures.MonkeyPatch directly but it didnt end up progressing so i generally dont use stub_out for new code but its not wrong to do so.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                    \u0027test_allocations_delete_after_quota_fail\u0027)"},{"line_number":88,"context_line":"            return original_check(_self, ctxt, flavor, min_count, *a, **kw)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.stub_out(\u0027nova.compute.utils.check_num_instances_quota\u0027,"},{"line_number":91,"context_line":"                      _legacy_quota_race_stub)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("}],"source_content_type":"text/x-python","patch_set":1,"id":"df0c1e4c_c9c0eea6","line":91,"range":{"start_line":90,"start_character":8,"end_line":91,"end_character":46},"in_reply_to":"dd92a5c6_8ce6ed8f","updated":"2025-12-04 14:40:38.000000000","message":"If using the direct solution is more modern, even if not mandatory, I can still use it.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("},{"line_number":95,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits,"},{"line_number":98,"context_line":"              self).setUp()"}],"source_content_type":"text/x-python","patch_set":1,"id":"c66ffab4_b8604437","line":95,"updated":"2025-12-03 12:10:26.000000000","message":"same here","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("},{"line_number":95,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits,"},{"line_number":98,"context_line":"              self).setUp()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bb9aacb8_9451ddba","line":95,"in_reply_to":"c66ffab4_b8604437","updated":"2025-12-04 14:40:38.000000000","message":"Done","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"55268bc1b9f08a85b08ece20fbb67987d4cccfe2","unresolved":true,"context_lines":[{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("},{"line_number":95,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits,"},{"line_number":98,"context_line":"              self).setUp()"},{"line_number":99,"context_line":"        # Most of the limits don\u0027t matter for this test,"},{"line_number":100,"context_line":"        # but we need to have some starting values."},{"line_number":101,"context_line":"        reglimits \u003d {local_limit.SERVER_METADATA_ITEMS: 128,"}],"source_content_type":"text/x-python","patch_set":1,"id":"55ccba60_78a7dc67","line":98,"range":{"start_line":97,"start_character":8,"end_line":98,"end_character":27},"updated":"2025-12-03 12:10:26.000000000","message":"```suggestion\n        super().setUp()\n```","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"bf1c102d1e1c755c7bb1fe15498dec4cd9190c5a","unresolved":false,"context_lines":[{"line_number":94,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("},{"line_number":95,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestBase, test.TestCase):"},{"line_number":96,"context_line":"    def setUp(self):"},{"line_number":97,"context_line":"        super(OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits,"},{"line_number":98,"context_line":"              self).setUp()"},{"line_number":99,"context_line":"        # Most of the limits don\u0027t matter for this test,"},{"line_number":100,"context_line":"        # but we need to have some starting values."},{"line_number":101,"context_line":"        reglimits \u003d {local_limit.SERVER_METADATA_ITEMS: 128,"}],"source_content_type":"text/x-python","patch_set":1,"id":"edbf93ab_ddaf702a","line":98,"range":{"start_line":97,"start_character":8,"end_line":98,"end_character":27},"in_reply_to":"55ccba60_78a7dc67","updated":"2025-12-04 14:40:38.000000000","message":"Fix applied.","commit_id":"5cc70891c11365824690ce425199126564d904a5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"85e6320a4828bf6b8ae8691d3f4687a29990c35b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestMixin("},{"line_number":30,"context_line":"    integrated_helpers.PlacementInstanceHelperMixin):"},{"line_number":31,"context_line":"    \"\"\"Test for bug 2132020 regarding leftover Placement allocations."},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dfb1e046_25defeac","line":29,"in_reply_to":"3e258ea8_90813c63","updated":"2026-01-23 16:43:51.000000000","message":"this will be part of the next patch in the series","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"85e6320a4828bf6b8ae8691d3f4687a29990c35b","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":55,"context_line":"        raise NotImplementedError()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_allocations_delete_after_quota_fail(self):"},{"line_number":58,"context_line":"        context \u003d nova_context.get_admin_context()"},{"line_number":59,"context_line":"        # Now we need to stub out the quota check routine so that we can"},{"line_number":60,"context_line":"        # simulate the race where the initial quota check in the API passes"}],"source_content_type":"text/x-python","patch_set":6,"id":"f7577a5c_ff18dcc7","line":57,"in_reply_to":"0d7d425c_82901c8c","updated":"2026-01-23 16:43:51.000000000","message":"\u003e Test could benefit from additional verification of build artifacts cleanup\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.7\n\u003e \n\u003e **Benefit**: More comprehensive test coverage would validate the complete cleanup process\n\u003e \n\u003e **Recommendation**:\n\u003e Add assertions to verify instance is in cell0 and other build artifacts are properly cleaned up\n\n\nthis is valid i guess. we can assert the instance has no host set and that its cell mapping ponit to cell 0\n\nthis woudl be the only time it would be vaild to delete its allcotions.","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"7ee87d140b7a63d7df6e34d9b4ecf9a86aa70d54","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":55,"context_line":"        raise NotImplementedError()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_allocations_delete_after_quota_fail(self):"},{"line_number":58,"context_line":"        context \u003d nova_context.get_admin_context()"},{"line_number":59,"context_line":"        # Now we need to stub out the quota check routine so that we can"},{"line_number":60,"context_line":"        # simulate the race where the initial quota check in the API passes"}],"source_content_type":"text/x-python","patch_set":6,"id":"8eb96726_d177c050","line":57,"in_reply_to":"a0fd6ebf_730d7a58","updated":"2026-03-04 10:46:17.000000000","message":"After patchset 5 of the change that\u0027s located on top of this commit, this discussion is not quite relevant anymore, as the fix has been moved out of _cleanup_build_artifacts().","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"a086219b2ed75f9a05935557ec03d3d08bc89362","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":55,"context_line":"        raise NotImplementedError()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_allocations_delete_after_quota_fail(self):"},{"line_number":58,"context_line":"        context \u003d nova_context.get_admin_context()"},{"line_number":59,"context_line":"        # Now we need to stub out the quota check routine so that we can"},{"line_number":60,"context_line":"        # simulate the race where the initial quota check in the API passes"}],"source_content_type":"text/x-python","patch_set":6,"id":"a0fd6ebf_730d7a58","line":57,"in_reply_to":"f7577a5c_ff18dcc7","updated":"2026-02-23 18:47:25.000000000","message":"Using hostID, I now check that the host is not set.\n\nI don\u0027t think checking for cell0 would be valid. When the exception for quota failure on recheck is raised, _cleanup_build_artifacts() is called (https://opendev.org/openstack/nova/src/branch/master/nova/conductor/manager.py#L1746). It explicitly skips over instances which failed before (\u0027Skip placeholders that were buried in cell0 or had their build requests deleted by the user before instance create.\u0027) and only after passing that check it sets the error state.\nTherefore, if an instance is left in ERROR on quota recheck and it has gotten to ERROR via the recheck path and not something else earlier, it should be anywhere but cell0.","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"85e6320a4828bf6b8ae8691d3f4687a29990c35b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        # the instance failing to schedule."},{"line_number":74,"context_line":"        allocs \u003d self.placement.get(\u0027/allocations/%s\u0027 % server[\u0027id\u0027]).body["},{"line_number":75,"context_line":"            \u0027allocations\u0027]"},{"line_number":76,"context_line":"        self.assertTrue(allocs,"},{"line_number":77,"context_line":"                        \u0027Placement allocations are unexpectedly empty.\u0027)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1d31bc0b_5e5510be","line":76,"in_reply_to":"0ca8df80_adf5c892","updated":"2026-01-23 16:43:51.000000000","message":"this is expected for the inital regression patch.","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"084cabb08fba542c2cb604305573d5afaebbe48f","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        test.TestCase, OverQuotaRacePlacementAllocationsDeleteTestMixin):"},{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super().setUp()"},{"line_number":84,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestMixin.setUp(self)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"}],"source_content_type":"text/x-python","patch_set":6,"id":"3dedf491_903c1973","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":68},"updated":"2025-12-09 12:58:50.000000000","message":"you shoudl not need to do this althougu the mixin should perhaps call  super().setUp() as well.","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"9ab1cafdc4d16fd4745d1ee257161f1c03b45e63","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        test.TestCase, OverQuotaRacePlacementAllocationsDeleteTestMixin):"},{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super().setUp()"},{"line_number":84,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestMixin.setUp(self)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"}],"source_content_type":"text/x-python","patch_set":6,"id":"fcd77999_9c4fe125","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":68},"in_reply_to":"3dedf491_903c1973","updated":"2025-12-09 13:07:48.000000000","message":"Having exactly one super().setUp() call in each class including the mixin was my initial idea, but then the attributes were not initialised properly and I failed at self.api reference. Is there some workaround to it?","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"a086219b2ed75f9a05935557ec03d3d08bc89362","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        test.TestCase, OverQuotaRacePlacementAllocationsDeleteTestMixin):"},{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super().setUp()"},{"line_number":84,"context_line":"        OverQuotaRacePlacementAllocationsDeleteTestMixin.setUp(self)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _setup_quota_mock(self, context):"},{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a6dad58_2bf71af0","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":68},"in_reply_to":"fcd77999_9c4fe125","updated":"2026-02-23 18:47:25.000000000","message":"Done","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"084cabb08fba542c2cb604305573d5afaebbe48f","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        def _legacy_quota_race_stub(_self, ctxt, flavor, min_count, *a, **kw):"},{"line_number":90,"context_line":"            if min_count \u003d\u003d 0:  # recheck path"},{"line_number":91,"context_line":"                raise exception.TooManyInstances("},{"line_number":92,"context_line":"                    \u0027test_allocations_delete_after_quota_fail\u0027)"},{"line_number":93,"context_line":"            return original_check(_self, ctxt, flavor, min_count, *a, **kw)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.useFixture("},{"line_number":96,"context_line":"            fixtures.MonkeyPatch("}],"source_content_type":"text/x-python","patch_set":6,"id":"71cb2d85_f2c50999","line":93,"range":{"start_line":90,"start_character":0,"end_line":93,"end_character":75},"updated":"2025-12-09 12:58:50.000000000","message":"ok so this is why this was confusing an why i as askign about the flvor\n\n\ni now realise the min_count should alwasy be 1 so this shoudl never raise ...\n\nyou are creating the server like this in the test.\n\n\n server \u003d self.api.post_server(\n            {\u0027server\u0027: self._build_server(networks\u003d\u0027none\u0027)})\n\nwhich calls\nhttps://github.com/openstack/nova/blob/8a4b000216c7a6c2673af78d7eb7f9bf938dc867/nova/tests/functional/integrated_helpers.py#L428-L475\n\nwhich does nto populate min_count which defaults to 1 according to the api ref\n\nhttps://docs.openstack.org/api-ref/compute/#create-multiple-servers\n\nso there is still somethign not quite addign up about how you are writing these tests.","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"9ab1cafdc4d16fd4745d1ee257161f1c03b45e63","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        def _legacy_quota_race_stub(_self, ctxt, flavor, min_count, *a, **kw):"},{"line_number":90,"context_line":"            if min_count \u003d\u003d 0:  # recheck path"},{"line_number":91,"context_line":"                raise exception.TooManyInstances("},{"line_number":92,"context_line":"                    \u0027test_allocations_delete_after_quota_fail\u0027)"},{"line_number":93,"context_line":"            return original_check(_self, ctxt, flavor, min_count, *a, **kw)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.useFixture("},{"line_number":96,"context_line":"            fixtures.MonkeyPatch("}],"source_content_type":"text/x-python","patch_set":6,"id":"95cdb32b_5cbaf493","line":93,"range":{"start_line":90,"start_character":0,"end_line":93,"end_character":75},"in_reply_to":"71cb2d85_f2c50999","updated":"2025-12-09 13:07:48.000000000","message":"I copied the logic from test_bug_1806064.py: https://opendev.org/openstack/nova/src/branch/master/nova/tests/functional/regressions/test_bug_1806064.py#L92","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"a086219b2ed75f9a05935557ec03d3d08bc89362","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        original_check \u003d compute_utils.check_num_instances_quota"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        def _legacy_quota_race_stub(_self, ctxt, flavor, min_count, *a, **kw):"},{"line_number":90,"context_line":"            if min_count \u003d\u003d 0:  # recheck path"},{"line_number":91,"context_line":"                raise exception.TooManyInstances("},{"line_number":92,"context_line":"                    \u0027test_allocations_delete_after_quota_fail\u0027)"},{"line_number":93,"context_line":"            return original_check(_self, ctxt, flavor, min_count, *a, **kw)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        self.useFixture("},{"line_number":96,"context_line":"            fixtures.MonkeyPatch("}],"source_content_type":"text/x-python","patch_set":6,"id":"1371a7bc_6360b5d0","line":93,"range":{"start_line":90,"start_character":0,"end_line":93,"end_character":75},"in_reply_to":"95cdb32b_5cbaf493","updated":"2026-02-23 18:47:25.000000000","message":"Done","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"85e6320a4828bf6b8ae8691d3f4687a29990c35b","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                _legacy_quota_race_stub))"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestUnifiedLimits("},{"line_number":102,"context_line":"        test.TestCase, OverQuotaRacePlacementAllocationsDeleteTestMixin):"},{"line_number":103,"context_line":"    def setUp(self):"},{"line_number":104,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":6,"id":"64cae3e2_d98b6a3d","line":101,"in_reply_to":"31e2efc9_55edaf2e","updated":"2026-01-23 16:43:51.000000000","message":"this is doen implictly via the shared test case","commit_id":"0de1bb3a74619879c4231eb7dbd68b7933858edb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"600e086cffc5f35b2ba84716539c038cbd8d56be","unresolved":true,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import fixtures"},{"line_number":16,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":17,"context_line":"from nova import context as nova_context"},{"line_number":18,"context_line":"from nova import exception"},{"line_number":19,"context_line":"from nova.limit import local as local_limit"},{"line_number":20,"context_line":"from nova.limit import placement as placement_limit"},{"line_number":21,"context_line":"from nova import test"},{"line_number":22,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":23,"context_line":"from nova.tests.functional import fixtures as func_fixtures"},{"line_number":24,"context_line":"from nova.tests.functional import integrated_helpers"},{"line_number":25,"context_line":"from oslo_limit import exception as limit_exceptions"},{"line_number":26,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestMixin("},{"line_number":30,"context_line":"    integrated_helpers.PlacementInstanceHelperMixin):"}],"source_content_type":"text/x-python","patch_set":11,"id":"128d0ee0_4b78cbb4","line":27,"range":{"start_line":15,"start_character":0,"end_line":27,"end_character":1},"updated":"2026-03-11 13:34:15.000000000","message":"this is the correct import ordering\n\n```suggestion\nimport fixtures\n\nfrom oslo_limit import exception as limit_exceptions\nfrom oslo_limit import fixture as limit_fixture\n\nfrom nova.compute import utils as compute_utils\nfrom nova import context as nova_context\nfrom nova import exception\nfrom nova.limit import local as local_limit\nfrom nova.limit import placement as placement_limit\nfrom nova import test\nfrom nova.tests import fixtures as nova_fixtures\nfrom nova.tests.functional import fixtures as func_fixtures\nfrom nova.tests.functional import integrated_helpers\n\n```","commit_id":"76711f87dfd8ec4e5e8549ee20566b1a8c89665c"},{"author":{"_account_id":38500,"name":"Dominik","display_name":"Dominik Danelski","email":"dominik@danelski.pl","username":"etua","status":"@ CloudFerro S.A."},"change_message_id":"47bd82f44b0a83a9a3a4e7485d35870b81700c28","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import fixtures"},{"line_number":16,"context_line":"from nova.compute import utils as compute_utils"},{"line_number":17,"context_line":"from nova import context as nova_context"},{"line_number":18,"context_line":"from nova import exception"},{"line_number":19,"context_line":"from nova.limit import local as local_limit"},{"line_number":20,"context_line":"from nova.limit import placement as placement_limit"},{"line_number":21,"context_line":"from nova import test"},{"line_number":22,"context_line":"from nova.tests import fixtures as nova_fixtures"},{"line_number":23,"context_line":"from nova.tests.functional import fixtures as func_fixtures"},{"line_number":24,"context_line":"from nova.tests.functional import integrated_helpers"},{"line_number":25,"context_line":"from oslo_limit import exception as limit_exceptions"},{"line_number":26,"context_line":"from oslo_limit import fixture as limit_fixture"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class OverQuotaRacePlacementAllocationsDeleteTestMixin("},{"line_number":30,"context_line":"    integrated_helpers.PlacementInstanceHelperMixin):"}],"source_content_type":"text/x-python","patch_set":11,"id":"89b75b30_afa6d2f6","line":27,"range":{"start_line":15,"start_character":0,"end_line":27,"end_character":1},"in_reply_to":"128d0ee0_4b78cbb4","updated":"2026-03-11 13:37:01.000000000","message":"Fix applied.","commit_id":"76711f87dfd8ec4e5e8549ee20566b1a8c89665c"}]}
