)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ironic: Reproduce node leak after local delete"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When nova-api deletes an instance locally, nothing calls the virt"},{"line_number":10,"context_line":"driver, so the instance\u0027s Ironic node stays provisioned. nova-api does a"},{"line_number":11,"context_line":"local delete when the instance\u0027s nova-compute service is down, and when"},{"line_number":12,"context_line":"instance.host is None, which is the case after a failed build cleanup."},{"line_number":13,"context_line":"The _cleanup_running_deleted_instances periodic task is meant to clean"},{"line_number":14,"context_line":"up such nodes, but it gets its candidates from list_instance_uuids(),"},{"line_number":15,"context_line":"which reads node_cache since commit fa3cf7d50c, and _refresh_cache()"},{"line_number":16,"context_line":"leaves these nodes out of node_cache. The node is never unprovisioned."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Add IronicFixture, a fake Ironic API backed by an in-memory set of"},{"line_number":19,"context_line":"nodes, so that functional tests can run the real Ironic driver. Use it"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1facf5b4_9ffa1441","line":16,"range":{"start_line":9,"start_character":0,"end_line":16,"end_character":70},"updated":"2026-10-07 17:26:09.000000000","message":"so the issue here is that once an ironic node is slected in the cusdleur for the intall build the instance.host shoudl have been set to the managing comptue service.  and that should not be cleared until it is delted on the hypervisor which in this case is ironic. so retrying a alterniat host as part of build shoudl not proceed unless teh ironic node that failed to build is deprovisioned or at the very least nolonger assgined to the nova instnace in the ironic db.\n\nso this feel liek an incrrect cleanup or build step left the instnace recored in an invlaid state and then that activated the local delete path in such a way that the perodic could not clean it up when the ironic compute service is restored to a workign state.","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"13dfab73_ae290bec","updated":"2026-10-07 17:26:09.000000000","message":"this is a nice start\n\nnote we do not use gerrits WIP freature in nova or openstack in gernal you shoudl add [WIP] in the trial or set wrokflow -1 instead","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"}],"nova/tests/functional/regressions/test_bug_2169200.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":88,"context_line":"        self.assertIn(\u0027We are not deleting this\u0027, log)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_local_delete_compute_down_node_is_not_unprovisioned(self):"},{"line_number":91,"context_line":"        server \u003d self._create_server("},{"line_number":92,"context_line":"            flavor_id\u003dself.flavor_id, networks\u003d\u0027none\u0027)"},{"line_number":93,"context_line":"        self.assertEqual(server[\u0027id\u0027], self.node.instance_id)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        # Delete the server while nova-compute is down: nova-api does a local"},{"line_number":96,"context_line":"        # delete and does not contact Ironic."}],"source_content_type":"text/x-python","patch_set":2,"id":"22c01385_3a3eb2b4","line":93,"range":{"start_line":91,"start_character":8,"end_line":93,"end_character":61},"updated":"2026-10-07 17:26:09.000000000","message":"so at this point instnace.host shoudl be set to hte managing ironic compeute service host \"compute\"","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":107,"context_line":"        self.api.put_service(service[\u0027id\u0027], {\u0027forced_down\u0027: False})"},{"line_number":108,"context_line":"        self.compute \u003d self.restart_compute_service("},{"line_number":109,"context_line":"            self.compute, keep_hypervisor_state\u003dFalse)"},{"line_number":110,"context_line":"        self.compute.manager._cleanup_running_deleted_instances("},{"line_number":111,"context_line":"            context.get_admin_context())"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        # FIXME(shermanm): This is bug 2169200. The node should have been"},{"line_number":114,"context_line":"        # unprovisioned, but node_cache leaves it out because its instance is"}],"source_content_type":"text/x-python","patch_set":2,"id":"c4d18d7a_747bb905","line":111,"range":{"start_line":110,"start_character":8,"end_line":111,"end_character":40},"updated":"2026-10-07 17:26:09.000000000","message":"that works but we normlly trigger them via self._run_periodics()","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        # unprovisioned, but node_cache leaves it out because its instance is"},{"line_number":115,"context_line":"        # deleted, so _cleanup_running_deleted_instances never finds it. The"},{"line_number":116,"context_line":"        # node stays active with the deleted instance, and nova reports it as"},{"line_number":117,"context_line":"        # an orphan compute node."},{"line_number":118,"context_line":"        self.ironic.connection.set_node_provision_state.assert_not_called()"},{"line_number":119,"context_line":"        self.assertEqual(ironic_states.ACTIVE, self.node.provision_state)"},{"line_number":120,"context_line":"        self.assertEqual(server[\u0027id\u0027], self.node.instance_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"69840de9_3cacbb37","line":117,"updated":"2026-10-07 17:26:09.000000000","message":"ya the ironic driver likely need a custom implemtion of that.\n\nspefificly for the runnign delete instance perodic it needs to look at all compute nodes that are managed by this compute service, then it need to check fi any of the compute node are in use in ironic but expected to be free based on nova compute node table (i..e no non deleted instnaces assocated with it) it oculd also double check if the the lesse feild or simialr in the ironic node refence a deleted nova instnace.\n\nunfortunetly once the actul instance recored has been purged form the nova cell db we cannot safely repair it form the nova side but if the recoded exists we can.","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":120,"context_line":"        self.assertEqual(server[\u0027id\u0027], self.node.instance_id)"},{"line_number":121,"context_line":"        self._assert_orphan_compute_node()"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def test_local_delete_host_none_node_is_not_unprovisioned(self):"},{"line_number":124,"context_line":"        server \u003d self._create_server("},{"line_number":125,"context_line":"            flavor_id\u003dself.flavor_id, networks\u003d\u0027none\u0027)"},{"line_number":126,"context_line":"        self.assertEqual(server[\u0027id\u0027], self.node.instance_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"44101820_5d7f68e9","line":123,"range":{"start_line":123,"start_character":8,"end_line":123,"end_character":61},"updated":"2026-10-07 17:26:09.000000000","message":"host on the instnace  represent the compute service edpoint that manages the compute node.\n\nit shoudl only ever be none if an isntance failed to schedule and is burried in cell 0\n\nif the instnace recored is in a real cell for ironic it shoudl never again be NONE\n\nfor vms the only time after the inial boot call to ca compute service, that a instance.host can/should be none is if it is shleve offloaded.\n\nshelve is not supproted with ironic.","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":131,"context_line":"        # instance and the deploy later fails."},{"line_number":132,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":133,"context_line":"        instance \u003d objects.Instance.get_by_uuid(ctxt, server[\u0027id\u0027])"},{"line_number":134,"context_line":"        instance.host \u003d None"},{"line_number":135,"context_line":"        instance.node \u003d None"},{"line_number":136,"context_line":"        instance.compute_id \u003d None"},{"line_number":137,"context_line":"        instance.vm_state \u003d vm_states.ERROR"},{"line_number":138,"context_line":"        instance.save()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a0bf7e1_a0c10dfa","line":135,"range":{"start_line":134,"start_character":0,"end_line":135,"end_character":28},"updated":"2026-10-07 17:26:09.000000000","message":"it shoudl not be none after a failed build when the vm is in the error state so this is the core of the bug.","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0580675f4edbad90f2541f917df1eb9438dcddd6","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        instance.node \u003d None"},{"line_number":136,"context_line":"        instance.compute_id \u003d None"},{"line_number":137,"context_line":"        instance.vm_state \u003d vm_states.ERROR"},{"line_number":138,"context_line":"        instance.save()"},{"line_number":139,"context_line":"        self.node.provision_state \u003d ironic_states.DEPLOYFAIL"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # With instance.host None, nova-api does a local delete and does not"}],"source_content_type":"text/x-python","patch_set":2,"id":"1e83e12d_1778ed16","line":138,"updated":"2026-10-07 17:26:09.000000000","message":"forcign this state like this is not really correct in our fuctional tests.\n\ninstead what you shoudl do is hook a function early in the ironic driver spawn code and have it raise a buildfailed excption so that the create above woudl have put the instance into an error state.\n\nyou shoudl select a function during the build phase to replcate it properly.","commit_id":"fcf01968e20b9bc93185601e36ae3616365f792a"}]}
