)]}'
{"/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":"5e5b0f587d92f8f4d5f51d38827f829a778b60a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"113c0710_6734e91b","updated":"2025-09-29 19:17:58.000000000","message":"First feedback before starting review. Nearly 13k lines. That is... a bit much. Is there any way to chunk this apart?","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"e282fb9da78c65501c29972586b4ab7441311a79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"afa227ec_14695c7b","updated":"2025-09-29 20:27:47.000000000","message":"So far, and I\u0027m only about 30% in, but marking -1 due to requirements issue.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e9ce5801_18da2ff3","updated":"2025-10-06 12:20:05.000000000","message":"Another round to address some comments... most notably, I removed the dynamic file update handling and I moved the schema validation to the module loading phase.","commit_id":"d0ac6762c6bae68991f2a64494d9e38fd244fe8d"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"a20affca5556989784e5dc7c5272f79d2958c348","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5a85159a_e720a198","updated":"2025-10-06 12:23:41.000000000","message":"Also, changed introduced the \"idle\" network handling so that we can avoid the cleanup/delete handling that I had put in previously.","commit_id":"d112715837224061415ac52d09a2d255c2996e0f"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"5e3868e0c8b767a8e59b3362672ab644896a35ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"50599ffe_0b79d83c","updated":"2025-10-14 12:50:02.000000000","message":"recheck","commit_id":"29ed388e738868ec01726bb0d7ff127024ab294e"},{"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":"ec75b0160fcbcdb49103297903069030a3b9209e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0a7a6805_cb628d55","updated":"2025-11-03 21:02:05.000000000","message":"\u003e -1 +10665 \n\nAlso noting: this is really too large to effectively review at a low level. Have we considered breaking it into logical chunks?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"4b1b40400a57228a2e8c19ef8af14e4de3fa3b60","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d4c71313_8a51200b","updated":"2025-11-03 21:06:42.000000000","message":"Is there any way to break up this change into smaller chunks? This feels like it\u0027ll take several hours or even days of reading in order to fully understand this change.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ea718b4d_c5f3236d","updated":"2025-11-03 19:53:58.000000000","message":"Three most important important things:\n- make sure this works in single process\n- more clear naming: I am -2 to using \"experimental\" in any operator-facing permanent string, such as an entrypoint. Ideally we pick a name for this now (MERCURY!) and use that to avoid adding decoder rings for folks using neutron-based networking.\n- More clarity around the switch configs: are we asking users for a JSON config? If so, either you or clif need to change formats. It\u0027s not awesome if we have one side of our stack wanting an external yaml file and another wanting json.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"8ebc6b3f3b68f472391002897f87731e3331ee90","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"890b1ede_489c56ec","updated":"2025-10-31 12:02:23.000000000","message":"recheck","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"20801545_826a9d99","in_reply_to":"0a7a6805_cb628d55","updated":"2025-11-07 19:44:41.000000000","message":"split into multiple commits","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"etc/ironic/README-ironic-networking.conf.txt":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"99ec046ec18619a012de36a7ae4b8ea23f7e5ba6","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Ironic Networking Service Configuration"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"This directory contains configuration files for the Ironic Networking Service."},{"line_number":4,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"8f287e16_019e472a","line":1,"range":{"start_line":1,"start_character":28,"end_line":1,"end_character":41},"updated":"2025-09-29 20:27:12.000000000","message":"Lets not create samples. We have a framework for this.\n\nhttps://github.com/openstack/ironic/blob/master/tox.ini#L66-L69\n\nIf anything, this is more documentation, not etc/ironic example configurations.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc27d3ba1be417b68f66af29dcaeb8ef8093301e","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Ironic Networking Service Configuration"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"This directory contains configuration files for the Ironic Networking Service."},{"line_number":4,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"ec5c8442_8e174edb","line":1,"range":{"start_line":1,"start_character":28,"end_line":1,"end_character":41},"in_reply_to":"8f287e16_019e472a","updated":"2025-09-30 12:21:28.000000000","message":"ok, will remove","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"682e7607159dd8c41b2c43457a3560da21f9fbbe","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Ironic Networking Service Configuration"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"This directory contains configuration files for the Ironic Networking Service."},{"line_number":4,"context_line":""}],"source_content_type":"text/plain","patch_set":1,"id":"599f0f80_2c270553","line":1,"range":{"start_line":1,"start_character":28,"end_line":1,"end_character":41},"in_reply_to":"ec5c8442_8e174edb","updated":"2025-09-30 13:34:52.000000000","message":"done","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"}],"ironic/command/networking.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"99ec046ec18619a012de36a7ae4b8ea23f7e5ba6","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    issue_startup_warnings(CONF)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Set override signals."},{"line_number":61,"context_line":"    command_utils.handle_signal()"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a36c24bb_fc9cce97","line":59,"updated":"2025-09-29 20:27:12.000000000","message":"Overall, you may want to wire this in for the single process launcher as well.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    issue_startup_warnings(CONF)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Set override signals."},{"line_number":61,"context_line":"    command_utils.handle_signal()"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e5613e03_29a1a683","line":59,"in_reply_to":"66568057_b6cc496f","updated":"2025-11-03 19:53:58.000000000","message":"I\u0027m not sure it\u0027s OK to wait until after this change is merged to ensure the approach is able to integrate with single-process.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc27d3ba1be417b68f66af29dcaeb8ef8093301e","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    issue_startup_warnings(CONF)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Set override signals."},{"line_number":61,"context_line":"    command_utils.handle_signal()"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"66568057_b6cc496f","line":59,"in_reply_to":"a36c24bb_fc9cce97","updated":"2025-09-30 12:21:28.000000000","message":"Ok, I\u0027ll make a note to circle back and do that.  It will require some retesting so I\u0027ll leave it to the end and do it in a separate change if necessary.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    issue_startup_warnings(CONF)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    launcher \u003d service.launch(CONF, mgr, restart_method\u003d\u0027mutate\u0027)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Set override signals."},{"line_number":61,"context_line":"    command_utils.handle_signal()"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"f5f20de4_150015e2","line":59,"in_reply_to":"e5613e03_29a1a683","updated":"2025-11-07 19:44:41.000000000","message":"deferred","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"}],"ironic/conf/__init__.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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":85,"context_line":"irmc.register_opts(CONF)"},{"line_number":86,"context_line":"json_rpc.register_opts(CONF)"},{"line_number":87,"context_line":"# Register a separate json_rpc group for networking-specific client settings"},{"line_number":88,"context_line":"json_rpc.register_opts(CONF, group\u003d\u0027networking_json_rpc\u0027)"},{"line_number":89,"context_line":"mdns.register_opts(CONF)"},{"line_number":90,"context_line":"metrics.register_opts(CONF)"},{"line_number":91,"context_line":"molds.register_opts(CONF)"}],"source_content_type":"text/x-python","patch_set":6,"id":"c963ba82_a730a4c4","line":88,"updated":"2025-11-03 19:53:58.000000000","message":"nit: Not your problem, per-se, but if you wanted to add a comment above the existing, group\u003dNone version of this, describing what that is for (And how it\u0027s different), it\u0027d be awesome.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":85,"context_line":"irmc.register_opts(CONF)"},{"line_number":86,"context_line":"json_rpc.register_opts(CONF)"},{"line_number":87,"context_line":"# Register a separate json_rpc group for networking-specific client settings"},{"line_number":88,"context_line":"json_rpc.register_opts(CONF, group\u003d\u0027networking_json_rpc\u0027)"},{"line_number":89,"context_line":"mdns.register_opts(CONF)"},{"line_number":90,"context_line":"metrics.register_opts(CONF)"},{"line_number":91,"context_line":"molds.register_opts(CONF)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4251c96d_ae0215db","line":88,"in_reply_to":"c963ba82_a730a4c4","updated":"2025-11-07 19:44:41.000000000","message":"removed","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/conf/json_rpc.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from ironic.common.i18n import _"},{"line_number":17,"context_line":"from ironic.common import keystone"},{"line_number":18,"context_line":"from ironic.conf.api import Octal"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"f97f3930_bd2941bb","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":33},"updated":"2025-09-30 18:10:43.000000000","message":"unrelated?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from ironic.common.i18n import _"},{"line_number":17,"context_line":"from ironic.common import keystone"},{"line_number":18,"context_line":"from ironic.conf.api import Octal"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"0ebca583_df8d5b5b","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"c0151dde_50356d8c","updated":"2025-10-06 12:20:05.000000000","message":"Removed.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from ironic.common.i18n import _"},{"line_number":17,"context_line":"from ironic.common import keystone"},{"line_number":18,"context_line":"from ironic.conf.api import Octal"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0151dde_50356d8c","line":21,"range":{"start_line":19,"start_character":0,"end_line":21,"end_character":33},"in_reply_to":"f97f3930_bd2941bb","updated":"2025-09-30 19:04:03.000000000","message":"ya, likely debug code that didn\u0027t remove cleanly.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/conf/networking.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"4b1b40400a57228a2e8c19ef8af14e4de3fa3b60","unresolved":true,"context_lines":[{"line_number":24,"context_line":"                      \u0027This can be set to \"json-rpc\" for JSON-RPC, \u0027"},{"line_number":25,"context_line":"                      \u0027\"oslo_messaging\" for Oslo Messaging, or \"none\" \u0027"},{"line_number":26,"context_line":"                      \u0027for no transport.\u0027)),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027switch_config_file\u0027,"},{"line_number":28,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Path to the switch configuration file to monitor for \u0027"},{"line_number":30,"context_line":"                      \u0027changes. When this file is modified, the networking \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"77030bcc_c60472a8","line":27,"updated":"2025-11-03 21:06:42.000000000","message":"Is the format of this documented somewhere?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":24,"context_line":"                      \u0027This can be set to \"json-rpc\" for JSON-RPC, \u0027"},{"line_number":25,"context_line":"                      \u0027\"oslo_messaging\" for Oslo Messaging, or \"none\" \u0027"},{"line_number":26,"context_line":"                      \u0027for no transport.\u0027)),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027switch_config_file\u0027,"},{"line_number":28,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Path to the switch configuration file to monitor for \u0027"},{"line_number":30,"context_line":"                      \u0027changes. When this file is modified, the networking \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"19bf1880_2ae0f08b","line":27,"in_reply_to":"77030bcc_c60472a8","updated":"2025-11-07 19:44:41.000000000","message":"doc added","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":25,"context_line":"                      \u0027\"oslo_messaging\" for Oslo Messaging, or \"none\" \u0027"},{"line_number":26,"context_line":"                      \u0027for no transport.\u0027)),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027switch_config_file\u0027,"},{"line_number":28,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Path to the switch configuration file to monitor for \u0027"},{"line_number":30,"context_line":"                      \u0027changes. When this file is modified, the networking \u0027"},{"line_number":31,"context_line":"                      \u0027service will automatically reload switch \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"7f88611e_24ee910a","line":28,"updated":"2025-11-03 19:53:58.000000000","message":"it looks like we expect this to be JSON? We should explicitly say that.\n\nAlso... we should either make TBN use JSON, or have this use YAML.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                      \u0027\"oslo_messaging\" for Oslo Messaging, or \"none\" \u0027"},{"line_number":26,"context_line":"                      \u0027for no transport.\u0027)),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027switch_config_file\u0027,"},{"line_number":28,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Path to the switch configuration file to monitor for \u0027"},{"line_number":30,"context_line":"                      \u0027changes. When this file is modified, the networking \u0027"},{"line_number":31,"context_line":"                      \u0027service will automatically reload switch \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"c5a928e9_5535b9e4","line":28,"in_reply_to":"7f88611e_24ee910a","updated":"2025-11-07 19:44:41.000000000","message":"This is a yaml file.  I\u0027ve added info in the docs.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"def register_opts(conf):"},{"line_number":150,"context_line":"    conf.register_opts(opts, group\u003d\u0027networking\u0027)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":6,"id":"6cef684c_dcab34f6","line":150,"updated":"2025-11-03 19:53:58.000000000","message":"I wonder if we should call this \"standalone-networking\" or something other than this -- someone using neutron will be completely confused by this section existing.\n\n(later edit): I think this needs a name-name, we call it \"networking\", \"standalone networking\" and \"experimental standalone networking\" in different places.\n\nMaybe just call it \"mercury\" or something else?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/drivers/generic.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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":66,"context_line":"        \"\"\"List of supported network interfaces.\"\"\""},{"line_number":67,"context_line":"        return [flat_net.FlatNetwork, neutron.NeutronNetwork,"},{"line_number":68,"context_line":"                noop_net.NoopNetwork,"},{"line_number":69,"context_line":"                standalone_experimental.StandaloneExperimental]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"},{"line_number":72,"context_line":"    def supported_raid_interfaces(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"43d6ddcb_c0b42c8e","line":69,"updated":"2025-11-03 19:53:58.000000000","message":"I don\u0027t love encoding \"experimental\" into the classname here. I\u0027d strongly prefer we don\u0027t use operator-facing, long-lived strings to communicate temporary status.","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\"List of supported network interfaces.\"\"\""},{"line_number":67,"context_line":"        return [flat_net.FlatNetwork, neutron.NeutronNetwork,"},{"line_number":68,"context_line":"                noop_net.NoopNetwork,"},{"line_number":69,"context_line":"                standalone_experimental.StandaloneExperimental]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"},{"line_number":72,"context_line":"    def supported_raid_interfaces(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"2b884f8f_3482c1ce","line":69,"in_reply_to":"43d6ddcb_c0b42c8e","updated":"2025-11-07 19:44:41.000000000","message":"renamed to \"ironic-networking\"","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/drivers/modules/fake.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":492,"context_line":"        return states.ACTIVE"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"class FakeNetwork(base.NetworkInterface):"},{"line_number":496,"context_line":"    \"\"\"Example implementation of a simple network interface.\"\"\""},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def get_properties(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"579daad5_53d08e7f","line":495,"updated":"2025-09-30 18:10:43.000000000","message":"Honestly, I\u0027d break this out as a separate change. Its is small, we should have it.\n\nIt *is* similar to \"noop\", but this is cleaner for unit testing.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":492,"context_line":"        return states.ACTIVE"},{"line_number":493,"context_line":""},{"line_number":494,"context_line":""},{"line_number":495,"context_line":"class FakeNetwork(base.NetworkInterface):"},{"line_number":496,"context_line":"    \"\"\"Example implementation of a simple network interface.\"\"\""},{"line_number":497,"context_line":""},{"line_number":498,"context_line":"    def get_properties(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dcde3805_ac9e5e06","line":495,"in_reply_to":"579daad5_53d08e7f","updated":"2025-10-06 12:20:05.000000000","message":"Removed for now.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/drivers/modules/network/schemas/standalone-portchannel.schema.json":[{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"title\": \"Standalone Experimental Network Interface Portchannel Configuration Schema\","},{"line_number":4,"context_line":"    \"description\": \"Schema for validating portchannel configuration in portgroup \u0027extra\u0027 field for standalone experimental network interface. Different modes have different requirements for VLAN configuration.\","},{"line_number":5,"context_line":"    \"type\": \"object\","},{"line_number":6,"context_line":"    \"properties\": {"}],"source_content_type":"application/json","patch_set":6,"id":"1566fdb8_8b6e3caa","line":3,"updated":"2025-11-03 19:53:58.000000000","message":"again (not going to mention it everywhere) -- I don\u0027t want to codify \u0027experimental\u0027 in the name or else we\u0027ll be calling it \"Ironic experimental networking\" in the year 2035 :D","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":1,"context_line":"{"},{"line_number":2,"context_line":"    \"$schema\": \"http://json-schema.org/draft-04/schema#\","},{"line_number":3,"context_line":"    \"title\": \"Standalone Experimental Network Interface Portchannel Configuration Schema\","},{"line_number":4,"context_line":"    \"description\": \"Schema for validating portchannel configuration in portgroup \u0027extra\u0027 field for standalone experimental network interface. Different modes have different requirements for VLAN configuration.\","},{"line_number":5,"context_line":"    \"type\": \"object\","},{"line_number":6,"context_line":"    \"properties\": {"}],"source_content_type":"application/json","patch_set":6,"id":"eebb9cd2_1cb7d41c","line":3,"in_reply_to":"1566fdb8_8b6e3caa","updated":"2025-11-07 19:44:41.000000000","message":"renamed to ironic-networking\"","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/drivers/modules/network/standalone_experimental.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    schemas/standalone-portchannel.schema.json."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        \"\"\"Initialize the StandaloneExperimental interface.\"\"\""},{"line_number":80,"context_line":"        super(StandaloneExperimental, self).__init__()"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c7c69af1_0830d6f8","line":78,"updated":"2025-09-30 18:10:43.000000000","message":"We likely need to be super careful about this because it ends up triggering this code on each task which gets launched. A slightly better pattern is on service start.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    schemas/standalone-portchannel.schema.json."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        \"\"\"Initialize the StandaloneExperimental interface.\"\"\""},{"line_number":80,"context_line":"        super(StandaloneExperimental, self).__init__()"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8dcd4849_b17d98da","line":78,"in_reply_to":"c449151a_938a3ffa","updated":"2025-10-06 12:20:05.000000000","message":"Fixed.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    schemas/standalone-portchannel.schema.json."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def __init__(self):"},{"line_number":79,"context_line":"        \"\"\"Initialize the StandaloneExperimental interface.\"\"\""},{"line_number":80,"context_line":"        super(StandaloneExperimental, self).__init__()"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c449151a_938a3ffa","line":78,"in_reply_to":"c7c69af1_0830d6f8","updated":"2025-09-30 19:04:03.000000000","message":"Ok, I\u0027ll see how that can be done.  Is there an example of something similar in another driver?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        except (IOError, json.JSONDecodeError) as e:"},{"line_number":102,"context_line":"            LOG.error(\"Failed to load portchannel schema from %s: %s\","},{"line_number":103,"context_line":"                      portchannel_schema_file, e)"},{"line_number":104,"context_line":"            self.portchannel_schema \u003d None"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def validate(self, task):"},{"line_number":107,"context_line":"        \"\"\"Validate the network interface configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"c6f208ae_c326c132","line":104,"updated":"2025-09-30 18:10:43.000000000","message":"Question we likely need to ask: If we ship and expect schema to be present, then why are we failing here, shouldn\u0027t we fail the overall driver load?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        except (IOError, json.JSONDecodeError) as e:"},{"line_number":102,"context_line":"            LOG.error(\"Failed to load portchannel schema from %s: %s\","},{"line_number":103,"context_line":"                      portchannel_schema_file, e)"},{"line_number":104,"context_line":"            self.portchannel_schema \u003d None"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def validate(self, task):"},{"line_number":107,"context_line":"        \"\"\"Validate the network interface configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"9debc4a8_5dd7fb3a","line":104,"in_reply_to":"5fd95840_05bfcc7f","updated":"2025-10-06 12:20:05.000000000","message":"Fixed.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        except (IOError, json.JSONDecodeError) as e:"},{"line_number":102,"context_line":"            LOG.error(\"Failed to load portchannel schema from %s: %s\","},{"line_number":103,"context_line":"                      portchannel_schema_file, e)"},{"line_number":104,"context_line":"            self.portchannel_schema \u003d None"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def validate(self, task):"},{"line_number":107,"context_line":"        \"\"\"Validate the network interface configuration."}],"source_content_type":"text/x-python","patch_set":2,"id":"5fd95840_05bfcc7f","line":104,"in_reply_to":"c6f208ae_c326c132","updated":"2025-09-30 19:04:03.000000000","message":"I thought this /was/ being hit on driver load.   I\u0027ll throw some logs in here to double-check.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        return f\"Ironic PortGroup {portgroup.uuid}\""},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    @staticmethod"},{"line_number":461,"context_line":"    def _get_active_network_type(task):"},{"line_number":462,"context_line":"        \"\"\"Determine which network type should be active based on node state."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        :param task: A TaskManager instance."}],"source_content_type":"text/x-python","patch_set":2,"id":"4e84c980_f19484cc","line":461,"updated":"2025-09-30 18:10:43.000000000","message":"I\u0027m just going to put this out there, but this makes me super nervous because the service should be declaring what and where. In this case we seem to be trying to reconcile it back.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        return f\"Ironic PortGroup {portgroup.uuid}\""},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    @staticmethod"},{"line_number":461,"context_line":"    def _get_active_network_type(task):"},{"line_number":462,"context_line":"        \"\"\"Determine which network type should be active based on node state."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        :param task: A TaskManager instance."}],"source_content_type":"text/x-python","patch_set":2,"id":"4c3944ce_bca3a93c","line":461,"in_reply_to":"1686bde5_6832c5c6","updated":"2025-11-07 19:44:41.000000000","message":"Resolved.. necessary","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        return f\"Ironic PortGroup {portgroup.uuid}\""},{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    @staticmethod"},{"line_number":461,"context_line":"    def _get_active_network_type(task):"},{"line_number":462,"context_line":"        \"\"\"Determine which network type should be active based on node state."},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        :param task: A TaskManager instance."}],"source_content_type":"text/x-python","patch_set":2,"id":"1686bde5_6832c5c6","line":461,"in_reply_to":"4e84c980_f19484cc","updated":"2025-09-30 19:04:03.000000000","message":"This seemed like the best way to handle the case of a port update.   i.e., the node is in cleaning and somebody changes the port.extra.switchport to use some other vlan which may require immediately changing the switch configuration (if there wasn\u0027t a global override in the config file for the cleaning network).  \n\nIf you don\u0027t think that updating the port as a immediate action is something we need to care about we could eliminate all of this code.  The alternative is that updates to the port only kick-in on the next state change.  Maybe that\u0027s sufficient?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":731,"context_line":"            # No relevant changes, skip this port"},{"line_number":732,"context_line":"            return"},{"line_number":733,"context_line":""},{"line_number":734,"context_line":"        # Determine what network should be active based on node state"},{"line_number":735,"context_line":"        active_network_type \u003d self._get_active_network_type(task)"},{"line_number":736,"context_line":"        if active_network_type is None:"},{"line_number":737,"context_line":"            # No network should be active, skip this port"},{"line_number":738,"context_line":"            LOG.info("},{"line_number":739,"context_line":"                \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":740,"context_line":"                \"but no network should be active, skipping\","},{"line_number":741,"context_line":"                {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":742,"context_line":"                 \u0027state\u0027: task.node.provision_state})"},{"line_number":743,"context_line":"            return"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        LOG.debug("},{"line_number":746,"context_line":"            \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":747,"context_line":"            \"active network type: %(network_type)s, changed fields: \""},{"line_number":748,"context_line":"            \"%(fields)s\","},{"line_number":749,"context_line":"            {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":750,"context_line":"             \u0027state\u0027: task.node.provision_state,"},{"line_number":751,"context_line":"             \u0027network_type\u0027: active_network_type,"},{"line_number":752,"context_line":"             \u0027fields\u0027: list(changed_fields)})"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        # Get current configuration"},{"line_number":755,"context_line":"        current_switchport \u003d (port_obj.extra.get(\u0027switchport\u0027)"},{"line_number":756,"context_line":"                              if port_obj.extra else None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f24ba71_4ad05ad1","line":753,"range":{"start_line":734,"start_character":0,"end_line":753,"end_character":0},"updated":"2025-09-30 18:10:43.000000000","message":"$0.01, I\u0027m not sure the state should become involved as it relates to evaluating the contents or changes to the port config data. Discussion likely needed.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":731,"context_line":"            # No relevant changes, skip this port"},{"line_number":732,"context_line":"            return"},{"line_number":733,"context_line":""},{"line_number":734,"context_line":"        # Determine what network should be active based on node state"},{"line_number":735,"context_line":"        active_network_type \u003d self._get_active_network_type(task)"},{"line_number":736,"context_line":"        if active_network_type is None:"},{"line_number":737,"context_line":"            # No network should be active, skip this port"},{"line_number":738,"context_line":"            LOG.info("},{"line_number":739,"context_line":"                \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":740,"context_line":"                \"but no network should be active, skipping\","},{"line_number":741,"context_line":"                {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":742,"context_line":"                 \u0027state\u0027: task.node.provision_state})"},{"line_number":743,"context_line":"            return"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        LOG.debug("},{"line_number":746,"context_line":"            \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":747,"context_line":"            \"active network type: %(network_type)s, changed fields: \""},{"line_number":748,"context_line":"            \"%(fields)s\","},{"line_number":749,"context_line":"            {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":750,"context_line":"             \u0027state\u0027: task.node.provision_state,"},{"line_number":751,"context_line":"             \u0027network_type\u0027: active_network_type,"},{"line_number":752,"context_line":"             \u0027fields\u0027: list(changed_fields)})"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        # Get current configuration"},{"line_number":755,"context_line":"        current_switchport \u003d (port_obj.extra.get(\u0027switchport\u0027)"},{"line_number":756,"context_line":"                              if port_obj.extra else None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee487b0c_af3bf068","line":753,"range":{"start_line":734,"start_character":0,"end_line":753,"end_character":0},"in_reply_to":"06793f9e_6af98512","updated":"2025-11-07 19:44:41.000000000","message":"Resolved","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":731,"context_line":"            # No relevant changes, skip this port"},{"line_number":732,"context_line":"            return"},{"line_number":733,"context_line":""},{"line_number":734,"context_line":"        # Determine what network should be active based on node state"},{"line_number":735,"context_line":"        active_network_type \u003d self._get_active_network_type(task)"},{"line_number":736,"context_line":"        if active_network_type is None:"},{"line_number":737,"context_line":"            # No network should be active, skip this port"},{"line_number":738,"context_line":"            LOG.info("},{"line_number":739,"context_line":"                \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":740,"context_line":"                \"but no network should be active, skipping\","},{"line_number":741,"context_line":"                {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":742,"context_line":"                 \u0027state\u0027: task.node.provision_state})"},{"line_number":743,"context_line":"            return"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"        LOG.debug("},{"line_number":746,"context_line":"            \"Port %(port)s changed on node %(node)s in state %(state)s, \""},{"line_number":747,"context_line":"            \"active network type: %(network_type)s, changed fields: \""},{"line_number":748,"context_line":"            \"%(fields)s\","},{"line_number":749,"context_line":"            {\u0027port\u0027: port_obj.uuid, \u0027node\u0027: task.node.uuid,"},{"line_number":750,"context_line":"             \u0027state\u0027: task.node.provision_state,"},{"line_number":751,"context_line":"             \u0027network_type\u0027: active_network_type,"},{"line_number":752,"context_line":"             \u0027fields\u0027: list(changed_fields)})"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":"        # Get current configuration"},{"line_number":755,"context_line":"        current_switchport \u003d (port_obj.extra.get(\u0027switchport\u0027)"},{"line_number":756,"context_line":"                              if port_obj.extra else None)"}],"source_content_type":"text/x-python","patch_set":2,"id":"06793f9e_6af98512","line":753,"range":{"start_line":734,"start_character":0,"end_line":753,"end_character":0},"in_reply_to":"7f24ba71_4ad05ad1","updated":"2025-09-30 19:04:03.000000000","message":"As per my comment above... how should a port update be handled then?  should we just ignore it and only take action on the switch on the next node state change that requires a add_*_network?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":1323,"context_line":"        :param task: A TaskManager instance."},{"line_number":1324,"context_line":"        :returns: The node\u0027s network_data field or empty dict."},{"line_number":1325,"context_line":"        \"\"\""},{"line_number":1326,"context_line":"        return task.node.network_data or {}"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    def add_servicing_network(self, task):"},{"line_number":1329,"context_line":"        \"\"\"Add the servicing network to the node."}],"source_content_type":"text/x-python","patch_set":2,"id":"de1cf231_5bd1bb43","line":1326,"updated":"2025-09-30 19:04:03.000000000","message":"still need to figure this out.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"        :param task: A TaskManager instance."},{"line_number":1324,"context_line":"        :returns: The node\u0027s network_data field or empty dict."},{"line_number":1325,"context_line":"        \"\"\""},{"line_number":1326,"context_line":"        return task.node.network_data or {}"},{"line_number":1327,"context_line":""},{"line_number":1328,"context_line":"    def add_servicing_network(self, task):"},{"line_number":1329,"context_line":"        \"\"\"Add the servicing network to the node."}],"source_content_type":"text/x-python","patch_set":2,"id":"92873470_2476fd80","line":1326,"in_reply_to":"de1cf231_5bd1bb43","updated":"2025-11-07 19:44:41.000000000","message":"updated","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/drivers/modules/switch/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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    _msg_fmt \u003d \"Method %(method)s not implemented for driver %(DRIVER_NAME).\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class SwitchDriverBase(object, metaclass\u003dabc.ABCMeta):"},{"line_number":42,"context_line":"    \"\"\"Base class for all switch drivers."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    Switch drivers provide vendor-specific implementations for managing"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a908a34_80e3beda","line":41,"updated":"2025-11-03 19:53:58.000000000","message":"Maybe Networking Backend or something similar? The existing name makes sense if we expect folks to be implementing drivers directly in Ironic vs in NGS primarily. What\u0027s the usage pattern we expect in the long term?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"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":"25d9976e843439bd419c9204ea93976973b4e061","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    _msg_fmt \u003d \"Method %(method)s not implemented for driver %(DRIVER_NAME).\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class SwitchDriverBase(object, metaclass\u003dabc.ABCMeta):"},{"line_number":42,"context_line":"    \"\"\"Base class for all switch drivers."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    Switch drivers provide vendor-specific implementations for managing"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a764827_2b55a0c2","line":41,"in_reply_to":"7a908a34_80e3beda","updated":"2025-11-03 20:12:36.000000000","message":"(This is another case where a real name, just just \u0027standalone networking\u0027 or similar, would make naming sub-things easier)","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/networking/__init__.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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"577317cb_ce873a31","line":24,"updated":"2025-11-03 19:53:58.000000000","message":"nit: This file should probably just be blank, as is normal for empty module `__init__.py`?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2c3d4eee_46afb140","line":24,"in_reply_to":"577317cb_ce873a31","updated":"2025-11-07 19:44:41.000000000","message":"removed","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/networking/driver_translators.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        )"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"class GenericSwitchTranslator(BaseTranslator):"},{"line_number":85,"context_line":"    \"\"\"Translates generic config to networking-generic-switch format.\"\"\""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _get_section_name(self, switch_name):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dbb8ca04_02632e47","line":84,"updated":"2025-09-30 18:10:43.000000000","message":"I guess there is a discussion to have here overall, well, wider than just this change, but regarding smoothing edges on NGS.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/networking/file_monitor.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":16,"context_line":"This module provides file system monitoring capabilities to watch for"},{"line_number":17,"context_line":"changes to switch configuration files and trigger automatic reloading"},{"line_number":18,"context_line":"of switch configurations and drivers."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import os"},{"line_number":22,"context_line":"import threading"}],"source_content_type":"text/x-python","patch_set":2,"id":"09696513_6859ed58","line":19,"updated":"2025-09-30 18:10:43.000000000","message":"So, I\u0027m just going to toss this out there.\n\nI feel like this is a lot of complexity (and another package requirement) to do dynamic config management, when the services are suppposed to be HUP\u0027ed (and restarted) when the configuration is changed.\n\nI guess it feel like the patterns mismatch and it begins to set an expectation that configuration changes just work and get loaded/incorporated across the board.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":16,"context_line":"This module provides file system monitoring capabilities to watch for"},{"line_number":17,"context_line":"changes to switch configuration files and trigger automatic reloading"},{"line_number":18,"context_line":"of switch configurations and drivers."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import os"},{"line_number":22,"context_line":"import threading"}],"source_content_type":"text/x-python","patch_set":2,"id":"89d05fd0_503abca2","line":19,"in_reply_to":"09696513_6859ed58","updated":"2025-09-30 19:04:03.000000000","message":"Ok, I figured this comment was coming.  I wrote this to handle the OCP/metal3 case of mounting the switch configs as a secret and having it automatically updated whenever the secret is updated.  Works well, but I can explore other options to handle it from the ironic startup script in ironic-image rather than have the service do it on its own.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"This module provides file system monitoring capabilities to watch for"},{"line_number":17,"context_line":"changes to switch configuration files and trigger automatic reloading"},{"line_number":18,"context_line":"of switch configurations and drivers."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"import os"},{"line_number":22,"context_line":"import threading"}],"source_content_type":"text/x-python","patch_set":2,"id":"35d4d695_70c5bec9","line":19,"in_reply_to":"89d05fd0_503abca2","updated":"2025-10-06 12:20:05.000000000","message":"As per our offline discussion... removed the file monitoring.  Will re-introduce at a later time if needed.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/networking/manager.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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# Copyright 2024 Ironic Contributors"},{"line_number":16,"context_line":"# All Rights Reserved."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"\"\"\"Networking service manager for Ironic."}],"source_content_type":"text/x-python","patch_set":6,"id":"df1565cc_e930e436","line":15,"updated":"2025-11-03 19:53:58.000000000","message":"Do we still typically add copyright year numbers? LN 15-17 just seem like they shouldn\u0027t be here?","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"# Copyright 2024 Ironic Contributors"},{"line_number":16,"context_line":"# All Rights Reserved."},{"line_number":17,"context_line":"#"},{"line_number":18,"context_line":"\"\"\"Networking service manager for Ironic."}],"source_content_type":"text/x-python","patch_set":6,"id":"a0fc7aa5_43df4cfc","line":15,"in_reply_to":"df1565cc_e930e436","updated":"2025-11-07 19:44:41.000000000","message":"removed","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}],"ironic/networking/rpc_service.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":73,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":74,"context_line":"        )"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _handle_graceful_shutdown(self, signo, frame):"},{"line_number":77,"context_line":"        \"\"\"Handle graceful shutdown signal.\"\"\""},{"line_number":78,"context_line":"        LOG.info("},{"line_number":79,"context_line":"            \"Got signal %s. Starting graceful shutdown of networking \""},{"line_number":80,"context_line":"            \"service %(service)s on host %(host)s.\","},{"line_number":81,"context_line":"            signo,"},{"line_number":82,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":83,"context_line":"        )"},{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"b93887f1_2bff1b5c","line":85,"range":{"start_line":76,"start_character":0,"end_line":85,"end_character":19},"updated":"2025-09-30 18:10:43.000000000","message":"This is also likely orphaned code, but definitely double check.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":73,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":74,"context_line":"        )"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _handle_graceful_shutdown(self, signo, frame):"},{"line_number":77,"context_line":"        \"\"\"Handle graceful shutdown signal.\"\"\""},{"line_number":78,"context_line":"        LOG.info("},{"line_number":79,"context_line":"            \"Got signal %s. Starting graceful shutdown of networking \""},{"line_number":80,"context_line":"            \"service %(service)s on host %(host)s.\","},{"line_number":81,"context_line":"            signo,"},{"line_number":82,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":83,"context_line":"        )"},{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"d4e11828_ee88b5ce","line":85,"range":{"start_line":76,"start_character":0,"end_line":85,"end_character":19},"in_reply_to":"b93887f1_2bff1b5c","updated":"2025-09-30 19:04:03.000000000","message":"ya, this came from the conductor i believe so maybe that got ripped out after I \u0027borrowed\u0027 it.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":74,"context_line":"        )"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _handle_graceful_shutdown(self, signo, frame):"},{"line_number":77,"context_line":"        \"\"\"Handle graceful shutdown signal.\"\"\""},{"line_number":78,"context_line":"        LOG.info("},{"line_number":79,"context_line":"            \"Got signal %s. Starting graceful shutdown of networking \""},{"line_number":80,"context_line":"            \"service %(service)s on host %(host)s.\","},{"line_number":81,"context_line":"            signo,"},{"line_number":82,"context_line":"            {\"service\": self.topic, \"host\": self.host},"},{"line_number":83,"context_line":"        )"},{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"b218f0ca_84e89065","line":85,"range":{"start_line":76,"start_character":0,"end_line":85,"end_character":19},"in_reply_to":"d4e11828_ee88b5ce","updated":"2025-10-06 12:20:05.000000000","message":"removed","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""},{"line_number":89,"context_line":"        # Handle SIGTERM for graceful shutdown"},{"line_number":90,"context_line":"        signal.signal(signal.SIGTERM, self._handle_graceful_shutdown)"},{"line_number":91,"context_line":"        # Handle SIGINT (Ctrl+C) for graceful shutdown"},{"line_number":92,"context_line":"        signal.signal(signal.SIGINT, self._handle_graceful_shutdown)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a3680f3_239415e0","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":68},"updated":"2025-09-30 18:10:43.000000000","message":"This is likely dead code copied from elsewhere. The command launcher invokes command_utils.handle_signal().","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""},{"line_number":89,"context_line":"        # Handle SIGTERM for graceful shutdown"},{"line_number":90,"context_line":"        signal.signal(signal.SIGTERM, self._handle_graceful_shutdown)"},{"line_number":91,"context_line":"        # Handle SIGINT (Ctrl+C) for graceful shutdown"},{"line_number":92,"context_line":"        signal.signal(signal.SIGINT, self._handle_graceful_shutdown)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c4ec7_6cd63936","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":68},"in_reply_to":"6d84702d_7098d8d8","updated":"2025-10-06 12:20:05.000000000","message":"removed","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"99349e81ec9a970f0f4b04d04c65ac1531e0fb6f","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        self.graceful_shutdown \u003d True"},{"line_number":85,"context_line":"        self.stop()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def handle_signal(self):"},{"line_number":88,"context_line":"        \"\"\"Add signal handlers for graceful shutdown.\"\"\""},{"line_number":89,"context_line":"        # Handle SIGTERM for graceful shutdown"},{"line_number":90,"context_line":"        signal.signal(signal.SIGTERM, self._handle_graceful_shutdown)"},{"line_number":91,"context_line":"        # Handle SIGINT (Ctrl+C) for graceful shutdown"},{"line_number":92,"context_line":"        signal.signal(signal.SIGINT, self._handle_graceful_shutdown)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6d84702d_7098d8d8","line":92,"range":{"start_line":87,"start_character":0,"end_line":92,"end_character":68},"in_reply_to":"9a3680f3_239415e0","updated":"2025-09-30 19:04:03.000000000","message":"ya, this came from the conductor i believe so maybe that got ripped out after I \u0027borrowed\u0027 it.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"ironic/networking/utils.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f4d5f3f4cbf85ccb1c9aac1214a2726f32b73d3e","unresolved":true,"context_lines":[{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def rpc_transport():"},{"line_number":28,"context_line":"    \"\"\"Get the RPC transport type.\"\"\""},{"line_number":29,"context_line":"    if CONF.networking.rpc_transport is None:"},{"line_number":30,"context_line":"        return CONF.rpc_transport"},{"line_number":31,"context_line":"    else:"},{"line_number":32,"context_line":"        return CONF.networking.rpc_transport"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def parse_vlan_ranges(vlan_ranges):"},{"line_number":36,"context_line":"    \"\"\"Parse VLAN ranges from a list of strings."}],"source_content_type":"text/x-python","patch_set":2,"id":"5137268b_291916c5","line":33,"range":{"start_line":26,"start_character":0,"end_line":33,"end_character":0},"updated":"2025-09-30 18:10:43.000000000","message":"Is this needed here?","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":"CONF \u003d cfg.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def rpc_transport():"},{"line_number":28,"context_line":"    \"\"\"Get the RPC transport type.\"\"\""},{"line_number":29,"context_line":"    if CONF.networking.rpc_transport is None:"},{"line_number":30,"context_line":"        return CONF.rpc_transport"},{"line_number":31,"context_line":"    else:"},{"line_number":32,"context_line":"        return CONF.networking.rpc_transport"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def parse_vlan_ranges(vlan_ranges):"},{"line_number":36,"context_line":"    \"\"\"Parse VLAN ranges from a list of strings."}],"source_content_type":"text/x-python","patch_set":2,"id":"74b88ec5_92617dbb","line":33,"range":{"start_line":26,"start_character":0,"end_line":33,"end_character":0},"in_reply_to":"5137268b_291916c5","updated":"2025-10-06 12:20:05.000000000","message":"Need it because the client and server code need to check different locations.","commit_id":"57e6a771e2f633aa32f8a5db972ad5b7659ec103"}],"requirements.txt":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"99ec046ec18619a012de36a7ae4b8ea23f7e5ba6","unresolved":true,"context_lines":[{"line_number":48,"context_line":"PyYAML\u003e\u003d6.0.2 # MIT"},{"line_number":49,"context_line":"cheroot\u003e\u003d10.0.1 # BSD"},{"line_number":50,"context_line":"cotyledon\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":51,"context_line":"watchdog\u003e\u003d6.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"d482dde0_63a3c1bd","line":51,"updated":"2025-09-29 20:27:12.000000000","message":"This is not in global-requirements.\n\nhttps://github.com/openstack/requirements/blob/master/global-requirements.txt","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc8d7294c7b1f5ed6c68ce76e737f4f4239a747f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"PyYAML\u003e\u003d6.0.2 # MIT"},{"line_number":49,"context_line":"cheroot\u003e\u003d10.0.1 # BSD"},{"line_number":50,"context_line":"cotyledon\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":51,"context_line":"watchdog\u003e\u003d6.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"21bf09bc_5feb876b","line":51,"in_reply_to":"3a933970_42bad23a","updated":"2025-10-06 12:20:05.000000000","message":"Removed... since the file monitoring has been removed.","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"fc27d3ba1be417b68f66af29dcaeb8ef8093301e","unresolved":true,"context_lines":[{"line_number":48,"context_line":"PyYAML\u003e\u003d6.0.2 # MIT"},{"line_number":49,"context_line":"cheroot\u003e\u003d10.0.1 # BSD"},{"line_number":50,"context_line":"cotyledon\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":51,"context_line":"watchdog\u003e\u003d6.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"3a933970_42bad23a","line":51,"in_reply_to":"d482dde0_63a3c1bd","updated":"2025-09-30 12:21:28.000000000","message":"I didn\u0027t know about this.  So, we can\u0027t use anything that isn\u0027t already in that file?  Is it feasible to go and add this to the global requirements?","commit_id":"68956d139143edaec9aa3f6f180c6b0ffdd967e0"}],"test-requirements.txt":[{"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":"125163124b9d3c9628a1d3c04ebdc248fd324a59","unresolved":true,"context_lines":[{"line_number":12,"context_line":"pyasn1-modules\u003e\u003d0.3.0 # BSD"},{"line_number":13,"context_line":"bandit\u003e\u003d1.1.0,\u003c2.0.0 # Apache-2.0"},{"line_number":14,"context_line":"networking-generic-switch\u003e\u003d8.0.0"},{"line_number":15,"context_line":"#-e file:///home/alegacy/src/python/opendev.org/networking-generic-switch"}],"source_content_type":"text/plain","patch_set":6,"id":"b621ab46_8739f105","line":15,"updated":"2025-11-03 19:53:58.000000000","message":"this needs removal","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ed4f553f698608796932a3a639a2d2232ad0e855","unresolved":false,"context_lines":[{"line_number":12,"context_line":"pyasn1-modules\u003e\u003d0.3.0 # BSD"},{"line_number":13,"context_line":"bandit\u003e\u003d1.1.0,\u003c2.0.0 # Apache-2.0"},{"line_number":14,"context_line":"networking-generic-switch\u003e\u003d8.0.0"},{"line_number":15,"context_line":"#-e file:///home/alegacy/src/python/opendev.org/networking-generic-switch"}],"source_content_type":"text/plain","patch_set":6,"id":"7ec92883_f443f09c","line":15,"in_reply_to":"b621ab46_8739f105","updated":"2025-11-07 19:44:41.000000000","message":"removed","commit_id":"452393f82ba3d25ae0a21c82f5a76d48a1f59d64"}]}
