)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"4c298a16e9add9ac3806d5f79dc358948cdc4526","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"acf66327_03eedf5a","updated":"2025-11-14 20:30:43.000000000","message":"Comments addressed.","commit_id":"1bef6a827490d3df3fe1adfaae9bdfa95795904c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"ca594df8b9ec2e53ea04af32097b1e5ac1dbb8a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f4cdf11b_f0f95fe2","updated":"2025-12-01 12:29:10.000000000","message":"recheck","commit_id":"87078a9680a573cc6a09e8f49410c74aadc5bade"},{"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":"cb3063a708b7a3f7e6342253ee37ec88f1aaccb3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"eacfca72_27354dbc","updated":"2025-12-09 21:10:24.000000000","message":"just a comment not a full review","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f5128ea8_df93625d","updated":"2025-12-16 13:23:44.000000000","message":"Comments addressed, PTAL","commit_id":"35324a02ad5c097711b46ef84f60969c0c83b981"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ea19c918dde047a42cd374cf599cc823072e08eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"49f02119_b5267216","updated":"2025-12-19 19:06:03.000000000","message":"As-is, self contained, LGTM.","commit_id":"a6b3f1e3315556d874872af8575fb3116a49f58f"}],"driver-requirements.txt":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":14,"context_line":"ansible\u003e\u003d2.7"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# Standalone Networking Switch drivers"},{"line_number":17,"context_line":"networking-generic-switch\u003e\u003d8.0.0"}],"source_content_type":"text/plain","patch_set":6,"id":"a72dd5c7_ed61762f","line":17,"updated":"2025-12-09 16:17:27.000000000","message":"Something to discuss as a group: whether we want to rely on releases here (vs a git checkout) and if yes, whether we want to release more often.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":14,"context_line":"ansible\u003e\u003d2.7"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# Standalone Networking Switch drivers"},{"line_number":17,"context_line":"networking-generic-switch\u003e\u003d8.0.0"}],"source_content_type":"text/plain","patch_set":6,"id":"84e5aef6_9506f431","line":17,"in_reply_to":"960c415d_0e3ded94","updated":"2025-12-16 13:23:44.000000000","message":"I read JayF\u0027s comment as it should stay the way it is now.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"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":"cb3063a708b7a3f7e6342253ee37ec88f1aaccb3","unresolved":true,"context_lines":[{"line_number":14,"context_line":"ansible\u003e\u003d2.7"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# Standalone Networking Switch drivers"},{"line_number":17,"context_line":"networking-generic-switch\u003e\u003d8.0.0"}],"source_content_type":"text/plain","patch_set":6,"id":"960c415d_0e3ded94","line":17,"in_reply_to":"a72dd5c7_ed61762f","updated":"2025-12-09 21:10:24.000000000","message":"I am -2 to using a git url here. If that means we need to release more frequently, so be it, but it\u0027s not reasonable to ask users to download a single package from git when the rest is mirrorable in pypi.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}],"ironic/drivers/modules/switch/base.py":[{"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":"121e773e4a485847464ac9964733a2757f3509e8","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        \"\"\"Update a port configuration on a switch."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        :param switch_id: Identifier for the switch."},{"line_number":84,"context_line":"        :param port_name: Name/identifier of the port on the switch."},{"line_number":85,"context_line":"        :param description: Description to set for the port."},{"line_number":86,"context_line":"        :param mode: Port mode (\u0027access\u0027, \u0027trunk\u0027, or \u0027hybrid\u0027)."},{"line_number":87,"context_line":"        :param native_vlan: VLAN ID to be set on the port."}],"source_content_type":"text/x-python","patch_set":1,"id":"3c9ed814_38e3121e","line":84,"range":{"start_line":84,"start_character":15,"end_line":84,"end_character":24},"updated":"2025-11-11 14:09:58.000000000","message":"If we intend `port_name` to accept both a UUID and a name as implied here and used in the concrete method, `port_ident` might be a more appropriate param name.","commit_id":"eba91dc9c997b044a902c514a87887ce80ed34ae"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"4c298a16e9add9ac3806d5f79dc358948cdc4526","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        \"\"\"Update a port configuration on a switch."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        :param switch_id: Identifier for the switch."},{"line_number":84,"context_line":"        :param port_name: Name/identifier of the port on the switch."},{"line_number":85,"context_line":"        :param description: Description to set for the port."},{"line_number":86,"context_line":"        :param mode: Port mode (\u0027access\u0027, \u0027trunk\u0027, or \u0027hybrid\u0027)."},{"line_number":87,"context_line":"        :param native_vlan: VLAN ID to be set on the port."}],"source_content_type":"text/x-python","patch_set":1,"id":"a4d3a29d_1ba8d17d","line":84,"range":{"start_line":84,"start_character":15,"end_line":84,"end_character":24},"in_reply_to":"3c9ed814_38e3121e","updated":"2025-11-14 20:30:43.000000000","message":"This is always an opaque string that the switch uses to identify a port.  I\u0027ll just simplify this to be \"port_name\" and adjust the doc string to match.","commit_id":"eba91dc9c997b044a902c514a87887ce80ed34ae"},{"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":"b26141237f3bf74a23a87e8131ca6251f7bb2ec3","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class SwitchDriverException(IronicException):"},{"line_number":30,"context_line":"    _msg_fmt \u003d \"A switch configuration exception occurred.\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class SwitchNotFound(SwitchDriverException):"}],"source_content_type":"text/x-python","patch_set":5,"id":"603f5204_ae13f258","line":30,"updated":"2025-12-04 21:37:44.000000000","message":"throughout: _() needed for i18n","commit_id":"465e5dd55e15a4b674c5bb5aea1410e59b3a1c8c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"981632b6caa6f39c12c9a2ff8c63aeb2f01ea7a9","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class SwitchDriverException(IronicException):"},{"line_number":30,"context_line":"    _msg_fmt \u003d \"A switch configuration exception occurred.\""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class SwitchNotFound(SwitchDriverException):"}],"source_content_type":"text/x-python","patch_set":5,"id":"4c111c4a_9b404954","line":30,"in_reply_to":"603f5204_ae13f258","updated":"2025-12-05 13:39:16.000000000","message":"Done","commit_id":"465e5dd55e15a4b674c5bb5aea1410e59b3a1c8c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"fcf12814_b2871286","updated":"2025-12-09 16:17:27.000000000","message":"Code organization thoughts: these drivers will run in the ironic-networking context, right? Maybe we want to place them under ironic/networking so that future implementers don\u0027t start to accidentally use code dependent on conductor-specific features or database. Thoughts?","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"930cec64_83be23ef","in_reply_to":"fcf12814_b2871286","updated":"2025-12-16 13:23:44.000000000","message":"I could move them later I guess, but I think it makes sense to have them together in the same part of the driver tree.  For now anyway, I\u0027d rather keep them where they are to avoid too much churn in the patch chain.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":113,"context_line":"        :raises: SwitchDriverException on configuration failures."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    @abc.abstractmethod"},{"line_number":117,"context_line":"    def update_lag("},{"line_number":118,"context_line":"        self,"},{"line_number":119,"context_line":"        switch_ids,"}],"source_content_type":"text/x-python","patch_set":6,"id":"2f612e47_821f0ac1","line":116,"updated":"2025-12-09 16:17:27.000000000","message":"Judging by the n-g-s driver, update_lag and delete_lag are optional, so let\u0027s not make them abstract.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        :raises: SwitchDriverException on configuration failures."},{"line_number":114,"context_line":"        \"\"\""},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    @abc.abstractmethod"},{"line_number":117,"context_line":"    def update_lag("},{"line_number":118,"context_line":"        self,"},{"line_number":119,"context_line":"        switch_ids,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dbd24687_cfe3e5ff","line":116,"in_reply_to":"2f612e47_821f0ac1","updated":"2025-12-16 13:23:44.000000000","message":"I think making them abstract is the right way to go.  If a subclass doesn\u0027t support LAG then it can implement this and raise an NotImplemented exception.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}],"ironic/drivers/modules/switch/generic_switch.py":[{"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":"121e773e4a485847464ac9964733a2757f3509e8","unresolved":true,"context_lines":[{"line_number":196,"context_line":"            LOG.error(\"Failed to update port \""},{"line_number":197,"context_line":"                      \"%(port_id)s on switch %(switch_id)s: %(exc)s\","},{"line_number":198,"context_line":"                      {\u0027port_id\u0027: port_id, \u0027switch_id\u0027: switch_id, \u0027exc\u0027: e})"},{"line_number":199,"context_line":"            raise"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def reset_port(self, switch_id, port_id,"},{"line_number":202,"context_line":"                   native_vlan\u003dNone, allowed_vlans\u003dNone, default_vlan\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"d95a4e50_d7c4ef39","line":199,"range":{"start_line":199,"start_character":0,"end_line":199,"end_character":17},"updated":"2025-11-11 14:09:58.000000000","message":"I think this bare `raise` will be propagating the original NGS exemption, not a `SwitchDriverException`","commit_id":"eba91dc9c997b044a902c514a87887ce80ed34ae"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"4c298a16e9add9ac3806d5f79dc358948cdc4526","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            LOG.error(\"Failed to update port \""},{"line_number":197,"context_line":"                      \"%(port_id)s on switch %(switch_id)s: %(exc)s\","},{"line_number":198,"context_line":"                      {\u0027port_id\u0027: port_id, \u0027switch_id\u0027: switch_id, \u0027exc\u0027: e})"},{"line_number":199,"context_line":"            raise"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def reset_port(self, switch_id, port_id,"},{"line_number":202,"context_line":"                   native_vlan\u003dNone, allowed_vlans\u003dNone, default_vlan\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f382157_b1e2cf12","line":199,"range":{"start_line":199,"start_character":0,"end_line":199,"end_character":17},"in_reply_to":"095b1bcc_f051cbaa","updated":"2025-11-14 20:30:43.000000000","message":"Actually, you are right.  This was not my intention.","commit_id":"eba91dc9c997b044a902c514a87887ce80ed34ae"},{"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":"b1aa25766bf58c3a672b4a4687bd427377fc1ef3","unresolved":true,"context_lines":[{"line_number":196,"context_line":"            LOG.error(\"Failed to update port \""},{"line_number":197,"context_line":"                      \"%(port_id)s on switch %(switch_id)s: %(exc)s\","},{"line_number":198,"context_line":"                      {\u0027port_id\u0027: port_id, \u0027switch_id\u0027: switch_id, \u0027exc\u0027: e})"},{"line_number":199,"context_line":"            raise"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def reset_port(self, switch_id, port_id,"},{"line_number":202,"context_line":"                   native_vlan\u003dNone, allowed_vlans\u003dNone, default_vlan\u003dNone):"}],"source_content_type":"text/x-python","patch_set":1,"id":"095b1bcc_f051cbaa","line":199,"range":{"start_line":199,"start_character":0,"end_line":199,"end_character":17},"in_reply_to":"d95a4e50_d7c4ef39","updated":"2025-11-11 14:45:51.000000000","message":"Update: NGS exceptions get caught and wrapped in NetworkError at the network manager layer in this patch https://review.opendev.org/c/openstack/ironic/+/966468/1. So, I guess it\u0027s fine.","commit_id":"eba91dc9c997b044a902c514a87887ce80ed34ae"},{"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":"b26141237f3bf74a23a87e8131ca6251f7bb2ec3","unresolved":true,"context_lines":[{"line_number":315,"context_line":"        # Generic switch driver doesn\u0027t directly support LAGs"},{"line_number":316,"context_line":"        # This could be extended in the future or by subclasses"},{"line_number":317,"context_line":"        raise SwitchDriverException("},{"line_number":318,"context_line":"            \"LAG operations not supported by generic switch driver\")"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def delete_lag(self, switch_ids, lag_name):"},{"line_number":321,"context_line":"        \"\"\"Delete LAG configuration from switches."}],"source_content_type":"text/x-python","patch_set":5,"id":"07d161c7_accbd3ab","line":318,"updated":"2025-12-04 21:37:44.000000000","message":"Do we plan on adding this support? I took it for granted we\u0027d be building in support for LAG and have a need for it.","commit_id":"465e5dd55e15a4b674c5bb5aea1410e59b3a1c8c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"981632b6caa6f39c12c9a2ff8c63aeb2f01ea7a9","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        # Generic switch driver doesn\u0027t directly support LAGs"},{"line_number":316,"context_line":"        # This could be extended in the future or by subclasses"},{"line_number":317,"context_line":"        raise SwitchDriverException("},{"line_number":318,"context_line":"            \"LAG operations not supported by generic switch driver\")"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def delete_lag(self, switch_ids, lag_name):"},{"line_number":321,"context_line":"        \"\"\"Delete LAG configuration from switches."}],"source_content_type":"text/x-python","patch_set":5,"id":"c2519bb4_6e1266d1","line":318,"in_reply_to":"07d161c7_accbd3ab","updated":"2025-12-05 13:39:16.000000000","message":"Yes, but I want to get the port handling in first and then come back and do the LAG support as a next step.  Too many moving parts to get it all in one go.","commit_id":"465e5dd55e15a4b674c5bb5aea1410e59b3a1c8c"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":16,"context_line":"from ironic.drivers.modules.switch.base import SwitchNotFound"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from networking_generic_switch import devices"},{"line_number":20,"context_line":"from networking_generic_switch.devices import utils as device_utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID_PORT_MODES \u003d [\u0027access\u0027, \u0027trunk\u0027, \u0027hybrid\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"a890e253_b1634a54","line":19,"updated":"2025-12-09 16:17:27.000000000","message":"Let\u0027s use the importutils.try_import pattern here to make sure all modules are importable by default - check other drivers.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from ironic.drivers.modules.switch.base import SwitchNotFound"},{"line_number":17,"context_line":"from oslo_log import log as logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from networking_generic_switch import devices"},{"line_number":20,"context_line":"from networking_generic_switch.devices import utils as device_utils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"VALID_PORT_MODES \u003d [\u0027access\u0027, \u0027trunk\u0027, \u0027hybrid\u0027]"}],"source_content_type":"text/x-python","patch_set":6,"id":"a0754a85_fc22b54b","line":19,"in_reply_to":"a890e253_b1634a54","updated":"2025-12-16 13:23:44.000000000","message":"Done","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        Initialize the driver and load all configured switch devices"},{"line_number":47,"context_line":"        using the same devices module as GenericSwitchDriver."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        super(GenericSwitchDriver, self).__init__()"},{"line_number":50,"context_line":"        self._devices \u003d devices.get_devices()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        LOG.info(\u0027Devices %s have been loaded\u0027, self._devices.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"2738a890_41e5aa84","line":49,"updated":"2025-12-09 16:17:27.000000000","message":"... and here you\u0027d check if n-g-s was actually imported","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        Initialize the driver and load all configured switch devices"},{"line_number":47,"context_line":"        using the same devices module as GenericSwitchDriver."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        super(GenericSwitchDriver, self).__init__()"},{"line_number":50,"context_line":"        self._devices \u003d devices.get_devices()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        LOG.info(\u0027Devices %s have been loaded\u0027, self._devices.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"ebe6f0c0_f41f2ff6","line":49,"in_reply_to":"2738a890_41e5aa84","updated":"2025-12-16 13:23:44.000000000","message":"Done","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        LOG.info(\u0027Devices %s have been loaded\u0027, self._devices.keys())"},{"line_number":53,"context_line":"        if not self._devices:"},{"line_number":54,"context_line":"            LOG.error(\u0027No devices have been loaded\u0027)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @staticmethod"},{"line_number":57,"context_line":"    def _get_trunk_details(native_vlan, allowed_vlans):"}],"source_content_type":"text/x-python","patch_set":6,"id":"c16e53f9_0742fdf7","line":54,"updated":"2025-12-09 16:17:27.000000000","message":"If it\u0027s an error, raise an exception? Or if you want to tolerate empty configuration on start-up (which I guess makes sense for Metal3), let\u0027s demote this to a warning.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        LOG.info(\u0027Devices %s have been loaded\u0027, self._devices.keys())"},{"line_number":53,"context_line":"        if not self._devices:"},{"line_number":54,"context_line":"            LOG.error(\u0027No devices have been loaded\u0027)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @staticmethod"},{"line_number":57,"context_line":"    def _get_trunk_details(native_vlan, allowed_vlans):"}],"source_content_type":"text/x-python","patch_set":6,"id":"70ca26d9_7d29821a","line":54,"in_reply_to":"c16e53f9_0742fdf7","updated":"2025-12-16 13:23:44.000000000","message":"Done","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}],"ironic/networking/api.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":129,"context_line":"    :param switch_ids: List of switch identifiers."},{"line_number":130,"context_line":"    :param lag_name: Name of the LAG."},{"line_number":131,"context_line":"    :param description: Description for the LAG."},{"line_number":132,"context_line":"    :param mode: switchport mode (\u0027access\u0027 or \u0027trunk\u0027)."},{"line_number":133,"context_line":"    :param native_vlan: VLAN ID to be set for the LAG."},{"line_number":134,"context_line":"    :param aggregation_mode: Aggregation mode (e.g., \u0027lacp\u0027, \u0027static\u0027)."},{"line_number":135,"context_line":"    :param allowed_vlans: List of allowed VLAN IDs to be added (optional)."}],"source_content_type":"text/x-python","patch_set":6,"id":"370844c8_7c4019df","line":132,"updated":"2025-12-09 16:17:27.000000000","message":"nit: ideally such changes should be proposed separately","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    :param switch_ids: List of switch identifiers."},{"line_number":130,"context_line":"    :param lag_name: Name of the LAG."},{"line_number":131,"context_line":"    :param description: Description for the LAG."},{"line_number":132,"context_line":"    :param mode: switchport mode (\u0027access\u0027 or \u0027trunk\u0027)."},{"line_number":133,"context_line":"    :param native_vlan: VLAN ID to be set for the LAG."},{"line_number":134,"context_line":"    :param aggregation_mode: Aggregation mode (e.g., \u0027lacp\u0027, \u0027static\u0027)."},{"line_number":135,"context_line":"    :param allowed_vlans: List of allowed VLAN IDs to be added (optional)."}],"source_content_type":"text/x-python","patch_set":6,"id":"96c2e553_721d9d79","line":132,"in_reply_to":"370844c8_7c4019df","updated":"2025-12-16 13:23:44.000000000","message":"Sorry, must have gotten committed into the wrong patch.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    :param switch_ids: List of switch identifiers."},{"line_number":130,"context_line":"    :param lag_name: Name of the LAG."},{"line_number":131,"context_line":"    :param description: Description for the LAG."},{"line_number":132,"context_line":"    :param mode: switchport mode (\u0027access\u0027 or \u0027trunk\u0027)."},{"line_number":133,"context_line":"    :param native_vlan: VLAN ID to be set for the LAG."},{"line_number":134,"context_line":"    :param aggregation_mode: Aggregation mode (e.g., \u0027lacp\u0027, \u0027static\u0027)."},{"line_number":135,"context_line":"    :param allowed_vlans: List of allowed VLAN IDs to be added (optional)."}],"source_content_type":"text/x-python","patch_set":6,"id":"0dc1dccb_5da84aba","line":132,"in_reply_to":"370844c8_7c4019df","updated":"2025-12-16 13:23:44.000000000","message":"sorry, must have got committed into the wrong patch.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}],"ironic/networking/switch_drivers/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":"e23557f3c7a2f23ac120d5c3c756aaa6ab1cefe6","unresolved":true,"context_lines":[{"line_number":164,"context_line":"        \"\"\"Determine the device type for networking-generic-switch.\"\"\""},{"line_number":165,"context_line":"        # We require that the device_type be the generic switch entry point"},{"line_number":166,"context_line":"        # values in networking-generic-switch"},{"line_number":167,"context_line":"        return config.get(\"device_type\", \"netmiko_ovs_linux\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"139a31d0_b2c25efc","line":167,"updated":"2025-12-04 18:39:52.000000000","message":"This doesn\u0027t look like it gets extended later on.... Can we confirm?","commit_id":"ea5952b68b1703391920f1cb89c2b54c253cdb26"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"919f39ba106873a550872d917f3cb8e8d3eb6c8a","unresolved":true,"context_lines":[{"line_number":164,"context_line":"        \"\"\"Determine the device type for networking-generic-switch.\"\"\""},{"line_number":165,"context_line":"        # We require that the device_type be the generic switch entry point"},{"line_number":166,"context_line":"        # values in networking-generic-switch"},{"line_number":167,"context_line":"        return config.get(\"device_type\", \"netmiko_ovs_linux\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"24a8b999_4125cef2","line":167,"in_reply_to":"139a31d0_b2c25efc","updated":"2025-12-04 18:49:48.000000000","message":"\"extended\"?  ...by a subclass you mean?   No it wouldn\u0027t, this is a method specific to this subclass.   Just guessing here, but are you suggesting that this method is useless since it\u0027s just doing a .get() on a dict?  That\u0027s not wrong... was doing more in a previous iteration and I cleaned it up but I guess stopped short of removing it.","commit_id":"ea5952b68b1703391920f1cb89c2b54c253cdb26"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"dc24753e6efd0129484793795567d3005b70fafa","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        \"\"\"Determine the device type for networking-generic-switch.\"\"\""},{"line_number":165,"context_line":"        # We require that the device_type be the generic switch entry point"},{"line_number":166,"context_line":"        # values in networking-generic-switch"},{"line_number":167,"context_line":"        return config.get(\"device_type\", \"netmiko_ovs_linux\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"d189a0ff_59c3542a","line":167,"in_reply_to":"24a8b999_4125cef2","updated":"2025-12-04 21:09:28.000000000","message":"discussed on IRC... removing this method.","commit_id":"ea5952b68b1703391920f1cb89c2b54c253cdb26"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class GenericSwitchTranslator(BaseTranslator):"},{"line_number":91,"context_line":"    \"\"\"Translates generic config to networking-generic-switch format.\"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _get_section_name(self, switch_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"0e9374de_96a7c3d7","line":90,"updated":"2025-12-09 16:17:27.000000000","message":"This class is not in the same place as the n-g-s driver because it runs in the conductor context, not ironic-networking? Otherwise, I\u0027d expect it to be in the same module.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"class GenericSwitchTranslator(BaseTranslator):"},{"line_number":91,"context_line":"    \"\"\"Translates generic config to networking-generic-switch format.\"\"\""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _get_section_name(self, switch_name):"}],"source_content_type":"text/x-python","patch_set":6,"id":"f461ed3d_049cb166","line":90,"in_reply_to":"0e9374de_96a7c3d7","updated":"2025-12-16 13:23:44.000000000","message":"Ok, I moved this to be in the generic_switch.py file, but also thought I should clean this up a bit and move BaseTranslator.py into the base.py of the switch module to align it better.   That, of course, snowballed into a bigger change so I decided to move the base stuff into its own commit and keep just the generic-switch related stuff in this commit!","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}],"test-requirements.txt":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"792aeb378956a19586494a42d9db1ef13e4b603f","unresolved":true,"context_lines":[{"line_number":11,"context_line":"pyasn1\u003e\u003d0.5.1 # BSD"},{"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"}],"source_content_type":"text/plain","patch_set":6,"id":"47823d33_2b53c52f","line":14,"updated":"2025-12-09 16:17:27.000000000","message":"Can this addition be avoided, e.g. by mocking everything inside n-g-s? See existing patterns for out of tree drivers (I think we still have iRMC left).\n\nN-g-s still pulls in the entire Neutron.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"225a43427f2a31007d205f3ce7835b789dd6a683","unresolved":false,"context_lines":[{"line_number":11,"context_line":"pyasn1\u003e\u003d0.5.1 # BSD"},{"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"}],"source_content_type":"text/plain","patch_set":6,"id":"9f14b24c_e8e0b2bf","line":14,"in_reply_to":"47823d33_2b53c52f","updated":"2025-12-16 13:23:44.000000000","message":"I read this a few times and wasn\u0027t 100% certain what you were asking for. ...gave your comment to Claude verbatim and it seems to have understood perfectly. ;) ...but it required a bit of re-structuring and some cleanup.","commit_id":"236743574951da574d2be5a801e20a797c6dae43"}]}
