)]}'
{"/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":"70c503613a3389992955731805b7545281001fff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b639763c_ed9f0087","updated":"2023-05-24 20:31:39.000000000","message":"ironic.tests.unit.api.controllers.v1.test_versions.TestMaxVersionString.test_max_version_not_pinned_in_release_mappings\n-----------------------------------------------------------------------------------------------------------------------\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    Traceback (most recent call last):\n\n      File \"/home/jkreger/ironic/ironic/tests/unit/api/controllers/v1/test_versions.py\", line 84, in test_max_version_not_pinned_in_release_mappings\n    self.assertEqual(release_mappings.RELEASE_MAPPING[\u0027master\u0027][\u0027api\u0027],\n\n      File \"/home/jkreger/ironic/.tox/py3/lib/python3.9/site-packages/testtools/testcase.py\", line 394, in assertEqual\n    self.assertThat(observed, matcher, message)\n\n      File \"/home/jkreger/ironic/.tox/py3/lib/python3.9/site-packages/testtools/testcase.py\", line 481, in assertThat\n    raise mismatch_error\n\n    testtools.matchers._impl.MismatchError: \u00271.83\u0027 !\u003d \u00271.84\u0027","commit_id":"3c76788c71fc49e3800e24b955d225188de1c35a"},{"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":"e12ce562a8ad760c5c4ab6f9170ec987e71a0fa0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"693c0a05_5c9db206","updated":"2023-06-06 21:04:13.000000000","message":"-1 is for that one confusing place in conductor/steps.py; rest of the feedback is advisory\n\nThanks! This looks super cool!","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"}],"doc/source/admin/reserved-functional-steps.rst":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Reserved Functional Steps"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"In the execution of the cleaning, and deployment steps frameworks, some step"}],"source_content_type":"text/x-rst","patch_set":2,"id":"886ef55b_1f1d2cc3","line":2,"updated":"2023-03-31 15:11:22.000000000","message":"This is a good start, but maybe we need to common place \"How steps work\" with a detailed explanation, including this aspect.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Reserved Functional Steps"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"In the execution of the cleaning, and deployment steps frameworks, some step"}],"source_content_type":"text/x-rst","patch_set":2,"id":"64f2d0f1_c1698d0d","line":2,"in_reply_to":"886ef55b_1f1d2cc3","updated":"2023-04-07 17:33:22.000000000","message":"I was kind of thinking the exact same thing. It felt wrong we didn\u0027t already have a place.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":17,"context_line":"|           | which will result in the process resuming upon the next  |"},{"line_number":18,"context_line":"|           | heartbeat operation. During this time, heartbeat         |"},{"line_number":19,"context_line":"|           | operations will continue be recorded by Ironic, but will |"},{"line_number":20,"context_line":"|           | not be acted upon, preventing the node from timing out.  |"},{"line_number":21,"context_line":"+-----------+----------------------------------------------------------+"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In the these cases, the interface upon which the method is expected is"}],"source_content_type":"text/x-rst","patch_set":2,"id":"f0b093cd_58e81913","line":20,"updated":"2023-03-31 15:11:22.000000000","message":"Do we need more details guidance on how to access the node? For example, by looking at agent_url in driver_internal_info (it\u0027s probably the right time to move it to a new top-level property)","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":false,"context_lines":[{"line_number":17,"context_line":"|           | which will result in the process resuming upon the next  |"},{"line_number":18,"context_line":"|           | heartbeat operation. During this time, heartbeat         |"},{"line_number":19,"context_line":"|           | operations will continue be recorded by Ironic, but will |"},{"line_number":20,"context_line":"|           | not be acted upon, preventing the node from timing out.  |"},{"line_number":21,"context_line":"+-----------+----------------------------------------------------------+"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In the these cases, the interface upon which the method is expected is"}],"source_content_type":"text/x-rst","patch_set":2,"id":"442516b7_1d13a675","line":20,"in_reply_to":"80d4220e_14d15522","updated":"2023-05-05 00:44:37.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":17,"context_line":"|           | which will result in the process resuming upon the next  |"},{"line_number":18,"context_line":"|           | heartbeat operation. During this time, heartbeat         |"},{"line_number":19,"context_line":"|           | operations will continue be recorded by Ironic, but will |"},{"line_number":20,"context_line":"|           | not be acted upon, preventing the node from timing out.  |"},{"line_number":21,"context_line":"+-----------+----------------------------------------------------------+"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"In the these cases, the interface upon which the method is expected is"}],"source_content_type":"text/x-rst","patch_set":2,"id":"80d4220e_14d15522","line":20,"in_reply_to":"f0b093cd_58e81913","updated":"2023-04-07 17:33:22.000000000","message":"I see that is kind of out of scope/disjointed. It is not all just so someone can access the node. Could be any number of things.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":23,"context_line":"In the these cases, the interface upon which the method is expected is"},{"line_number":24,"context_line":"ignored, and the step is acted upon based upon just the step\u0027s name."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Example"},{"line_number":29,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9ab2b97f_31f50617","line":26,"updated":"2023-03-31 15:11:22.000000000","message":"Missing: unhold example","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":true,"context_lines":[{"line_number":23,"context_line":"In the these cases, the interface upon which the method is expected is"},{"line_number":24,"context_line":"ignored, and the step is acted upon based upon just the step\u0027s name."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Example"},{"line_number":29,"context_line":"-------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"57d4b41f_2556349d","line":26,"in_reply_to":"9ab2b97f_31f50617","updated":"2023-05-05 00:44:37.000000000","message":"Unhold is not a step name though.... We likely need to iterate to fully detail the unhold out.  FWIW.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"In this example, we utilize the cleaning step ``erase_devices`` and then"},{"line_number":32,"context_line":"trigger hold of the node. In this specific case the node will enter"},{"line_number":33,"context_line":"a ``clean hold`` state.::"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"  {"},{"line_number":36,"context_line":"    \"target\":\"clean\","}],"source_content_type":"text/x-rst","patch_set":2,"id":"a4d656b2_a163d201","line":33,"updated":"2023-03-31 15:11:22.000000000","message":"nit: please\n\n .. code-block:: json\n \ninstead","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"In this example, we utilize the cleaning step ``erase_devices`` and then"},{"line_number":32,"context_line":"trigger hold of the node. In this specific case the node will enter"},{"line_number":33,"context_line":"a ``clean hold`` state.::"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"  {"},{"line_number":36,"context_line":"    \"target\":\"clean\","}],"source_content_type":"text/x-rst","patch_set":2,"id":"497767c5_c3f800d6","line":33,"in_reply_to":"a4d656b2_a163d201","updated":"2023-05-05 00:44:37.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":39,"context_line":"      \"step\": \"erase_devices\""},{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    {"},{"line_number":42,"context_line":"      \"interface\": deploy\","},{"line_number":43,"context_line":"      \"step\": \"hold\""},{"line_number":44,"context_line":"    }]"},{"line_number":45,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"05f5f014_db934c13","line":42,"updated":"2023-03-31 15:11:22.000000000","message":"I\u0027m debating this internally... \"Deploy\" interface does not make much sense here. Empty interface may confuse consumers (esp. in statically typed languages).","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":39,"context_line":"      \"step\": \"erase_devices\""},{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    {"},{"line_number":42,"context_line":"      \"interface\": deploy\","},{"line_number":43,"context_line":"      \"step\": \"hold\""},{"line_number":44,"context_line":"    }]"},{"line_number":45,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"234938d9_f7a7ad17","line":42,"in_reply_to":"05f5f014_db934c13","updated":"2023-04-07 17:33:22.000000000","message":"... I wonder if it would even take the request, worth a try at some point.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":true,"context_lines":[{"line_number":39,"context_line":"      \"step\": \"erase_devices\""},{"line_number":40,"context_line":"    },"},{"line_number":41,"context_line":"    {"},{"line_number":42,"context_line":"      \"interface\": deploy\","},{"line_number":43,"context_line":"      \"step\": \"hold\""},{"line_number":44,"context_line":"    }]"},{"line_number":45,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":2,"id":"03c3a2ae_af36bbc8","line":42,"in_reply_to":"234938d9_f7a7ad17","updated":"2023-05-05 00:44:37.000000000","message":"I was lookin at this because I modified the schema in what will be the patch before this, and interface and step are the two required arguments. So... unless we want to loosen that (which I\u0027m cool with!)...","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"doc/source/admin/steps.rst":[{"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":"e12ce562a8ad760c5c4ab6f9170ec987e71a0fa0","unresolved":true,"context_lines":[{"line_number":39,"context_line":"|           | operations will continue be recorded by Ironic, but will |"},{"line_number":40,"context_line":"|           | not be acted upon, preventing the node from timing out.  |"},{"line_number":41,"context_line":"|           |                                                          |"},{"line_number":42,"context_line":"|           | This step cannot be used against a child node in the     |"},{"line_number":43,"context_line":"|           | context of being requested when executing against a      |"},{"line_number":44,"context_line":"|           | parent node.                                             |"},{"line_number":45,"context_line":"+-----------+----------------------------------------------------------+"}],"source_content_type":"text/x-rst","patch_set":12,"id":"ad300aed_20ca363e","line":42,"updated":"2023-06-06 21:04:13.000000000","message":"This paragraph is super confusing. Might be worth adding a column to indicate \"Usable on child nodes?\" or similar.","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"},{"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":"e12ce562a8ad760c5c4ab6f9170ec987e71a0fa0","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"cf67ae05_5b900f7e","line":91,"updated":"2023-06-06 21:04:13.000000000","message":"It\u0027d be an interesting, but optional, addition to have a use case for when to use hold (e.g. \"Now our external automation sees the node in clean hold, does X, Y, Z, then unholds it\" or similar)","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7ed0ffd4b27a661af2ec06740e7ba1df956898f7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"57e2e01e_c2755a71","line":91,"in_reply_to":"cf67ae05_5b900f7e","updated":"2023-06-30 16:36:28.000000000","message":"I think that makes a lot of sense to note.","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"}],"doc/source/contributor/webapi-version-history.rst":[{"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":"e12ce562a8ad760c5c4ab6f9170ec987e71a0fa0","unresolved":true,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"This version adds a new provision state change verb called ``unhold``"},{"line_number":9,"context_line":"to be utilized with the new ``provision_state`` values ``clean hold``"},{"line_number":10,"context_line":"and ``deploy hold``. The verb instructs ironic to remove the node"},{"line_number":11,"context_line":"from it\u0027s present hold and to resume it\u0027s prior cleaning or"},{"line_number":12,"context_line":"deployment process."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"c59af0d7_49ca89b8","line":10,"updated":"2023-06-06 21:04:13.000000000","message":"nit: capitalize Ironic ... it\u0027s usually what we do but it\u0027s inconsistent in this file, so take this as advisory","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"7ed0ffd4b27a661af2ec06740e7ba1df956898f7","unresolved":false,"context_lines":[{"line_number":7,"context_line":""},{"line_number":8,"context_line":"This version adds a new provision state change verb called ``unhold``"},{"line_number":9,"context_line":"to be utilized with the new ``provision_state`` values ``clean hold``"},{"line_number":10,"context_line":"and ``deploy hold``. The verb instructs ironic to remove the node"},{"line_number":11,"context_line":"from it\u0027s present hold and to resume it\u0027s prior cleaning or"},{"line_number":12,"context_line":"deployment process."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7980b9e3_ae6b38db","line":10,"in_reply_to":"c59af0d7_49ca89b8","updated":"2023-06-30 16:36:28.000000000","message":"Done","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"}],"ironic/common/states.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"# A deployment may also wait on external callbacks"},{"line_number":404,"context_line":"machine.add_transition(DEPLOYING, DEPLOYWAIT, \u0027wait\u0027)"},{"line_number":405,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYHOLD, \u0027hold\u0027)"},{"line_number":406,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYING, \u0027resume\u0027)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"# A deployment waiting on callback may time out"}],"source_content_type":"text/x-python","patch_set":2,"id":"6a72eab5_2f3c337d","line":405,"updated":"2023-03-31 15:11:22.000000000","message":"Depends on the implementation, of course, but I would expect the initial state to be DEPLOYING since at that point we\u0027re doing work on the conductor.\n\nThe exit state should probably be DEPLOY WAIT, otherwise we won\u0027t start running new steps.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"# A deployment may also wait on external callbacks"},{"line_number":404,"context_line":"machine.add_transition(DEPLOYING, DEPLOYWAIT, \u0027wait\u0027)"},{"line_number":405,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYHOLD, \u0027hold\u0027)"},{"line_number":406,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYING, \u0027resume\u0027)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"# A deployment waiting on callback may time out"}],"source_content_type":"text/x-python","patch_set":2,"id":"e3804cd7_95e0c41a","line":405,"in_reply_to":"6a72eab5_2f3c337d","updated":"2023-04-07 17:33:22.000000000","message":"Ack, thanks.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":false,"context_lines":[{"line_number":402,"context_line":""},{"line_number":403,"context_line":"# A deployment may also wait on external callbacks"},{"line_number":404,"context_line":"machine.add_transition(DEPLOYING, DEPLOYWAIT, \u0027wait\u0027)"},{"line_number":405,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYHOLD, \u0027hold\u0027)"},{"line_number":406,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYING, \u0027resume\u0027)"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"# A deployment waiting on callback may time out"}],"source_content_type":"text/x-python","patch_set":2,"id":"ac572f2f_341941af","line":405,"in_reply_to":"e3804cd7_95e0c41a","updated":"2023-05-05 00:44:37.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":409,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYFAIL, \u0027fail\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"# Return the node into a deploying state from holding"},{"line_number":412,"context_line":"machine.add_transition(DEPLOYHOLD, DEPLOYWAIT, \u0027unhold\u0027)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"# A deployment may complete"},{"line_number":415,"context_line":"machine.add_transition(DEPLOYING, ACTIVE, \u0027done\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"cb598fe1_66f3d723","line":412,"updated":"2023-03-31 15:11:22.000000000","message":"Idea: also allow \"abort\"?","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":409,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYFAIL, \u0027fail\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"# Return the node into a deploying state from holding"},{"line_number":412,"context_line":"machine.add_transition(DEPLOYHOLD, DEPLOYWAIT, \u0027unhold\u0027)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"# A deployment may complete"},{"line_number":415,"context_line":"machine.add_transition(DEPLOYING, ACTIVE, \u0027done\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d44b26a6_a31ac943","line":412,"in_reply_to":"cb598fe1_66f3d723","updated":"2023-04-07 17:33:22.000000000","message":"I like the idea for clean, but abort is not something we can hit today on deploy, at least today.... and I went ahead and added it. 😂","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":false,"context_lines":[{"line_number":409,"context_line":"machine.add_transition(DEPLOYWAIT, DEPLOYFAIL, \u0027fail\u0027)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"# Return the node into a deploying state from holding"},{"line_number":412,"context_line":"machine.add_transition(DEPLOYHOLD, DEPLOYWAIT, \u0027unhold\u0027)"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"# A deployment may complete"},{"line_number":415,"context_line":"machine.add_transition(DEPLOYING, ACTIVE, \u0027done\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"62c63732_0cdb6edf","line":412,"in_reply_to":"d44b26a6_a31ac943","updated":"2023-05-05 00:44:37.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"ironic/conductor/cleaning.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":168,"context_line":"        interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":169,"context_line":"        LOG.info(\u0027Executing %(step)s on node %(node)s\u0027,"},{"line_number":170,"context_line":"                 {\u0027step\u0027: step, \u0027node\u0027: node.uuid})"},{"line_number":171,"context_line":"        if conductor_steps.reserved_step_name_handler(task, step):"},{"line_number":172,"context_line":"            return"},{"line_number":173,"context_line":"        try:"},{"line_number":174,"context_line":"            result \u003d interface.execute_clean_step(task, step)"}],"source_content_type":"text/x-python","patch_set":2,"id":"f3aeeba8_f10b99e3","line":171,"updated":"2023-03-31 15:11:22.000000000","message":"The node is in CLEANING at this stage (see \"wait\" below), you expect CLEAN WAIT.","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        interface \u003d getattr(task.driver, step.get(\u0027interface\u0027))"},{"line_number":169,"context_line":"        LOG.info(\u0027Executing %(step)s on node %(node)s\u0027,"},{"line_number":170,"context_line":"                 {\u0027step\u0027: step, \u0027node\u0027: node.uuid})"},{"line_number":171,"context_line":"        if conductor_steps.reserved_step_name_handler(task, step):"},{"line_number":172,"context_line":"            return"},{"line_number":173,"context_line":"        try:"},{"line_number":174,"context_line":"            result \u003d interface.execute_clean_step(task, step)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8a87d128_bea90ea2","line":171,"in_reply_to":"f3aeeba8_f10b99e3","updated":"2023-04-07 17:33:22.000000000","message":"Ack","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":215,"context_line":"                     \u0027executed asynchronously, waiting for driver.\u0027,"},{"line_number":216,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":217,"context_line":"            target_state \u003d states.MANAGEABLE if manual_clean else None"},{"line_number":218,"context_line":"            task.process_event(\u0027wait\u0027, target_state\u003dtarget_state)"},{"line_number":219,"context_line":"            return"},{"line_number":220,"context_line":"        elif result is not None:"},{"line_number":221,"context_line":"            msg \u003d (_(\u0027While executing step %(step)s on node \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"65e0e1b8_8e72f22f","line":218,"updated":"2023-03-31 15:11:22.000000000","message":"Here is where CLEAN WAIT happens","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                     \u0027executed asynchronously, waiting for driver.\u0027,"},{"line_number":216,"context_line":"                     {\u0027node\u0027: node.uuid, \u0027step\u0027: step})"},{"line_number":217,"context_line":"            target_state \u003d states.MANAGEABLE if manual_clean else None"},{"line_number":218,"context_line":"            task.process_event(\u0027wait\u0027, target_state\u003dtarget_state)"},{"line_number":219,"context_line":"            return"},{"line_number":220,"context_line":"        elif result is not None:"},{"line_number":221,"context_line":"            msg \u003d (_(\u0027While executing step %(step)s on node \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"8844824e_7fc5994c","line":218,"in_reply_to":"65e0e1b8_8e72f22f","updated":"2023-04-07 17:33:22.000000000","message":"Ack","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"ironic/conductor/steps.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":796,"context_line":"    :param task: A TaskManager object"},{"line_number":797,"context_line":"    :param step: The step being executed."},{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    step_name \u003d step.get(\u0027step\u0027, None)"},{"line_number":800,"context_line":"    if step_name \u003d\u003d \u0027hold\u0027:"},{"line_number":801,"context_line":"        task.process_event(\u0027hold\u0027)"},{"line_number":802,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"29714db2_0052c265","line":799,"updated":"2023-03-31 15:11:22.000000000","message":"nit: None redundant","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":796,"context_line":"    :param task: A TaskManager object"},{"line_number":797,"context_line":"    :param step: The step being executed."},{"line_number":798,"context_line":"    \"\"\""},{"line_number":799,"context_line":"    step_name \u003d step.get(\u0027step\u0027, None)"},{"line_number":800,"context_line":"    if step_name \u003d\u003d \u0027hold\u0027:"},{"line_number":801,"context_line":"        task.process_event(\u0027hold\u0027)"},{"line_number":802,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"4021dd66_4a8e37d7","line":799,"in_reply_to":"29714db2_0052c265","updated":"2023-04-07 17:33:22.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"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":"e12ce562a8ad760c5c4ab6f9170ec987e71a0fa0","unresolved":true,"context_lines":[{"line_number":826,"context_line":"    return False"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"def reserved_step_name_handler(task, step):"},{"line_number":830,"context_line":"    \"\"\"Identify if the requested step is in the reserved list, and handle."},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    :param task: A TaskManager object"}],"source_content_type":"text/x-python","patch_set":12,"id":"3a9fd848_c2216249","line":829,"updated":"2023-06-06 21:04:13.000000000","message":"I\u0027m really confused as to why this and also LN813 (use_reserved_step_handler) exists. Can we combine them, or make it more clear why there are two? I\u0027m just confused in general as to how this is structured this way...","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"2bc37fc43ab0227eb867873d2e0d00dad3fdb898","unresolved":true,"context_lines":[{"line_number":826,"context_line":"    return False"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":""},{"line_number":829,"context_line":"def reserved_step_name_handler(task, step):"},{"line_number":830,"context_line":"    \"\"\"Identify if the requested step is in the reserved list, and handle."},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    :param task: A TaskManager object"}],"source_content_type":"text/x-python","patch_set":12,"id":"c8e402c9_9a4c8e08","line":829,"in_reply_to":"3a9fd848_c2216249","updated":"2023-06-08 23:03:34.000000000","message":"So the first method is really a geared for just translating the \"reserved\" step names to mappings, where as this was is intended for further logic.\n\nWe might be able to combine them, but they are going to have different purposes... and the flow is going to get super weird because they get called at different times.","commit_id":"637d294cb15ebd19dea3a5b830bc839d67027d15"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"794a0c89b9e0438dab5ad29f02e8f2fee536d0b2","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    \u0027reboot\u0027: [utils.node_power_action, states.REBOOT],"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"# values to enable declariation of how to handle reserved step names"},{"line_number":84,"context_line":"USED_HANDLER \u003d \u0027used_handler\u0027"},{"line_number":85,"context_line":"EXIT_STEPS \u003d \u0027exit_steps\u0027"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"4ba6372e_41dd122d","line":83,"range":{"start_line":83,"start_character":19,"end_line":83,"end_character":31},"updated":"2023-07-07 02:59:54.000000000","message":"nit: declaration","commit_id":"c4e3100d5c99f276aba2d2ed3d55dd9e6650c276"}],"ironic/drivers/modules/agent_base.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":98,"context_line":"_FASTTRACK_HEARTBEAT_ALLOWED \u003d (states.DEPLOYWAIT, states.CLEANWAIT,"},{"line_number":99,"context_line":"                                states.RESCUEWAIT, states.ENROLL,"},{"line_number":100,"context_line":"                                states.MANAGEABLE, states.AVAILABLE,"},{"line_number":101,"context_line":"                                states.DEPLOYING)"},{"line_number":102,"context_line":"FASTTRACK_HEARTBEAT_ALLOWED \u003d frozenset(_FASTTRACK_HEARTBEAT_ALLOWED)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"dadc16ab_6acdf578","line":101,"updated":"2023-03-31 15:11:22.000000000","message":"Here as well?","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":98,"context_line":"_FASTTRACK_HEARTBEAT_ALLOWED \u003d (states.DEPLOYWAIT, states.CLEANWAIT,"},{"line_number":99,"context_line":"                                states.RESCUEWAIT, states.ENROLL,"},{"line_number":100,"context_line":"                                states.MANAGEABLE, states.AVAILABLE,"},{"line_number":101,"context_line":"                                states.DEPLOYING)"},{"line_number":102,"context_line":"FASTTRACK_HEARTBEAT_ALLOWED \u003d frozenset(_FASTTRACK_HEARTBEAT_ALLOWED)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"55c5c314_04a5ac16","line":101,"in_reply_to":"dadc16ab_6acdf578","updated":"2023-04-07 17:33:22.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"ironic/tests/unit/conductor/test_cleaning.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":1109,"context_line":"    def test_do_next_clean_step_handles_hold(self):"},{"line_number":1110,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1111,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":1112,"context_line":"            provision_state\u003dstates.CLEANWAIT,"},{"line_number":1113,"context_line":"            driver_internal_info\u003d{"},{"line_number":1114,"context_line":"                \u0027clean_steps\u0027: ["},{"line_number":1115,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":2,"id":"0e22c867_942442f1","line":1112,"updated":"2023-03-31 15:11:22.000000000","message":"This has to be CLEANING (see other tests)","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"    def test_do_next_clean_step_handles_hold(self):"},{"line_number":1110,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":1111,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":1112,"context_line":"            provision_state\u003dstates.CLEANWAIT,"},{"line_number":1113,"context_line":"            driver_internal_info\u003d{"},{"line_number":1114,"context_line":"                \u0027clean_steps\u0027: ["},{"line_number":1115,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e5cad64_b85ad5dc","line":1112,"in_reply_to":"0e22c867_942442f1","updated":"2023-04-07 17:33:22.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"ironic/tests/unit/conductor/test_deployments.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":969,"context_line":"    def test_do_next_deploy_step_handles_hold(self):"},{"line_number":970,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":971,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":972,"context_line":"            provision_state\u003dstates.DEPLOYWAIT,"},{"line_number":973,"context_line":"            driver_internal_info\u003d{"},{"line_number":974,"context_line":"                \u0027deploy_steps\u0027: ["},{"line_number":975,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f4517e1_cf1e7d53","line":972,"updated":"2023-03-31 15:11:22.000000000","message":"DEPLOYING","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":false,"context_lines":[{"line_number":969,"context_line":"    def test_do_next_deploy_step_handles_hold(self):"},{"line_number":970,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":971,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":972,"context_line":"            provision_state\u003dstates.DEPLOYWAIT,"},{"line_number":973,"context_line":"            driver_internal_info\u003d{"},{"line_number":974,"context_line":"                \u0027deploy_steps\u0027: ["},{"line_number":975,"context_line":"                    {"}],"source_content_type":"text/x-python","patch_set":2,"id":"3d24b680_45652dac","line":972,"in_reply_to":"3f4517e1_cf1e7d53","updated":"2023-04-07 17:33:22.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a718c5c3afcfc859d8b36dd22eacfa406981a91c","unresolved":true,"context_lines":[{"line_number":3065,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3066,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":3067,"context_line":"            provision_state\u003dstates.CLEANHOLD,"},{"line_number":3068,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":3069,"context_line":"            driver_internal_info\u003d{"},{"line_number":3070,"context_line":"                \u0027clean_steps\u0027: ["},{"line_number":3071,"context_line":"                    {\u0027step\u0027: \u0027hold\u0027, \u0027priority\u0027: 9, \u0027interface\u0027: \u0027power\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"7b749185_4a2ee9c7","line":3068,"updated":"2023-03-31 15:11:22.000000000","message":"Let\u0027s add another test for manual cleaning (I\"m not sure how easy it is to trigger hold during automated cleaning)","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"52933eefac364dabeb009a26828a2f747e9fce03","unresolved":false,"context_lines":[{"line_number":3065,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3066,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":3067,"context_line":"            provision_state\u003dstates.CLEANHOLD,"},{"line_number":3068,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":3069,"context_line":"            driver_internal_info\u003d{"},{"line_number":3070,"context_line":"                \u0027clean_steps\u0027: ["},{"line_number":3071,"context_line":"                    {\u0027step\u0027: \u0027hold\u0027, \u0027priority\u0027: 9, \u0027interface\u0027: \u0027power\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"86902150_7478a0cb","line":3068,"in_reply_to":"28df1f5d_d6df1aa3","updated":"2023-05-05 00:44:37.000000000","message":"Done","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"57ba600eac5d309c45aea1cdff70b6ad53d29d2b","unresolved":true,"context_lines":[{"line_number":3065,"context_line":"        node \u003d obj_utils.create_test_node("},{"line_number":3066,"context_line":"            self.context, driver\u003d\u0027fake-hardware\u0027,"},{"line_number":3067,"context_line":"            provision_state\u003dstates.CLEANHOLD,"},{"line_number":3068,"context_line":"            target_provision_state\u003dstates.AVAILABLE,"},{"line_number":3069,"context_line":"            driver_internal_info\u003d{"},{"line_number":3070,"context_line":"                \u0027clean_steps\u0027: ["},{"line_number":3071,"context_line":"                    {\u0027step\u0027: \u0027hold\u0027, \u0027priority\u0027: 9, \u0027interface\u0027: \u0027power\u0027},"}],"source_content_type":"text/x-python","patch_set":2,"id":"28df1f5d_d6df1aa3","line":3068,"in_reply_to":"7b749185_4a2ee9c7","updated":"2023-04-07 17:33:22.000000000","message":"Hmmmmmmmm.. target came from it, I think the difference in the states is just manageable. Definitely worthwhile.\n\nI think the way one would do it is via config overrides...","commit_id":"691e1939a3b1ee13425e23771cd22d628e500704"}]}
