)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"967b44cc4f0bbf7703d3025ede6d1225a91a2e7f","unresolved":true,"context_lines":[{"line_number":21,"context_line":"  an unprovision."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"This fix needs to be backported as far as possible, as this bug has"},{"line_number":24,"context_line":"existed since Antelope / 2023.1 (DEPLOYHOLD) or Bobcat / 2023.3"},{"line_number":25,"context_line":"(SERVIC*)."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Assisted-by: Claude Code"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"e63bf5d9_c54b242e","line":24,"updated":"2025-11-21 20:24:55.000000000","message":"nit: 2023.2","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"8041b004008512289f8f5ab2cb8ce75a14834a36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4db98f48_4db89ec7","updated":"2025-11-20 23:33:46.000000000","message":"Thanks JayF, I think that covers it and more.","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"2531d9de277744ab38939d8bd63fd8f44d0e94fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"dd1b22ea_2a23b9c8","updated":"2025-11-22 06:52:47.000000000","message":"recheck ssh timeout","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"612a96f70f93f779557600d1dfe0ef995d4f371c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"09f11cd4_11e98830","updated":"2025-11-21 07:42:08.000000000","message":"run-Quobyte CI","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"128260dddeed1928b6748a68c757282e7b4e8bc4","unresolved":true,"context_lines":[{"line_number":1766,"context_line":"            ironic_states.SERVICEHOLD,"},{"line_number":1767,"context_line":"        ]"},{"line_number":1768,"context_line":""},{"line_number":1769,"context_line":"        for state in servicing_states:"},{"line_number":1770,"context_line":"            mock_cleanup_deploy.reset_mock()"},{"line_number":1771,"context_line":"            mock_remove_instance_info.reset_mock()"},{"line_number":1772,"context_line":"            self.mock_conn.set_node_provision_state.reset_mock()"}],"source_content_type":"text/x-python","patch_set":2,"id":"58cd51fb_d74e8791","line":1769,"updated":"2025-11-21 21:35:26.000000000","message":"This might be better as a `ddt` case...","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a3a0e254f5c5fac60cb2487c5c7f296ace503d99","unresolved":true,"context_lines":[{"line_number":1373,"context_line":"            return"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        if (node.provision_state in _UNPROVISION_STATES or"},{"line_number":1376,"context_line":"            node.provision_state not in ironic_states.PROVISION_STATE_LIST):"},{"line_number":1377,"context_line":"            # NOTE(mgoddard): Ironic\u0027s node tear-down procedure includes all of"},{"line_number":1378,"context_line":"            # the things we do in _cleanup_deploy, so let\u0027s not repeat them"},{"line_number":1379,"context_line":"            # here. Doing so would also race with the node cleaning process,"}],"source_content_type":"text/x-python","patch_set":2,"id":"91eeb17d_6b417831","line":1376,"updated":"2025-11-21 20:41:35.000000000","message":"So, um.. Seems like if something is not an \"unprovisioned\" state it can\u0027t be also missing from \"provisioned\" right? Am I wrong that those two lists of states are representing either side of a binary are-you-provisioned-or-not state?","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"6a42a81e22f48c96702e2202088a5ed12cb671d9","unresolved":true,"context_lines":[{"line_number":1373,"context_line":"            return"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        if (node.provision_state in _UNPROVISION_STATES or"},{"line_number":1376,"context_line":"            node.provision_state not in ironic_states.PROVISION_STATE_LIST):"},{"line_number":1377,"context_line":"            # NOTE(mgoddard): Ironic\u0027s node tear-down procedure includes all of"},{"line_number":1378,"context_line":"            # the things we do in _cleanup_deploy, so let\u0027s not repeat them"},{"line_number":1379,"context_line":"            # here. Doing so would also race with the node cleaning process,"}],"source_content_type":"text/x-python","patch_set":2,"id":"c867cf3d_532086a0","line":1376,"in_reply_to":"91eeb17d_6b417831","updated":"2025-11-21 20:57:08.000000000","message":"PROVISION_STATE_LIST is the full list, as of the writing of this change, that we\u0027d ever expect an API client to see as a value of node.provision_state from an Ironic node.\n\n_UNPROVISION_STATE is a subset of that list, containing states that are valid for Nova to issue an unprovision from.\n\nThe third set (not in a variable here; essentially PROVISION_STATE_LIST - _UNPROVISION_STATES) are states where Nova *explicitly should not* attempt to unprovision from. This case generally represents situations where a delete was done at some point in time already so the node is already in an AVAILABLE or CLEAN* state.\n\nSo the logic is:\n- If node is in a state we know we should unprovision from OR If node is in a state this Nova version doesn\u0027t know about at all; perform an unprovision\n- (else) If node is in a state we know we CANNOT unprovision from, just do _cleanup_deploy activities (removing metadata).","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"128260dddeed1928b6748a68c757282e7b4e8bc4","unresolved":true,"context_lines":[{"line_number":1373,"context_line":"            return"},{"line_number":1374,"context_line":""},{"line_number":1375,"context_line":"        if (node.provision_state in _UNPROVISION_STATES or"},{"line_number":1376,"context_line":"            node.provision_state not in ironic_states.PROVISION_STATE_LIST):"},{"line_number":1377,"context_line":"            # NOTE(mgoddard): Ironic\u0027s node tear-down procedure includes all of"},{"line_number":1378,"context_line":"            # the things we do in _cleanup_deploy, so let\u0027s not repeat them"},{"line_number":1379,"context_line":"            # here. Doing so would also race with the node cleaning process,"}],"source_content_type":"text/x-python","patch_set":2,"id":"cd2ff4e9_51be7c81","line":1376,"in_reply_to":"c867cf3d_532086a0","updated":"2025-11-21 21:35:26.000000000","message":"\u003e PROVISION_STATE_LIST is the full list, as of the writing of this change, that we\u0027d ever expect an API client to see as a value of node.provision_state from an Ironic node.\n\nOkay, it reads (to me) as \"these are the states that are provisioned\" and really it\u0027s the \"states of provision\".\n\n\u003e _UNPROVISION_STATE is a subset of that list, containing states that are valid for Nova to issue an unprovision from.\n\u003e \n\u003e The third set (not in a variable here; essentially PROVISION_STATE_LIST - _UNPROVISION_STATES) are states where Nova *explicitly should not* attempt to unprovision from. This case generally represents situations where a delete was done at some point in time already so the node is already in an AVAILABLE or CLEAN* state.\n\u003e \n\u003e So the logic is:\n\u003e - If node is in a state we know we should unprovision from OR If node is in a state this Nova version doesn\u0027t know about at all; perform an unprovision\n\u003e - (else) If node is in a state we know we CANNOT unprovision from, just do _cleanup_deploy activities (removing metadata).\n\nOkay I guess that\u0027s your comment below, but it seems a little less explanatory of the conditional being down there. Either way I guess the two comments below are covering the \"known to be unprovisionable\" and \"unknown state, so unprovision\", effectively the two conditions in the `if`. It\u0027s just no obvious to me the way they\u0027re laid out.","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"}],"nova/virt/ironic/ironic_states.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"967b44cc4f0bbf7703d3025ede6d1225a91a2e7f","unresolved":true,"context_lines":[{"line_number":210,"context_line":"                        CLEANHOLD, ERROR, REBUILD, INSPECTING, INSPECTFAIL,"},{"line_number":211,"context_line":"                        INSPECTWAIT, RESCUE, RESCUEFAIL, RESCUEWAIT, RESCUING,"},{"line_number":212,"context_line":"                        SERVICING, SERVICEWAIT, SERVICEFAIL, SERVICEHOLD,"},{"line_number":213,"context_line":"                        UNRESCUEFAIL, UNRESCUING, ENROLL, VERIFYING)"},{"line_number":214,"context_line":"\"\"\" A list of all provision states. \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"2f1cdb49_ee66ba41","line":213,"updated":"2025-11-21 20:24:55.000000000","message":"General note: I intend to follow this up in Ironic (and then later to Nova) with splitting out our state machine work-code from our state machine constants, so we can maybe move to a model of just copying that file over from Ironic instead of maintaining a parallel, bizzaro-world version here.","commit_id":"56cb5f52fb833bd77bd0324ab24281edd59ab83e"}]}
