)]}'
{".gitignore":[{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":15,"context_line":"# sample config files"},{"line_number":16,"context_line":"etc/ironic/ironic.conf.sample"},{"line_number":17,"context_line":"etc/ironic/policy.yaml.sample"},{"line_number":18,"context_line":"etc/ironic/ironic.conf.local"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Packages/installer info"},{"line_number":21,"context_line":"*.egg"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"f3526377_97746da1","line":18,"updated":"2024-07-03 23:16:22.000000000","message":"nit: Given we just removed the parts of the documentation that reference this, we should probably remove this.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# sample config files"},{"line_number":16,"context_line":"etc/ironic/ironic.conf.sample"},{"line_number":17,"context_line":"etc/ironic/policy.yaml.sample"},{"line_number":18,"context_line":"etc/ironic/ironic.conf.local"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"# Packages/installer info"},{"line_number":21,"context_line":"*.egg"}],"source_content_type":"application/octet-stream","patch_set":11,"id":"58c4198d_4eccef84","line":18,"in_reply_to":"f3526377_97746da1","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"/PATCHSET_LEVEL":[{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cb6ce374_7f1a00a5","updated":"2024-06-17 21:33:00.000000000","message":"Some high level thoughts.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"ea14c1d74f72c13c9c4adde0c6c12772182e9551","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"718f8f89_68a33aaa","updated":"2024-06-19 20:31:04.000000000","message":"While testing this locally during our pairing session, we noticed you were enforcing CUSTOM_* naming on runbooks; we should not enforce that IMO as it\u0027s a nova-based restriction and not all Ironic users use nova.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b3e671fa_b0f59e02","updated":"2024-07-03 20:16:50.000000000","message":"Not required, but a valuable thing for testing this, would be a commit to ironic-tempest-plugin that does CRUD for runbooks (API test, not scenario) https://opendev.org/openstack/ironic-tempest-plugin/src/branch/master/ironic_tempest_plugin/tests/api and then making this patch Depends-On that patch (just while we\u0027re building the feature)","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"36d7ba1be4c4acf7804ddad26f3cfcce931b8318","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"a8187b8a_80e81daa","updated":"2024-07-10 18:18:12.000000000","message":"Notes from devstack testing while pairing today:\n- runbook names are forbidden from having a hyphen; why?\n- empty args is accepted for manual cleaning, but not for a new runbook\n- node provision arg is currently \"runbooks\", needs to be \"runbook\" (I think? it wasn\u0027t clear in the spec)","commit_id":"af59e7f092dccdb4fca13e58c0d6c5d0bfeccf3f"},{"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":"e87401f69b3192555f4da1b8eaea978c08da5643","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"684cef63_e21e2cf4","in_reply_to":"a8187b8a_80e81daa","updated":"2024-07-10 18:39:46.000000000","message":"Actually, node provision arg is currently \"runbook_ident\", needs to be \"runbook\" (or potentially runbooks; but I think singular is the way to go).\n\n\nThere is no current way to run a runbook that isn\u0027t named CUSTOM_*. We need to either:\n- Restore the limitation that runbooks must be named CUSTOM_*\n- Remove the limitation (in this API version and newer) on node trait names\n- Remove node trait validity checking when run by someone with sufficient RBAC creds\n\n\nFix validation: currently you can\u0027t run a runbook through the API because of the \"order\" is not expected error:\n\n{\"error_message\": \"{\\\"faultcode\\\": \\\"Client\\\", \\\"faultstring\\\": \\\"Invalid clean_steps: Additional properties are not allowed (\u0027order\u0027 was unexpected)\\\\n\\\\nFailed validating \u0027additionalProperties\u0027 in schema[\u0027items\u0027]:\\\\n    {\u0027additionalProperties\u0027: False,\\\\n     \u0027properties\u0027: {\u0027args\u0027: {\u0027description\u0027: \u0027additional args\u0027,\\\\n                             \u0027properties\u0027: {},\\\\n                             \u0027type\u0027: \u0027object\u0027},\\\\n                    \u0027execute_on_child_nodes\u0027: {\u0027description\u0027: \u0027Boolean if \u0027\\\\n                                                              \u0027the step \u0027\\\\n                                                              \u0027should be \u0027\\\\n                                                              \u0027executed on \u0027\\\\n                                                              \u0027child \u0027\\\\n                                                              \u0027nodes.\u0027,\\\\n                                               \u0027type\u0027: \u0027boolean\u0027},\\\\n                    \u0027interface\u0027: {\u0027description\u0027: \u0027driver interface\u0027,\\\\n                                  \u0027enum\u0027: [\u0027vendor\u0027,\\\\n                                           \u0027power\u0027,\\\\n                                           \u0027management\u0027,\\\\n                                           \u0027firmware\u0027,\\\\n                                           \u0027deploy\u0027,\\\\n                                           \u0027bios\u0027,\\\\n                                           \u0027raid\u0027]},\\\\n                    \u0027limit_child_node_execution\u0027: {\u0027description\u0027: \u0027List of \u0027\\\\n                                                                  \u0027nodes \u0027\\\\n                                                                  \u0027upon \u0027\\\\n                                                                  \u0027which \u0027\\\\n                                                                  \u0027to \u0027\\\\n                                                                  \u0027execute \u0027\\\\n                                                                  \u0027child \u0027\\\\n                                                                  \u0027node \u0027\\\\n                                                                  \u0027steps \u0027\\\\n                                                                  \u0027on.\u0027,\\\\n                                                   \u0027type\u0027: \u0027array\u0027},\\\\n                    \u0027step\u0027: {\u0027description\u0027: \u0027name of clean step\u0027,\\\\n                             \u0027minLength\u0027: 1,\\\\n                             \u0027type\u0027: \u0027string\u0027}},\\\\n     \u0027required\u0027: [\u0027interface\u0027, \u0027step\u0027],\\\\n     \u0027type\u0027: \u0027object\u0027}\\\\n\\\\nOn instance[0]:\\\\n    {\u0027args\u0027: {}, \u0027interface\u0027: \u0027deploy\u0027, \u0027order\u0027: 1, \u0027step","commit_id":"af59e7f092dccdb4fca13e58c0d6c5d0bfeccf3f"},{"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":"ae4ee9b6a11b70f405063a5dfc0c52e793648a5b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"3d3d5012_f1f02688","updated":"2024-07-17 18:40:17.000000000","message":"2024-07-17 11:38:04.312 90779 WARNING ironic.api.controllers.v1.notification_utils [None req-1a3eabb6-9d03-4178-adb5-4af5f4971dac - - - - - -] Failed to send baremetal.runbook.create.start notification for runbook 1b3adf91-c146-4448-b67a-762ff71b8e2e with level info, notification method RunbookCRUDNotification, payload method RunbookCRUDPayload, error Object runbook doesn\u0027t have the field \"disable_ramdisk\" required for populating notification schema key \"disable_ramdisk\": ironic.common.exception.NotificationSchemaKeyError: Object runbook doesn\u0027t have the field \"disable_ramdisk\" required for populating notification schema key \"disable_ramdisk\"\n\nWhen creating  a runbook using the default value for disable_ramdisk","commit_id":"d35647e649036242b6267b031e2d0631af1f2b23"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"9eb2612186872282e023d57ff3f62798b9544eb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"72d4098f_e72a5c80","in_reply_to":"3d3d5012_f1f02688","updated":"2024-07-18 15:17:25.000000000","message":"For some reason, I couldn\u0027t replicate this warning.","commit_id":"d35647e649036242b6267b031e2d0631af1f2b23"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"f53173d275b1df3239acf1253fc6205a24486543","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"3265d979_5e0f5a37","in_reply_to":"72d4098f_e72a5c80","updated":"2024-07-18 15:19:26.000000000","message":"baremetal runbook create --name \u0027CUSTOM_AWESOME2\u0027 --steps \u0027[{\"interface\": \"raid\", \"step\": \"create_configuration\", \"order\": 1, \"args\": {}}]\u0027 --debug","commit_id":"d35647e649036242b6267b031e2d0631af1f2b23"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"e42cb6ea_c5ff939f","updated":"2024-08-01 09:36:06.000000000","message":"it looks ok at first glance, probably need another reading, just adding -1 for now to highlight my comments in the release note","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"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":"314e53c27e144b14f373ce8089190f7a5d8675e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"e5707ec4_930780e2","updated":"2024-08-07 16:43:04.000000000","message":"There is no mention of the changes to node set provision state in the API ref update. Please update that portion of the API ref to reflect we can use runbooks as well (including the API version) in a quick followup.\n\nThanks!","commit_id":"48f50248c25229522a98da80ac3aa0580b5b809c"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"273d27628c9850a392867bfb626175216a282c1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"9bc605fd_47b1c918","updated":"2024-08-06 13:22:04.000000000","message":"great job :)","commit_id":"48f50248c25229522a98da80ac3aa0580b5b809c"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"a825b8359e2cef9f40b00361773b5023be620cb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"d5849ad4_20777af4","in_reply_to":"e5707ec4_930780e2","updated":"2024-08-07 16:48:48.000000000","message":"ack","commit_id":"48f50248c25229522a98da80ac3aa0580b5b809c"}],"api-ref/source/baremetal-api-v1-runbooks.inc":[{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Runbooks (runbooks)"},{"line_number":5,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"The Runbook resource represents a collection of Runbook Steps that define a"},{"line_number":8,"context_line":"series of actions to be executed on a node. Runbooks enable users to perform"},{"line_number":9,"context_line":"complex operations in a predefined, automated manner. A runbook is"},{"line_number":10,"context_line":"matched for a node if at the time of deployment, the runbook\u0027s name matches"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"f8867d9c_2f638f67","line":7,"updated":"2024-06-17 21:33:00.000000000","message":"\"a collection of steps\"","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Runbooks (runbooks)"},{"line_number":5,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"The Runbook resource represents a collection of Runbook Steps that define a"},{"line_number":8,"context_line":"series of actions to be executed on a node. Runbooks enable users to perform"},{"line_number":9,"context_line":"complex operations in a predefined, automated manner. A runbook is"},{"line_number":10,"context_line":"matched for a node if at the time of deployment, the runbook\u0027s name matches"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"7d2a7bc9_b620eeb6","line":7,"in_reply_to":"f8867d9c_2f638f67","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":8,"context_line":"series of actions to be executed on a node. Runbooks enable users to perform"},{"line_number":9,"context_line":"complex operations in a predefined, automated manner. A runbook is"},{"line_number":10,"context_line":"matched for a node if at the time of deployment, the runbook\u0027s name matches"},{"line_number":11,"context_line":"a trait in the node\u0027s ``instance_info.traits``."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":".. versionadded:: 1.0"},{"line_number":14,"context_line":"    Runbook API was introduced."}],"source_content_type":"text/x-c++src","patch_set":1,"id":"f800502a_842c2d1b","line":11,"updated":"2024-06-17 21:33:00.000000000","message":"Node traits is a top level concept in our API for nodes: https://docs.openstack.org/api-ref/baremetal/#node-traits-nodes","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":10,"context_line":"matched for a node if at the time of deployment, the runbook\u0027s name matches"},{"line_number":11,"context_line":"a trait in the node\u0027s ``instance_info.traits``."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":".. versionadded:: 1.0"},{"line_number":14,"context_line":"    Runbook API was introduced."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Create Runbook"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"a7637b05_2b5f05f5","line":13,"updated":"2024-06-17 21:33:00.000000000","message":"(throughout) this should reflect the microversion number this will be (e.g. if microversion 72, 1.72)","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"matched for a node if at the time of deployment, the runbook\u0027s name matches"},{"line_number":11,"context_line":"a trait in the node\u0027s ``instance_info.traits``."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":".. versionadded:: 1.0"},{"line_number":14,"context_line":"    Runbook API was introduced."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Create Runbook"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"0a02fb93_47103801","line":13,"in_reply_to":"a7637b05_2b5f05f5","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":35,"context_line":"   - name: runbook_name"},{"line_number":36,"context_line":"   - steps: runbook_steps"},{"line_number":37,"context_line":"   - uuid: req_uuid"},{"line_number":38,"context_line":"   - extra: req_extra"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Request Step"},{"line_number":41,"context_line":"------------"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"6a8b34a7_7d30fe38","line":38,"updated":"2024-06-17 21:33:00.000000000","message":"throughout: needs a `disable_ramdisk` attribute, which prevents an in-band ramdisk from booting","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":35,"context_line":"   - name: runbook_name"},{"line_number":36,"context_line":"   - steps: runbook_steps"},{"line_number":37,"context_line":"   - uuid: req_uuid"},{"line_number":38,"context_line":"   - extra: req_extra"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Request Step"},{"line_number":41,"context_line":"------------"}],"source_content_type":"text/x-c++src","patch_set":1,"id":"30d3505e_fc84f433","line":38,"in_reply_to":"6a8b34a7_7d30fe38","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"}],"ironic/api/controllers/v1/node.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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1159,"context_line":"                 not allow the requested state transition or parameters."},{"line_number":1160,"context_line":"        \"\"\""},{"line_number":1161,"context_line":"        rpc_node \u003d api_utils.check_node_policy_and_retrieve("},{"line_number":1162,"context_line":"            \u0027baremetal:node:set_provision_state\u0027, node_ident)"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"        api_utils.check_allow_management_verbs(target)"},{"line_number":1165,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"8dbfc92c_42f713dc","line":1162,"updated":"2024-07-03 23:16:22.000000000","message":"In order to permit operators to allow running cleaning/servicing with a runbook without granting further access, I think we\u0027re going to need to branch the code here, and check a different policy if we are performing manual cleaning or servicing with a runbook (NOT WITH STEPS)\n\nhttps://opendev.org/openstack/ironic/src/branch/master/ironic/api/controllers/v1/node.py#L2916 may be a useful piece of code to look at","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":true,"context_lines":[{"line_number":1159,"context_line":"                 not allow the requested state transition or parameters."},{"line_number":1160,"context_line":"        \"\"\""},{"line_number":1161,"context_line":"        rpc_node \u003d api_utils.check_node_policy_and_retrieve("},{"line_number":1162,"context_line":"            \u0027baremetal:node:set_provision_state\u0027, node_ident)"},{"line_number":1163,"context_line":""},{"line_number":1164,"context_line":"        api_utils.check_allow_management_verbs(target)"},{"line_number":1165,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dd770848_aad8d92f","line":1162,"in_reply_to":"8dbfc92c_42f713dc","updated":"2024-07-08 14:31:15.000000000","message":"Whether acknowledged, is to be determined, same as below.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"        api_utils.check_allow_configdrive(target, configdrive)"},{"line_number":1190,"context_line":"        api_utils.check_allow_clean_disable_ramdisk(target, disable_ramdisk)"},{"line_number":1191,"context_line":""},{"line_number":1192,"context_line":"        if runbook_ident and not api_utils.allow_runbooks():"},{"line_number":1193,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        if runbook_ident:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5467fdb9_fd1e0efc","line":1192,"updated":"2024-07-03 23:16:22.000000000","message":"We need the ability to have two separate policy checks:\n-\u003e change_provision_state (current)\n-\u003e if only using a runbook, something that checks if someone is allowed to set clean/service provision state WITH A RUNBOOK","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"        api_utils.check_allow_configdrive(target, configdrive)"},{"line_number":1190,"context_line":"        api_utils.check_allow_clean_disable_ramdisk(target, disable_ramdisk)"},{"line_number":1191,"context_line":""},{"line_number":1192,"context_line":"        if runbook_ident and not api_utils.allow_runbooks():"},{"line_number":1193,"context_line":"            raise exception.NotAcceptable()"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        if runbook_ident:"}],"source_content_type":"text/x-python","patch_set":11,"id":"ea51beef_a372740a","line":1192,"in_reply_to":"5467fdb9_fd1e0efc","updated":"2024-07-08 14:31:15.000000000","message":"Whether acknowledged, is to be determined, same as above.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1199,"context_line":"            node_traits \u003d rpc_node.traits.get_trait_names() or []"},{"line_number":1200,"context_line":"            if rpc_runbook.name not in node_traits:"},{"line_number":1201,"context_line":"                msg \u003d (_(\u0027This runbook has not been approved for \u0027"},{"line_number":1202,"context_line":"                         \u0027use on this node %s\u0027) % rpc_node.uuid)"},{"line_number":1203,"context_line":"                raise exception.ClientSideError("},{"line_number":1204,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":1205,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"d0fe03ad_81f46b2d","line":1202,"updated":"2024-07-03 23:16:22.000000000","message":"Perhaps make this message more useful to an operator?\n\n\"This runbook has not been approved for use on this node %s. Please ask an administrator to add it to your node traits.\"","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":1199,"context_line":"            node_traits \u003d rpc_node.traits.get_trait_names() or []"},{"line_number":1200,"context_line":"            if rpc_runbook.name not in node_traits:"},{"line_number":1201,"context_line":"                msg \u003d (_(\u0027This runbook has not been approved for \u0027"},{"line_number":1202,"context_line":"                         \u0027use on this node %s\u0027) % rpc_node.uuid)"},{"line_number":1203,"context_line":"                raise exception.ClientSideError("},{"line_number":1204,"context_line":"                    msg, status_code\u003dhttp_client.BAD_REQUEST)"},{"line_number":1205,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"b0040d8b_33c15493","line":1202,"in_reply_to":"d0fe03ad_81f46b2d","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"            disable_ramdisk \u003d rpc_runbook.disable_ramdisk"},{"line_number":1207,"context_line":"            if target \u003d\u003d ir_states.VERBS[\u0027clean\u0027]:"},{"line_number":1208,"context_line":"                clean_steps \u003d rpc_runbook.steps"},{"line_number":1209,"context_line":"            elif target \u003d\u003d ir_states.VERBS[\u0027service\u0027]:"},{"line_number":1210,"context_line":"                service_steps \u003d rpc_runbook.steps"},{"line_number":1211,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"f1e6cefb_0fd5129a","line":1208,"updated":"2024-07-03 23:16:22.000000000","message":"I think you may have a bug here? \n\nI think clean_steps as passed into this method, are just JSON representations of clean steps presented directly from the API, whereas rpc_runbook.steps is likely going to be a RunbookSteps object.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":1205,"context_line":""},{"line_number":1206,"context_line":"            disable_ramdisk \u003d rpc_runbook.disable_ramdisk"},{"line_number":1207,"context_line":"            if target \u003d\u003d ir_states.VERBS[\u0027clean\u0027]:"},{"line_number":1208,"context_line":"                clean_steps \u003d rpc_runbook.steps"},{"line_number":1209,"context_line":"            elif target \u003d\u003d ir_states.VERBS[\u0027service\u0027]:"},{"line_number":1210,"context_line":"                service_steps \u003d rpc_runbook.steps"},{"line_number":1211,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"a09e07ec_ca8032e7","line":1208,"in_reply_to":"f1e6cefb_0fd5129a","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1209,"context_line":"            elif target \u003d\u003d ir_states.VERBS[\u0027service\u0027]:"},{"line_number":1210,"context_line":"                service_steps \u003d rpc_runbook.steps"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"        if clean_steps and target !\u003d ir_states.VERBS[\u0027clean\u0027]:"},{"line_number":1213,"context_line":"            msg \u003d (_(\u0027\"clean_steps\" is only valid when setting target \u0027"},{"line_number":1214,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027clean\u0027])"},{"line_number":1215,"context_line":"            if runbook_ident:"}],"source_content_type":"text/x-python","patch_set":11,"id":"4acff6e3_6d1e0ae2","line":1212,"updated":"2024-07-03 23:16:22.000000000","message":"What happens if I call this API with **both** clean_steps **and** a runbook? We likely should 400 Bad Request, as telling the user to send one or the other is better than us choosing one or the other.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":1209,"context_line":"            elif target \u003d\u003d ir_states.VERBS[\u0027service\u0027]:"},{"line_number":1210,"context_line":"                service_steps \u003d rpc_runbook.steps"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"        if clean_steps and target !\u003d ir_states.VERBS[\u0027clean\u0027]:"},{"line_number":1213,"context_line":"            msg \u003d (_(\u0027\"clean_steps\" is only valid when setting target \u0027"},{"line_number":1214,"context_line":"                     \u0027provision state to %s\u0027) % ir_states.VERBS[\u0027clean\u0027])"},{"line_number":1215,"context_line":"            if runbook_ident:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9ce72e1c_3a08e3f9","line":1212,"in_reply_to":"4acff6e3_6d1e0ae2","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"ironic/api/controllers/v1/runbook.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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from ironic.api.controllers.v1 import utils as api_utils"},{"line_number":29,"context_line":"from ironic.api import method"},{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":"from ironic.common import args"},{"line_number":32,"context_line":"from ironic.common import exception"},{"line_number":33,"context_line":"from ironic.common.i18n import _"},{"line_number":34,"context_line":"import ironic.conf"}],"source_content_type":"text/x-python","patch_set":1,"id":"343e7c3d_7468d110","line":31,"in_reply_to":"32a271fe_0407471c","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":28,"context_line":"from ironic.api.controllers.v1 import utils as api_utils"},{"line_number":29,"context_line":"from ironic.api import method"},{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":"from ironic.common import args"},{"line_number":32,"context_line":"from ironic.common import exception"},{"line_number":33,"context_line":"from ironic.common.i18n import _"},{"line_number":34,"context_line":"import ironic.conf"}],"source_content_type":"text/x-python","patch_set":1,"id":"32a271fe_0407471c","line":31,"in_reply_to":"6b119a94_2f1fe155","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: H306: imports not in alphabetical order (ironic.common.exception, ironic.common.args)\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from ironic.api import method"},{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":"from ironic.common import args"},{"line_number":32,"context_line":"from ironic.common import exception"},{"line_number":33,"context_line":"from ironic.common.i18n import _"},{"line_number":34,"context_line":"import ironic.conf"},{"line_number":35,"context_line":"from ironic import objects"}],"source_content_type":"text/x-python","patch_set":1,"id":"571483e0_340d0053","line":32,"in_reply_to":"635874db_350754e3","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":29,"context_line":"from ironic.api import method"},{"line_number":30,"context_line":"from ironic.common import exception"},{"line_number":31,"context_line":"from ironic.common import args"},{"line_number":32,"context_line":"from ironic.common import exception"},{"line_number":33,"context_line":"from ironic.common.i18n import _"},{"line_number":34,"context_line":"import ironic.conf"},{"line_number":35,"context_line":"from ironic import objects"}],"source_content_type":"text/x-python","patch_set":1,"id":"635874db_350754e3","line":32,"in_reply_to":"6e381157_6901ec5f","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: F811 redefinition of unused \u0027exception\u0027 from line 30\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":63,"context_line":"STEP_PATCH_ALLOWED_FIELDS \u003d [\u0027args\u0027, \u0027interface\u0027, \u0027order\u0027, \u0027step\u0027]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def duplicate_steps(name, value):"},{"line_number":67,"context_line":"    \"\"\"Argument validator to check runbook for duplicate steps\"\"\""},{"line_number":68,"context_line":"    # Check for duplicate steps. Each interface/step combination can be"},{"line_number":69,"context_line":"    # specified at most once."}],"source_content_type":"text/x-python","patch_set":1,"id":"6af75b38_7215e3dd","line":66,"updated":"2024-06-17 21:33:00.000000000","message":"Is this in a common place where we can DRY?","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":63,"context_line":"STEP_PATCH_ALLOWED_FIELDS \u003d [\u0027args\u0027, \u0027interface\u0027, \u0027order\u0027, \u0027step\u0027]"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def duplicate_steps(name, value):"},{"line_number":67,"context_line":"    \"\"\"Argument validator to check runbook for duplicate steps\"\"\""},{"line_number":68,"context_line":"    # Check for duplicate steps. Each interface/step combination can be"},{"line_number":69,"context_line":"    # specified at most once."}],"source_content_type":"text/x-python","patch_set":1,"id":"25a9be1a_3577bb27","line":66,"in_reply_to":"6af75b38_7215e3dd","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            \u0027order\u0027: step[\u0027order\u0027],"},{"line_number":97,"context_line":"        }"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def convert_with_links(rpc_runbook, fields\u003dNone, sanitize\u003dTrue):"},{"line_number":100,"context_line":"    \"\"\"Add links to the runbook.\"\"\""},{"line_number":101,"context_line":"    runbook \u003d api_utils.object_to_dict("},{"line_number":102,"context_line":"        rpc_runbook,"}],"source_content_type":"text/x-python","patch_set":1,"id":"2ba325e3_151c7816","line":99,"in_reply_to":"4f034bc2_749a9f57","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":96,"context_line":"            \u0027order\u0027: step[\u0027order\u0027],"},{"line_number":97,"context_line":"        }"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def convert_with_links(rpc_runbook, fields\u003dNone, sanitize\u003dTrue):"},{"line_number":100,"context_line":"    \"\"\"Add links to the runbook.\"\"\""},{"line_number":101,"context_line":"    runbook \u003d api_utils.object_to_dict("},{"line_number":102,"context_line":"        rpc_runbook,"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f034bc2_749a9f57","line":99,"in_reply_to":"9e10ac51_8820e7d6","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":273,"context_line":"        :param runbook_ident: UUID or logical name of a runbook."},{"line_number":274,"context_line":"        :param patch: a json PATCH document to apply to this runbook."},{"line_number":275,"context_line":"        \"\"\""},{"line_number":276,"context_line":"        api_utils.check_policy(\u0027baremetal:runbook:update\u0027)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        api_utils.patch_validate_allowed_fields(patch, PATCH_ALLOWED_FIELDS)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"469f9f51_4a908357","line":276,"updated":"2024-06-17 21:33:00.000000000","message":"I think we\u0027ll need more attention paid to policy checks here -- I\u0027m not sure this will behave like we want, specifically around setting owner and public.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        :param runbook_ident: UUID or logical name of a runbook."},{"line_number":274,"context_line":"        :param patch: a json PATCH document to apply to this runbook."},{"line_number":275,"context_line":"        \"\"\""},{"line_number":276,"context_line":"        api_utils.check_policy(\u0027baremetal:runbook:update\u0027)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        api_utils.patch_validate_allowed_fields(patch, PATCH_ALLOWED_FIELDS)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5e44c1ab_f168b280","line":276,"in_reply_to":"469f9f51_4a908357","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"}],"ironic/api/controllers/v1/utils.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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":164,"context_line":"        \u0027args\u0027: {\u0027type\u0027: \u0027object\u0027},"},{"line_number":165,"context_line":"        \u0027interface\u0027: {"},{"line_number":166,"context_line":"            \u0027type\u0027: \u0027string\u0027,"},{"line_number":167,"context_line":"            \u0027enum\u0027: list(conductor_steps.DEPLOYING_INTERFACE_PRIORITY)"},{"line_number":168,"context_line":"        },"},{"line_number":169,"context_line":"        \u0027step\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1},"},{"line_number":170,"context_line":"        \u0027order\u0027: {\u0027anyOf\u0027: ["}],"source_content_type":"text/x-python","patch_set":1,"id":"7ea6755b_fcd8e535","line":167,"updated":"2024-06-17 21:33:00.000000000","message":"nit: deploying?","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \u0027args\u0027: {\u0027type\u0027: \u0027object\u0027},"},{"line_number":165,"context_line":"        \u0027interface\u0027: {"},{"line_number":166,"context_line":"            \u0027type\u0027: \u0027string\u0027,"},{"line_number":167,"context_line":"            \u0027enum\u0027: list(conductor_steps.DEPLOYING_INTERFACE_PRIORITY)"},{"line_number":168,"context_line":"        },"},{"line_number":169,"context_line":"        \u0027step\u0027: {\u0027type\u0027: \u0027string\u0027, \u0027minLength\u0027: 1},"},{"line_number":170,"context_line":"        \u0027order\u0027: {\u0027anyOf\u0027: ["}],"source_content_type":"text/x-python","patch_set":1,"id":"cf7dd0d3_b8e16eff","line":167,"in_reply_to":"7ea6755b_fcd8e535","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":176,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":177,"context_line":"}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def local_link_normalize(name, value):"},{"line_number":180,"context_line":"    if not value:"},{"line_number":181,"context_line":"        return value"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e5893462_bb9111a4","line":179,"in_reply_to":"5141c84f_27997ec9","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    \u0027additionalProperties\u0027: False,"},{"line_number":177,"context_line":"}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"def local_link_normalize(name, value):"},{"line_number":180,"context_line":"    if not value:"},{"line_number":181,"context_line":"        return value"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a93291d4_7422e7c0","line":179,"in_reply_to":"e5893462_bb9111a4","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":714,"context_line":"    # If runbook_ident is instead a valid UUID, treat it as a UUID."},{"line_number":715,"context_line":"    if uuidutils.is_uuid_like(runbook_ident):"},{"line_number":716,"context_line":"        return objects.Runbook.get_by_uuid(api.request.context,"},{"line_number":717,"context_line":"                                                  runbook_ident)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    # Else, we can refer to runbooks by their name too"},{"line_number":720,"context_line":"    if utils.is_valid_logical_name(runbook_ident):"}],"source_content_type":"text/x-python","patch_set":1,"id":"f9ede2d7_c41c94aa","line":717,"in_reply_to":"02eea35e_a7e72736","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":714,"context_line":"    # If runbook_ident is instead a valid UUID, treat it as a UUID."},{"line_number":715,"context_line":"    if uuidutils.is_uuid_like(runbook_ident):"},{"line_number":716,"context_line":"        return objects.Runbook.get_by_uuid(api.request.context,"},{"line_number":717,"context_line":"                                                  runbook_ident)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"    # Else, we can refer to runbooks by their name too"},{"line_number":720,"context_line":"    if utils.is_valid_logical_name(runbook_ident):"}],"source_content_type":"text/x-python","patch_set":1,"id":"02eea35e_a7e72736","line":717,"in_reply_to":"f556cb92_a9863971","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":719,"context_line":"    # Else, we can refer to runbooks by their name too"},{"line_number":720,"context_line":"    if utils.is_valid_logical_name(runbook_ident):"},{"line_number":721,"context_line":"        return objects.Runbook.get_by_name(api.request.context,"},{"line_number":722,"context_line":"                                                  runbook_ident)"},{"line_number":723,"context_line":"    raise exception.InvalidUuidOrName(name\u003drunbook_ident)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"c9d9805a_c196dfc4","line":722,"in_reply_to":"77d34761_ed399572","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: E127 continuation line over-indented for visual indent\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":719,"context_line":"    # Else, we can refer to runbooks by their name too"},{"line_number":720,"context_line":"    if utils.is_valid_logical_name(runbook_ident):"},{"line_number":721,"context_line":"        return objects.Runbook.get_by_name(api.request.context,"},{"line_number":722,"context_line":"                                                  runbook_ident)"},{"line_number":723,"context_line":"    raise exception.InvalidUuidOrName(name\u003drunbook_ident)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"488e6b1c_3ce7d9c1","line":722,"in_reply_to":"c9d9805a_c196dfc4","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import copy"},{"line_number":17,"context_line":"from http import client as http_client"},{"line_number":18,"context_line":"import inspect"}],"source_content_type":"text/x-python","patch_set":11,"id":"a6fc69e2_034fa35f","side":"PARENT","line":15,"updated":"2024-07-03 23:16:22.000000000","message":"inadvertent whitespace change?","commit_id":"3820fc19c9e1d162f672cd8f8f296e974ba5489f"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import copy"},{"line_number":17,"context_line":"from http import client as http_client"},{"line_number":18,"context_line":"import inspect"}],"source_content_type":"text/x-python","patch_set":11,"id":"a70b1697_0cd322b9","side":"PARENT","line":15,"in_reply_to":"a6fc69e2_034fa35f","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"3820fc19c9e1d162f672cd8f8f296e974ba5489f"}],"ironic/api/controllers/v1/versions.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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":128,"context_line":"# v1.88: Add name field to port."},{"line_number":129,"context_line":"# v1.89: Add API for attaching/detaching virtual media"},{"line_number":130,"context_line":"# v1.90: Accept ovn vtep switch metadata schema to port.local_link_connection"},{"line_number":131,"context_line":"# v1.92: Add runbooks API"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":134,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"512a8410_0a54ed1f","line":131,"updated":"2024-06-17 21:33:00.000000000","message":"make sure to rebase this on your change to add the 1.91 comment","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":128,"context_line":"# v1.88: Add name field to port."},{"line_number":129,"context_line":"# v1.89: Add API for attaching/detaching virtual media"},{"line_number":130,"context_line":"# v1.90: Accept ovn vtep switch metadata schema to port.local_link_connection"},{"line_number":131,"context_line":"# v1.92: Add runbooks API"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"MINOR_0_JUNO \u003d 0"},{"line_number":134,"context_line":"MINOR_1_INITIAL_VERSION \u003d 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"6e3655d2_8f24dcf3","line":131,"in_reply_to":"512a8410_0a54ed1f","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"}],"ironic/common/policy.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":"5c0d96fd9b7ed59f99f8526d22819daa6698d49f","unresolved":true,"context_lines":[{"line_number":1945,"context_line":"    ),"},{"line_number":1946,"context_line":"]"},{"line_number":1947,"context_line":""},{"line_number":1948,"context_line":"def list_policies():"},{"line_number":1949,"context_line":"    policies \u003d itertools.chain("},{"line_number":1950,"context_line":"        default_policies,"},{"line_number":1951,"context_line":"        node_policies,"}],"source_content_type":"text/x-python","patch_set":1,"id":"cbce104c_c0be1ad0","line":1948,"in_reply_to":"4ce58bfd_d743f3d9","updated":"2024-06-17 21:33:00.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":false,"context_lines":[{"line_number":1945,"context_line":"    ),"},{"line_number":1946,"context_line":"]"},{"line_number":1947,"context_line":""},{"line_number":1948,"context_line":"def list_policies():"},{"line_number":1949,"context_line":"    policies \u003d itertools.chain("},{"line_number":1950,"context_line":"        default_policies,"},{"line_number":1951,"context_line":"        node_policies,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a7d61ef0_96f8af93","line":1948,"in_reply_to":"cbce104c_c0be1ad0","updated":"2024-07-03 23:16:22.000000000","message":"Done","commit_id":"21c942afd4a00874391b3cf7bafd063fad69ef92"},{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":1882,"context_line":""},{"line_number":1883,"context_line":"runbook_policies \u003d ["},{"line_number":1884,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":1885,"context_line":"        name\u003d\u0027baremetal:runbook:get\u0027,"},{"line_number":1886,"context_line":"        check_str\u003dSYSTEM_OR_OWNER_READER,"},{"line_number":1887,"context_line":"        scope_types\u003d[\u0027system\u0027, \u0027project\u0027],"},{"line_number":1888,"context_line":"        description\u003d\u0027Retrieve Runbook records\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"6fcd3024_c8362de2","line":1885,"updated":"2024-07-03 23:16:22.000000000","message":"As noted earlier today, please reference the spec for the final desired default access settings. Also ensure we have a separate policy toggle to allow operators to enable the ability to run manual cleaning/servicing with runbooks, but disallow it with arbitrary steps.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":true,"context_lines":[{"line_number":1882,"context_line":""},{"line_number":1883,"context_line":"runbook_policies \u003d ["},{"line_number":1884,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":1885,"context_line":"        name\u003d\u0027baremetal:runbook:get\u0027,"},{"line_number":1886,"context_line":"        check_str\u003dSYSTEM_OR_OWNER_READER,"},{"line_number":1887,"context_line":"        scope_types\u003d[\u0027system\u0027, \u0027project\u0027],"},{"line_number":1888,"context_line":"        description\u003d\u0027Retrieve Runbook records\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8e9edf5c_d2a133f1","line":1885,"in_reply_to":"6fcd3024_c8362de2","updated":"2024-07-08 14:31:15.000000000","message":"This was not very clear to me.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"ironic/tests/unit/api/base.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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":166,"context_line":"                              with the request"},{"line_number":167,"context_line":"        :param status: expected status code of response"},{"line_number":168,"context_line":"        \"\"\""},{"line_number":169,"context_line":"        response \u003d self._request_json(path\u003dpath, params\u003dparams,"},{"line_number":170,"context_line":"                                      expect_errors\u003dexpect_errors,"},{"line_number":171,"context_line":"                                      headers\u003dheaders,"},{"line_number":172,"context_line":"                                      extra_environ\u003dextra_environ,"}],"source_content_type":"text/x-python","patch_set":11,"id":"4a147be0_503e253b","line":169,"updated":"2024-07-03 23:16:22.000000000","message":"Wondering why this code was restructured?","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":true,"context_lines":[{"line_number":166,"context_line":"                              with the request"},{"line_number":167,"context_line":"        :param status: expected status code of response"},{"line_number":168,"context_line":"        \"\"\""},{"line_number":169,"context_line":"        response \u003d self._request_json(path\u003dpath, params\u003dparams,"},{"line_number":170,"context_line":"                                      expect_errors\u003dexpect_errors,"},{"line_number":171,"context_line":"                                      headers\u003dheaders,"},{"line_number":172,"context_line":"                                      extra_environ\u003dextra_environ,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ae1eace1_35a45a96","line":169,"in_reply_to":"4a147be0_503e253b","updated":"2024-07-08 14:31:15.000000000","message":"I probably altered it in between patch sets, because there\u0027s no difference in the current state. I will make sure to return!","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"ironic/tests/unit/api/test_rbac_project_scoped.yaml":[{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":3981,"context_line":""},{"line_number":3982,"context_line":"# Runbooks - https://docs.openstack.org/api-ref/baremetal/#runbooks-templates"},{"line_number":3983,"context_line":""},{"line_number":3984,"context_line":"owner_reader_cannot_get_runbooks:"},{"line_number":3985,"context_line":"  path: \u0027/v1/runbooks\u0027"},{"line_number":3986,"context_line":"  method: get"},{"line_number":3987,"context_line":"  headers: *owner_reader_headers"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"f1441624_c4552c52","line":3984,"updated":"2024-07-03 20:16:50.000000000","message":"owner/lessee is a node concept that we don\u0027t need to think about here.\n\nMaybe replace owner with \"project\" throughout in the names, still using *owner\\_[]\\_headers, but not having separate tests for lessee. Just make sure any test fixtures for runbooks have project set, when appropriate, to the project used in owner\\_[]\\_headers","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":3985,"context_line":"  path: \u0027/v1/runbooks\u0027"},{"line_number":3986,"context_line":"  method: get"},{"line_number":3987,"context_line":"  headers: *owner_reader_headers"},{"line_number":3988,"context_line":"  assert_status: 403"},{"line_number":3989,"context_line":""},{"line_number":3990,"context_line":"owner_reader_cannot_patch_runbook:"},{"line_number":3991,"context_line":"  path: \u0027/v1/runbooks/{runbook_ident}\u0027"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7e1b6db4_1a5fde4d","line":3988,"updated":"2024-07-03 20:16:50.000000000","message":"A project scoped owner, when querying /v1/runbooks, should get a list of runbooks where their project \u003d\u003d runbook.project OR where runbook.public \u003d TRUE (similar to nodes -- project scoped owner, when listing at /v1/nodes, will see nodes owned/leased by that project and none other)","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":3995,"context_line":"      path: /name"},{"line_number":3996,"context_line":"      value: \u0027new_owner\u0027"},{"line_number":3997,"context_line":"  headers: *owner_reader_headers"},{"line_number":3998,"context_line":"  assert_status: 403"},{"line_number":3999,"context_line":""},{"line_number":4000,"context_line":"owner_reader_cannot_patch_runbook_owner:"},{"line_number":4001,"context_line":"  path: \u0027/v1/runbooks/{runbook_ident}\u0027"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"795790ae_95161926","line":3998,"updated":"2024-07-03 20:16:50.000000000","message":"++ readers should not be able to patch","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"ironic/tests/unit/api/test_rbac_system_scoped.yaml":[{"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":"4046fcd593022650755e1fa4516ac6bc3aa57772","unresolved":true,"context_lines":[{"line_number":2585,"context_line":"  headers: *reader_headers"},{"line_number":2586,"context_line":"  assert_status: 200"},{"line_number":2587,"context_line":""},{"line_number":2588,"context_line":"# Runbooks - https://docs.openstack.org/api-ref/baremetal/#runbooks-templates"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"runbooks_post_admin:"},{"line_number":2591,"context_line":"  path: \u0027/v1/runbooks\u0027"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"1c414f87_983a36c8","line":2588,"updated":"2024-07-03 20:17:57.000000000","message":"we need equivalent tests for node-set-provision-state to CLEAN/SERVICE, deliniating who is allowed to call with a template vs who is allowed to call with steps","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":2585,"context_line":"  headers: *reader_headers"},{"line_number":2586,"context_line":"  assert_status: 200"},{"line_number":2587,"context_line":""},{"line_number":2588,"context_line":"# Runbooks - https://docs.openstack.org/api-ref/baremetal/#runbooks-templates"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"runbooks_post_admin:"},{"line_number":2591,"context_line":"  path: \u0027/v1/runbooks\u0027"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"e9a8a93b_9d34e59b","line":2588,"in_reply_to":"1c414f87_983a36c8","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":2596,"context_line":"      - interface: \u0027raid\u0027"},{"line_number":2597,"context_line":"        step: \u0027noop\u0027"},{"line_number":2598,"context_line":"        args: {}"},{"line_number":2599,"context_line":"        order: 0"},{"line_number":2600,"context_line":"  headers: *admin_headers"},{"line_number":2601,"context_line":"  assert_status: 201"},{"line_number":2602,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5d24ceaf_418eb66f","line":2599,"updated":"2024-07-03 20:16:50.000000000","message":"We need to make sure we have at least one test validating that:\n- unset project and set public\u003dtrue on a runbook that already has a project\n--\u003e system-scoped member/manager/admin can do this; project-scoped cannot\n- create a runbook without a project set\n--\u003e system-scoped can do this; project scoped cannot\n- create a runbook with public set to true\n--\u003e system-scoped can do this; project scoped cannot\n- create a runbook with a project set\n--\u003e system AND project scoped can do this","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":2605,"context_line":"  method: post"},{"line_number":2606,"context_line":"  body: *runbook_body"},{"line_number":2607,"context_line":"  headers: *scoped_member_headers"},{"line_number":2608,"context_line":"  assert_status: 403"},{"line_number":2609,"context_line":""},{"line_number":2610,"context_line":"runbooks_post_reader:"},{"line_number":2611,"context_line":"  path: \u0027/v1/runbooks\u0027"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"73e6ad9c_b86e2996","line":2608,"updated":"2024-07-03 20:16:50.000000000","message":"https://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/runbooks.html#rbac-impact\n\nWe documented that system-scoped admins/managers/members should basically have the same set of capabilities. This is currently asserting that members can\u0027t create runbooks, which doesn\u0027t follow the spec.","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"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":"524663d77b6cdc3be6c809c752068d5e98edaf03","unresolved":true,"context_lines":[{"line_number":2684,"context_line":"  headers: *admin_headers"},{"line_number":2685,"context_line":"  assert_status: 200"},{"line_number":2686,"context_line":""},{"line_number":2687,"context_line":"runbooks_runbook_id_patch_public_member:"},{"line_number":2688,"context_line":"  path: \u0027/v1/runbooks/{runbook_ident}\u0027"},{"line_number":2689,"context_line":"  method: patch"},{"line_number":2690,"context_line":"  body: *runbook_public_patch"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"afc685e1_7beba3f0","line":2687,"updated":"2024-07-03 20:16:50.000000000","message":"Make sure we have the proper amount of sets of these -- for project-scoped templates, for public templates, and for both (we should ensure it fails)","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"}],"ironic/tests/unit/db/utils.py":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"6dff343aa5ed2ab5bc32c1d56b7b532b878a5bbd","unresolved":true,"context_lines":[{"line_number":727,"context_line":"    return dbapi.create_runbook(runbook)"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"def get_test_ibmc_info():"},{"line_number":731,"context_line":"    return {"},{"line_number":732,"context_line":"        \"ibmc_address\": \"https://example.com\","},{"line_number":733,"context_line":"        \"ibmc_username\": \"username\","}],"source_content_type":"text/x-python","patch_set":21,"id":"5c9e5dbd_d2174236","line":730,"updated":"2024-08-01 14:21:32.000000000","message":"not sure why you have this here, ibmc drivers have been removed and I don\u0027t see where this function is used in your patch","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"}],"releasenotes/notes/add-runbooks-38c3efa97ace8c67.yaml":[{"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":"b51a494bae0818e1fd8a927fcc112f4d3296832d","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new API concept, runbooks, to enable users create, manage,"},{"line_number":5,"context_line":"    and execute a series of deployment steps, enhancing automation and"},{"line_number":6,"context_line":"    self-service capabilities."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5cd25db6_7d342d60","line":6,"updated":"2024-07-03 23:16:22.000000000","message":"We should have more detail here. This is going to be one of the most major features landed this cycle. releasenotes/notes/require-hashed-rescue-password-6f7c0424e12c1aeb.yaml might be a decent example?","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"1a73cc29bc36b2f663e5d5a3f1f8ec452a7d87e2","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds a new API concept, runbooks, to enable users create, manage,"},{"line_number":5,"context_line":"    and execute a series of deployment steps, enhancing automation and"},{"line_number":6,"context_line":"    self-service capabilities."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"8719a426_7f8412c0","line":6,"in_reply_to":"5cd25db6_7d342d60","updated":"2024-07-08 14:31:15.000000000","message":"Acknowledged","commit_id":"cc809a7e67b69e3fa6d3ed6230fc9074bd77f7eb"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Introducing a new API concept, runbooks, to enable users create, manage,"},{"line_number":5,"context_line":"    and execute a series of curated steps, enanbling self-service of"},{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":21,"id":"aaceedf3_44d33326","line":4,"range":{"start_line":4,"start_character":55,"end_line":4,"end_character":60},"updated":"2024-08-01 09:36:06.000000000","message":"\"users to\"","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Introducing a new API concept, runbooks, to enable users create, manage,"},{"line_number":5,"context_line":"    and execute a series of curated steps, enanbling self-service of"},{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":21,"id":"84ba7e05_d072dab3","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":15},"updated":"2024-08-01 09:36:06.000000000","message":"let\u0027s use present simple for the release note, for example start with \"Introduces\" or \"Adds\"","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Introducing a new API concept, runbooks, to enable users create, manage,"},{"line_number":5,"context_line":"    and execute a series of curated steps, enanbling self-service of"},{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Runbooks are curated lists of steps that can be associated with and run on"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"acebbeca_954a5cbc","line":5,"range":{"start_line":5,"start_character":43,"end_line":5,"end_character":52},"updated":"2024-08-01 09:36:06.000000000","message":"nit: enabling","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":5,"context_line":"    and execute a series of curated steps, enanbling self-service of"},{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Runbooks are curated lists of steps that can be associated with and run on"},{"line_number":9,"context_line":"    only nodes associated via traits and used in lieu of explicit list of steps"},{"line_number":10,"context_line":"    for manual cleaning or servicing."},{"line_number":11,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"6c29d9b4_7aa038cc","line":8,"range":{"start_line":8,"start_character":3,"end_line":8,"end_character":40},"updated":"2024-08-01 09:36:06.000000000","message":"this is repeated, I would probably leave it here though and remove it from above","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Runbooks are curated lists of steps that can be associated with and run on"},{"line_number":9,"context_line":"    only nodes associated via traits and used in lieu of explicit list of steps"},{"line_number":10,"context_line":"    for manual cleaning or servicing."},{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    Adds a new top-level REST API endpoint `/v1/runbooks/` with basic CRUD"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"5410f28f_228d2c51","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":25},"updated":"2024-08-01 09:36:06.000000000","message":"\"nodes only\"\nremove associated duplicate","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"},{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"72a42621dcdc7368f67354b18c49a3afd5578778","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    maintenance items on nodes by project members."},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    Runbooks are curated lists of steps that can be associated with and run on"},{"line_number":9,"context_line":"    only nodes associated via traits and used in lieu of explicit list of steps"},{"line_number":10,"context_line":"    for manual cleaning or servicing."},{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    Adds a new top-level REST API endpoint `/v1/runbooks/` with basic CRUD"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"9730e97c_d72e6e8f","line":9,"range":{"start_line":9,"start_character":54,"end_line":9,"end_character":65},"updated":"2024-08-01 09:36:06.000000000","message":"\"of an explicit\"","commit_id":"e6b278d81d9b6ce41293aa11f363a480cbd06023"}]}
