)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"276eaab6_2a702fae","updated":"2025-11-14 20:31:19.000000000","message":"Comments addressed.  Some questions are open and need reply.","commit_id":"e7ef8a7bb2b59094403d4894e3666d9c644be0af"},{"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":"eb92fa726573b8b600fce67a89d390ba6e66a3f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d7ef8eaa_ca7fbb13","updated":"2025-11-29 18:54:39.000000000","message":"LGTM","commit_id":"300b48ccc98ea15fb25125e5ddffe64146b2bde8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"790b75c794e582addc5491bb9ea75cf3832fce4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8dec64f5_4f83f1c8","updated":"2025-11-27 16:41:52.000000000","message":"comments addressed, PTAL","commit_id":"300b48ccc98ea15fb25125e5ddffe64146b2bde8"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"40857a06d2958ef54c80ef900e7255534dc08e3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"2d713176_af57f507","updated":"2025-12-02 17:43:39.000000000","message":"lgtm","commit_id":"300b48ccc98ea15fb25125e5ddffe64146b2bde8"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"f82974d9779bad8dd4c3b415141457ba90473b52","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fe45082c_7700ee68","updated":"2025-12-01 12:29:02.000000000","message":"recheck","commit_id":"300b48ccc98ea15fb25125e5ddffe64146b2bde8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c2e98f6d_b33c5cd9","updated":"2025-12-09 16:06:36.000000000","message":"A bunch of comments/questions. I\u0027m especially worried about silencing errors in drivers when fetching switches.\n\nNot blocking the patch to allow the work to continue, but please do consider following up.","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"7b98cb4c_c165cb39","updated":"2025-12-09 18:32:39.000000000","message":"Thanks.  These smaller comments will be addressed in a future change request.","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"}],"ironic/networking/manager.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":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        # Initialize switch driver factory (will be set properly in init_host)"},{"line_number":208,"context_line":"        self._switch_driver_factory \u003d None"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _get_switch_lock(self, switch_id):"},{"line_number":211,"context_line":"        \"\"\"Get or create a lock for the specified switch."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        :param switch_id: Identifier of the switch"},{"line_number":214,"context_line":"        :returns: Threading lock for the switch"},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        with self._lock_manager_lock:"},{"line_number":217,"context_line":"            if switch_id not in self._switch_locks:"},{"line_number":218,"context_line":"                self._switch_locks[switch_id] \u003d threading.Lock()"},{"line_number":219,"context_line":"            return self._switch_locks[switch_id]"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def _should_serialize_switch_operations(self, switch_id):"},{"line_number":222,"context_line":"        \"\"\"Determine if operations should be serialized for the given switch."}],"source_content_type":"text/x-python","patch_set":1,"id":"739c7cb1_0b8691a9","line":219,"range":{"start_line":209,"start_character":0,"end_line":219,"end_character":48},"updated":"2025-11-11 18:18:59.000000000","message":"Just thinking outloud here, should we continue a model of device locking when some (most modern) switches are now supporting multi-user concurrent actions? I guess it makes sense in the framing though.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"790b75c794e582addc5491bb9ea75cf3832fce4c","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        # Initialize switch driver factory (will be set properly in init_host)"},{"line_number":208,"context_line":"        self._switch_driver_factory \u003d None"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _get_switch_lock(self, switch_id):"},{"line_number":211,"context_line":"        \"\"\"Get or create a lock for the specified switch."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        :param switch_id: Identifier of the switch"},{"line_number":214,"context_line":"        :returns: Threading lock for the switch"},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        with self._lock_manager_lock:"},{"line_number":217,"context_line":"            if switch_id not in self._switch_locks:"},{"line_number":218,"context_line":"                self._switch_locks[switch_id] \u003d threading.Lock()"},{"line_number":219,"context_line":"            return self._switch_locks[switch_id]"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def _should_serialize_switch_operations(self, switch_id):"},{"line_number":222,"context_line":"        \"\"\"Determine if operations should be serialized for the given switch."}],"source_content_type":"text/x-python","patch_set":1,"id":"17aa292b_267c397e","line":219,"range":{"start_line":209,"start_character":0,"end_line":219,"end_character":48},"in_reply_to":"6602c1c8_f74f2e1c","updated":"2025-11-27 16:41:52.000000000","message":"Removed","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":true,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        # Initialize switch driver factory (will be set properly in init_host)"},{"line_number":208,"context_line":"        self._switch_driver_factory \u003d None"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _get_switch_lock(self, switch_id):"},{"line_number":211,"context_line":"        \"\"\"Get or create a lock for the specified switch."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        :param switch_id: Identifier of the switch"},{"line_number":214,"context_line":"        :returns: Threading lock for the switch"},{"line_number":215,"context_line":"        \"\"\""},{"line_number":216,"context_line":"        with self._lock_manager_lock:"},{"line_number":217,"context_line":"            if switch_id not in self._switch_locks:"},{"line_number":218,"context_line":"                self._switch_locks[switch_id] \u003d threading.Lock()"},{"line_number":219,"context_line":"            return self._switch_locks[switch_id]"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    def _should_serialize_switch_operations(self, switch_id):"},{"line_number":222,"context_line":"        \"\"\"Determine if operations should be serialized for the given switch."}],"source_content_type":"text/x-python","patch_set":1,"id":"6602c1c8_f74f2e1c","line":219,"range":{"start_line":209,"start_character":0,"end_line":219,"end_character":48},"in_reply_to":"739c7cb1_0b8691a9","updated":"2025-11-14 20:31:19.000000000","message":"I agree that it may be a bit overkill.  I can take it out if you prefer.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":280,"context_line":"            count \u003d self._driver_adapter.preprocess_config("},{"line_number":281,"context_line":"                _get_switch_config_filename()"},{"line_number":282,"context_line":"            )"},{"line_number":283,"context_line":"            LOG.info("},{"line_number":284,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":285,"context_line":"            )"},{"line_number":286,"context_line":"        except Exception as e:"},{"line_number":287,"context_line":"            LOG.warning(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":288,"context_line":"            raise e"}],"source_content_type":"text/x-python","patch_set":1,"id":"3204a6c8_0d4580d6","line":285,"range":{"start_line":283,"start_character":0,"end_line":285,"end_character":13},"updated":"2025-11-11 18:18:59.000000000","message":"Nit-ey Question: Does it really make sense to log at 274, and 283?","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            count \u003d self._driver_adapter.preprocess_config("},{"line_number":281,"context_line":"                _get_switch_config_filename()"},{"line_number":282,"context_line":"            )"},{"line_number":283,"context_line":"            LOG.info("},{"line_number":284,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":285,"context_line":"            )"},{"line_number":286,"context_line":"        except Exception as e:"},{"line_number":287,"context_line":"            LOG.warning(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":288,"context_line":"            raise e"}],"source_content_type":"text/x-python","patch_set":1,"id":"d1a64c55_d3136e5b","line":285,"range":{"start_line":283,"start_character":0,"end_line":285,"end_character":13},"in_reply_to":"3204a6c8_0d4580d6","updated":"2025-11-14 20:31:19.000000000","message":"I found it helpful to log the beginning of the init and then any major steps along the way.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"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":"8d5c6a4fd53a70ab39db06f07a1d801eeb9bce3c","unresolved":true,"context_lines":[{"line_number":284,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":285,"context_line":"            )"},{"line_number":286,"context_line":"        except Exception as e:"},{"line_number":287,"context_line":"            LOG.warning(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":288,"context_line":"            raise e"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        # Initialize switch driver factory"}],"source_content_type":"text/x-python","patch_set":1,"id":"c2b227c6_2aff40a0","line":287,"range":{"start_line":287,"start_character":0,"end_line":287,"end_character":69},"updated":"2025-11-11 14:45:42.000000000","message":"Use LOG.error since this is fatal","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":285,"context_line":"            )"},{"line_number":286,"context_line":"        except Exception as e:"},{"line_number":287,"context_line":"            LOG.warning(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":288,"context_line":"            raise e"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        # Initialize switch driver factory"}],"source_content_type":"text/x-python","patch_set":1,"id":"fb131d52_9fdcfeb4","line":287,"range":{"start_line":287,"start_character":0,"end_line":287,"end_character":69},"in_reply_to":"bd4c6e33_28df2d32","updated":"2025-11-14 20:31:19.000000000","message":"Done","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":284,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":285,"context_line":"            )"},{"line_number":286,"context_line":"        except Exception as e:"},{"line_number":287,"context_line":"            LOG.warning(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":288,"context_line":"            raise e"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        # Initialize switch driver factory"}],"source_content_type":"text/x-python","patch_set":1,"id":"bd4c6e33_28df2d32","line":287,"range":{"start_line":287,"start_character":0,"end_line":287,"end_character":69},"in_reply_to":"c2b227c6_2aff40a0","updated":"2025-11-11 18:18:59.000000000","message":"I concur.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":465,"context_line":"                _(\"mode must be one of: %s\") % \", \".join(valid_modes)"},{"line_number":466,"context_line":"            )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        # Validate VLAN ID"},{"line_number":469,"context_line":"        if ("},{"line_number":470,"context_line":"            not isinstance(native_vlan, int)"},{"line_number":471,"context_line":"            or native_vlan \u003c 1"},{"line_number":472,"context_line":"            or native_vlan \u003e 4094"},{"line_number":473,"context_line":"        ):"},{"line_number":474,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":475,"context_line":"                _(\"native_vlan must be an integer between 1 and 4094\")"},{"line_number":476,"context_line":"            )"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        # Validate allowed_vlans if provided"},{"line_number":479,"context_line":"        if allowed_vlans is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"731905d0_7b0c9e02","line":476,"range":{"start_line":468,"start_character":0,"end_line":476,"end_character":13},"updated":"2025-11-11 18:18:59.000000000","message":"We should likely enable switch level or driver level settings to accept and handle the bounds checking elsewhere. Given some switches have varying ranges and providing early feedback is likely best.\n\nAdding a TODO note is likely for the best here.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ee0244d0bdd01a854a23d009ddef75fde04a72d5","unresolved":true,"context_lines":[{"line_number":465,"context_line":"                _(\"mode must be one of: %s\") % \", \".join(valid_modes)"},{"line_number":466,"context_line":"            )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        # Validate VLAN ID"},{"line_number":469,"context_line":"        if ("},{"line_number":470,"context_line":"            not isinstance(native_vlan, int)"},{"line_number":471,"context_line":"            or native_vlan \u003c 1"},{"line_number":472,"context_line":"            or native_vlan \u003e 4094"},{"line_number":473,"context_line":"        ):"},{"line_number":474,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":475,"context_line":"                _(\"native_vlan must be an integer between 1 and 4094\")"},{"line_number":476,"context_line":"            )"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        # Validate allowed_vlans if provided"},{"line_number":479,"context_line":"        if allowed_vlans is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c4954749_adf432b5","line":476,"range":{"start_line":468,"start_character":0,"end_line":476,"end_character":13},"in_reply_to":"4960af2f_6bdf69c3","updated":"2025-11-21 18:46:57.000000000","message":"I\u0027m just suspecting that in any multi-switch environment, individual switches will have specific bounds available. For example, Cisco switches can\u0027t leverage 3968 to 4095. Aruba restricts 4041-4094. Dell Enterprise SONiC reserves 3967 - 4094.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":true,"context_lines":[{"line_number":465,"context_line":"                _(\"mode must be one of: %s\") % \", \".join(valid_modes)"},{"line_number":466,"context_line":"            )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        # Validate VLAN ID"},{"line_number":469,"context_line":"        if ("},{"line_number":470,"context_line":"            not isinstance(native_vlan, int)"},{"line_number":471,"context_line":"            or native_vlan \u003c 1"},{"line_number":472,"context_line":"            or native_vlan \u003e 4094"},{"line_number":473,"context_line":"        ):"},{"line_number":474,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":475,"context_line":"                _(\"native_vlan must be an integer between 1 and 4094\")"},{"line_number":476,"context_line":"            )"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        # Validate allowed_vlans if provided"},{"line_number":479,"context_line":"        if allowed_vlans is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4960af2f_6bdf69c3","line":476,"range":{"start_line":468,"start_character":0,"end_line":476,"end_character":13},"in_reply_to":"731905d0_7b0c9e02","updated":"2025-11-14 20:31:19.000000000","message":"Not sure I understand what you are asking for here.  You want this bounds checking removed in favor of the switch or driver doing it on its own?","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"790b75c794e582addc5491bb9ea75cf3832fce4c","unresolved":false,"context_lines":[{"line_number":465,"context_line":"                _(\"mode must be one of: %s\") % \", \".join(valid_modes)"},{"line_number":466,"context_line":"            )"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"        # Validate VLAN ID"},{"line_number":469,"context_line":"        if ("},{"line_number":470,"context_line":"            not isinstance(native_vlan, int)"},{"line_number":471,"context_line":"            or native_vlan \u003c 1"},{"line_number":472,"context_line":"            or native_vlan \u003e 4094"},{"line_number":473,"context_line":"        ):"},{"line_number":474,"context_line":"            raise exception.InvalidParameterValue("},{"line_number":475,"context_line":"                _(\"native_vlan must be an integer between 1 and 4094\")"},{"line_number":476,"context_line":"            )"},{"line_number":477,"context_line":""},{"line_number":478,"context_line":"        # Validate allowed_vlans if provided"},{"line_number":479,"context_line":"        if allowed_vlans is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4398e3b7_dd465283","line":476,"range":{"start_line":468,"start_character":0,"end_line":476,"end_character":13},"in_reply_to":"c4954749_adf432b5","updated":"2025-11-27 16:41:52.000000000","message":"I\u0027ve added the ability for a user to restrict the allowed vlan range on a per-switch basis.  This should cover off your concerns... I hope.  (I\u0027ve done this in the next path up... \"add generic switch support\" to do the mapping between ngs\u0027s format and this one.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":714,"context_line":"                            if switch_info:"},{"line_number":715,"context_line":"                                switches[switch_id] \u003d switch_info"},{"line_number":716,"context_line":"                        except Exception as e:"},{"line_number":717,"context_line":"                            LOG.warning("},{"line_number":718,"context_line":"                                \"Failed to get info for switch \""},{"line_number":719,"context_line":"                                \"%(switch)s from driver %(driver)s: \""},{"line_number":720,"context_line":"                                \"%(error)s\","}],"source_content_type":"text/x-python","patch_set":1,"id":"4d81f53f_dbde67cf","line":717,"updated":"2025-11-11 18:18:59.000000000","message":"Just wondering if we should instead log this as error. It seems like an error, but only as a warning may also not imply enough urgency to fix the base configuration issue.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                            if switch_info:"},{"line_number":715,"context_line":"                                switches[switch_id] \u003d switch_info"},{"line_number":716,"context_line":"                        except Exception as e:"},{"line_number":717,"context_line":"                            LOG.warning("},{"line_number":718,"context_line":"                                \"Failed to get info for switch \""},{"line_number":719,"context_line":"                                \"%(switch)s from driver %(driver)s: \""},{"line_number":720,"context_line":"                                \"%(error)s\","}],"source_content_type":"text/x-python","patch_set":1,"id":"1a92a59f_cd0e9cd1","line":717,"in_reply_to":"4d81f53f_dbde67cf","updated":"2025-11-14 20:31:19.000000000","message":"Agreed.  This is an unexpected s/w error.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f91ed0edaaa90318c376fc10ea7d1f298dc820ca","unresolved":true,"context_lines":[{"line_number":730,"context_line":"                        \"%(driver)s: %(error)s\","},{"line_number":731,"context_line":"                        {\"driver\": driver_name, \"error\": str(e)},"},{"line_number":732,"context_line":"                    )"},{"line_number":733,"context_line":"            except exception.DriverNotFound:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \"Driver %(driver)s not found\", {\"driver\": driver_name}"},{"line_number":736,"context_line":"                )"},{"line_number":737,"context_line":"            except Exception as e:"},{"line_number":738,"context_line":"                LOG.warning("},{"line_number":739,"context_line":"                    \"Error accessing driver %(driver)s: %(error)s\","},{"line_number":740,"context_line":"                    {\"driver\": driver_name, \"error\": str(e)},"},{"line_number":741,"context_line":"                )"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        LOG.info("},{"line_number":744,"context_line":"            \"Successfully retrieved %(count)d switch config sections\","}],"source_content_type":"text/x-python","patch_set":1,"id":"de969140_a85bdac2","line":741,"range":{"start_line":733,"start_character":0,"end_line":741,"end_character":17},"updated":"2025-11-11 18:18:59.000000000","message":"A few thoughts, and consider them nits so not requiring revision/change\n1) Are these really warnings, or errors?\n2) Are these exceptions only possible to come from line 708? If so, maybe move them up to wrap what we know will raise the exceptions if there is an issue.","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"02445d5c9cf4ed46affc2cbc29be8a032c02b1c1","unresolved":false,"context_lines":[{"line_number":730,"context_line":"                        \"%(driver)s: %(error)s\","},{"line_number":731,"context_line":"                        {\"driver\": driver_name, \"error\": str(e)},"},{"line_number":732,"context_line":"                    )"},{"line_number":733,"context_line":"            except exception.DriverNotFound:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \"Driver %(driver)s not found\", {\"driver\": driver_name}"},{"line_number":736,"context_line":"                )"},{"line_number":737,"context_line":"            except Exception as e:"},{"line_number":738,"context_line":"                LOG.warning("},{"line_number":739,"context_line":"                    \"Error accessing driver %(driver)s: %(error)s\","},{"line_number":740,"context_line":"                    {\"driver\": driver_name, \"error\": str(e)},"},{"line_number":741,"context_line":"                )"},{"line_number":742,"context_line":""},{"line_number":743,"context_line":"        LOG.info("},{"line_number":744,"context_line":"            \"Successfully retrieved %(count)d switch config sections\","}],"source_content_type":"text/x-python","patch_set":1,"id":"fe78aea4_db18ae2e","line":741,"range":{"start_line":733,"start_character":0,"end_line":741,"end_character":17},"in_reply_to":"de969140_a85bdac2","updated":"2025-11-14 20:31:19.000000000","message":"Done","commit_id":"dbf5c59a7a53634ac10b6667e06d64296c63ae1c"},{"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":"3b28b3714fb69081984baec2f97c7849ad363566","unresolved":true,"context_lines":[{"line_number":571,"context_line":"        :returns: Dictionary of switch_id -\u003e switch_info dictionaries"},{"line_number":572,"context_line":"        :raises: NetworkError if driver operations fail"},{"line_number":573,"context_line":"        \"\"\""},{"line_number":574,"context_line":"        LOG.info(\"RPC get_switches called\")"},{"line_number":575,"context_line":"        switches \u003d {}"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        if self._switch_driver_factory is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ebfad814_bdfb12ee","line":574,"updated":"2025-12-03 18:01:32.000000000","message":"This is a noisy thing to log at info every time, since it doesn\u0027t have specific information in it.","commit_id":"8bb35cbeb15ee96ae3473f8de7b4f7309d48c931"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"5cbc943878fd468e95d5b94316dbd4e5c88dece6","unresolved":true,"context_lines":[{"line_number":571,"context_line":"        :returns: Dictionary of switch_id -\u003e switch_info dictionaries"},{"line_number":572,"context_line":"        :raises: NetworkError if driver operations fail"},{"line_number":573,"context_line":"        \"\"\""},{"line_number":574,"context_line":"        LOG.info(\"RPC get_switches called\")"},{"line_number":575,"context_line":"        switches \u003d {}"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        if self._switch_driver_factory is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"f9a0ff47_3e949a72","line":574,"in_reply_to":"ebfad814_bdfb12ee","updated":"2025-12-03 18:16:07.000000000","message":"I\u0027ll add this to the list of minor changes to add from the previous commit and tack this on to the end of the chain if that\u0027s ok with you, @jay@jvf.cc?","commit_id":"8bb35cbeb15ee96ae3473f8de7b4f7309d48c931"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"81badb09852c013c0eb31cf1a6c21980148d8436","unresolved":false,"context_lines":[{"line_number":571,"context_line":"        :returns: Dictionary of switch_id -\u003e switch_info dictionaries"},{"line_number":572,"context_line":"        :raises: NetworkError if driver operations fail"},{"line_number":573,"context_line":"        \"\"\""},{"line_number":574,"context_line":"        LOG.info(\"RPC get_switches called\")"},{"line_number":575,"context_line":"        switches \u003d {}"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"        if self._switch_driver_factory is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"76e83bf8_b081c261","line":574,"in_reply_to":"f9a0ff47_3e949a72","updated":"2025-12-04 21:09:16.000000000","message":"had to respin another patch so figured i\u0027d do this one as well.  Fixed.","commit_id":"8bb35cbeb15ee96ae3473f8de7b4f7309d48c931"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def validate_vlan_configuration("},{"line_number":42,"context_line":"    switch_id_arg_name\u003d\"switch_id\", operation_description\u003d\"operation\""},{"line_number":43,"context_line":"):"},{"line_number":44,"context_line":"    \"\"\"Decorator to validate VLAN configuration against allowed/denied lists."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"6d4775f0_074acb63","line":42,"updated":"2025-12-09 16:06:36.000000000","message":"I wonder if operation_description should be made a mandatory argument","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def validate_vlan_configuration("},{"line_number":42,"context_line":"    switch_id_arg_name\u003d\"switch_id\", operation_description\u003d\"operation\""},{"line_number":43,"context_line":"):"},{"line_number":44,"context_line":"    \"\"\"Decorator to validate VLAN configuration against allowed/denied lists."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"cc6bab5c_2e814226","line":42,"in_reply_to":"6d4775f0_074acb63","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":84,"context_line":"                driver \u003d self._get_switch_driver(primary_switch_id)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"                # Build list of VLANs to check"},{"line_number":87,"context_line":"                vlans_to_check \u003d [native_vlan]"},{"line_number":88,"context_line":"                if allowed_vlans:"},{"line_number":89,"context_line":"                    vlans_to_check.extend(allowed_vlans)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e6a5f82b_e1f3fbc2","line":87,"updated":"2025-12-09 16:06:36.000000000","message":"Native VLAN can be None per line 69. I don\u0027t think it\u0027s a huge deal, but maybe avoid adding it to the list of it\u0027s None just for the correctness sake?\n\nWhat\u0027s the expected behavior when native_vlan\u003dNone and allowed_vlans\u003d[]? Not a thing that can happen? Expected to fail validation?","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                driver \u003d self._get_switch_driver(primary_switch_id)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"                # Build list of VLANs to check"},{"line_number":87,"context_line":"                vlans_to_check \u003d [native_vlan]"},{"line_number":88,"context_line":"                if allowed_vlans:"},{"line_number":89,"context_line":"                    vlans_to_check.extend(allowed_vlans)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"95a5f6c2_c33989a5","line":87,"in_reply_to":"e6a5f82b_e1f3fbc2","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":167,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":168,"context_line":"            )"},{"line_number":169,"context_line":"        except Exception as e:"},{"line_number":170,"context_line":"            LOG.error(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":171,"context_line":"            raise e"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # Initialize switch driver factory"}],"source_content_type":"text/x-python","patch_set":5,"id":"68f82099_cf086e12","line":170,"updated":"2025-12-09 16:06:36.000000000","message":"nit: maybe s/error/exception/ to print the traceback?","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                \"Generated %d driver-specific config files during init\", count"},{"line_number":168,"context_line":"            )"},{"line_number":169,"context_line":"        except Exception as e:"},{"line_number":170,"context_line":"            LOG.error(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":171,"context_line":"            raise e"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # Initialize switch driver factory"}],"source_content_type":"text/x-python","patch_set":5,"id":"a3d027c3_d171114f","line":170,"in_reply_to":"68f82099_cf086e12","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":168,"context_line":"            )"},{"line_number":169,"context_line":"        except Exception as e:"},{"line_number":170,"context_line":"            LOG.error(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":171,"context_line":"            raise e"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # Initialize switch driver factory"},{"line_number":174,"context_line":"        self._switch_driver_factory \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"5bc930d8_81404ff4","line":171,"updated":"2025-12-09 16:06:36.000000000","message":"nit: just `raise` (otherwise, you\u0027re losing the traceback)","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            )"},{"line_number":169,"context_line":"        except Exception as e:"},{"line_number":170,"context_line":"            LOG.error(\"Failed to initialize driver adapter: %s\", e)"},{"line_number":171,"context_line":"            raise e"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        # Initialize switch driver factory"},{"line_number":174,"context_line":"        self._switch_driver_factory \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"e097f15b_1f4e49a2","line":171,"in_reply_to":"5bc930d8_81404ff4","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":236,"context_line":"                    \"Error checking driver \u0027%s\u0027 for switch \u0027%s\u0027: %s\","},{"line_number":237,"context_line":"                    driver_name,"},{"line_number":238,"context_line":"                    switch_id,"},{"line_number":239,"context_line":"                    str(e),"},{"line_number":240,"context_line":"                )"},{"line_number":241,"context_line":"                continue"},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"61e9ed5b_80f1f012","line":239,"updated":"2025-12-09 16:06:36.000000000","message":"nit: str() unnecessary with %s","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                    \"Error checking driver \u0027%s\u0027 for switch \u0027%s\u0027: %s\","},{"line_number":237,"context_line":"                    driver_name,"},{"line_number":238,"context_line":"                    switch_id,"},{"line_number":239,"context_line":"                    str(e),"},{"line_number":240,"context_line":"                )"},{"line_number":241,"context_line":"                continue"},{"line_number":242,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"33783180_5e8c0c07","line":239,"in_reply_to":"61e9ed5b_80f1f012","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":336,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":337,"context_line":"        :returns: Dictionary containing the updated port configuration."},{"line_number":338,"context_line":"        \"\"\""},{"line_number":339,"context_line":"        LOG.info("},{"line_number":340,"context_line":"            \"RPC update_port called for switch %(switch)s, port %(port)s\","},{"line_number":341,"context_line":"            {\"switch\": switch_id, \"port\": port_name},"},{"line_number":342,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"b532ce2a_8073c1c3","line":339,"updated":"2025-12-09 16:06:36.000000000","message":"s/info/debug/","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":337,"context_line":"        :returns: Dictionary containing the updated port configuration."},{"line_number":338,"context_line":"        \"\"\""},{"line_number":339,"context_line":"        LOG.info("},{"line_number":340,"context_line":"            \"RPC update_port called for switch %(switch)s, port %(port)s\","},{"line_number":341,"context_line":"            {\"switch\": switch_id, \"port\": port_name},"},{"line_number":342,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a9b87b4_9c763c4e","line":339,"in_reply_to":"b532ce2a_8073c1c3","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":391,"context_line":"            # Re-raise NetworkError as-is"},{"line_number":392,"context_line":"            raise"},{"line_number":393,"context_line":"        except Exception as e:"},{"line_number":394,"context_line":"            LOG.error("},{"line_number":395,"context_line":"                \"Failed to configure port %(port)s on switch \""},{"line_number":396,"context_line":"                \"%(switch)s: %(error)s\","},{"line_number":397,"context_line":"                {\"port\": port_name, \"switch\": switch_id, \"error\": str(e)},"}],"source_content_type":"text/x-python","patch_set":5,"id":"7c15faec_7f5f99ab","line":394,"updated":"2025-12-09 16:06:36.000000000","message":"Since it\u0027s not an expected exception, maybe again s/error/exception/ ?","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":391,"context_line":"            # Re-raise NetworkError as-is"},{"line_number":392,"context_line":"            raise"},{"line_number":393,"context_line":"        except Exception as e:"},{"line_number":394,"context_line":"            LOG.error("},{"line_number":395,"context_line":"                \"Failed to configure port %(port)s on switch \""},{"line_number":396,"context_line":"                \"%(switch)s: %(error)s\","},{"line_number":397,"context_line":"                {\"port\": port_name, \"switch\": switch_id, \"error\": str(e)},"}],"source_content_type":"text/x-python","patch_set":5,"id":"75681e58_c3890891","line":394,"in_reply_to":"7c15faec_7f5f99ab","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":394,"context_line":"            LOG.error("},{"line_number":395,"context_line":"                \"Failed to configure port %(port)s on switch \""},{"line_number":396,"context_line":"                \"%(switch)s: %(error)s\","},{"line_number":397,"context_line":"                {\"port\": port_name, \"switch\": switch_id, \"error\": str(e)},"},{"line_number":398,"context_line":"            )"},{"line_number":399,"context_line":"            raise exception.NetworkError("},{"line_number":400,"context_line":"                _(\"Failed to configure network port: %s\") % str(e)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ca3d209c_85e9cd7e","line":397,"updated":"2025-12-09 16:06:36.000000000","message":"nit: str() redundant with %s (same below)","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":394,"context_line":"            LOG.error("},{"line_number":395,"context_line":"                \"Failed to configure port %(port)s on switch \""},{"line_number":396,"context_line":"                \"%(switch)s: %(error)s\","},{"line_number":397,"context_line":"                {\"port\": port_name, \"switch\": switch_id, \"error\": str(e)},"},{"line_number":398,"context_line":"            )"},{"line_number":399,"context_line":"            raise exception.NetworkError("},{"line_number":400,"context_line":"                _(\"Failed to configure network port: %s\") % str(e)"}],"source_content_type":"text/x-python","patch_set":5,"id":"d555d2b9_f1e32bc6","line":397,"in_reply_to":"ca3d209c_85e9cd7e","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":468,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":469,"context_line":"        :returns: Dictionary containing the reset port configuration."},{"line_number":470,"context_line":"        \"\"\""},{"line_number":471,"context_line":"        LOG.info("},{"line_number":472,"context_line":"            \"RPC reset_port called for switch %(switch)s, port %(port)s\","},{"line_number":473,"context_line":"            {\"switch\": switch_id, \"port\": port_name},"},{"line_number":474,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"8b73f27f_84a65de8","line":471,"updated":"2025-12-09 16:06:36.000000000","message":"s/info/debug/","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":469,"context_line":"        :returns: Dictionary containing the reset port configuration."},{"line_number":470,"context_line":"        \"\"\""},{"line_number":471,"context_line":"        LOG.info("},{"line_number":472,"context_line":"            \"RPC reset_port called for switch %(switch)s, port %(port)s\","},{"line_number":473,"context_line":"            {\"switch\": switch_id, \"port\": port_name},"},{"line_number":474,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"eb560398_e4d74cab","line":471,"in_reply_to":"8b73f27f_84a65de8","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":487,"context_line":"        except exception.SwitchNotFound:"},{"line_number":488,"context_line":"            # Re-raise SwitchNotFound as-is"},{"line_number":489,"context_line":"            raise"},{"line_number":490,"context_line":"        except Exception as e:"},{"line_number":491,"context_line":"            LOG.error("},{"line_number":492,"context_line":"                \"Failed to reset port %(port)s on switch \""},{"line_number":493,"context_line":"                \"%(switch)s: %(error)s\","}],"source_content_type":"text/x-python","patch_set":5,"id":"25f8f060_837671c2","line":490,"updated":"2025-12-09 16:06:36.000000000","message":"same comments here","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":487,"context_line":"        except exception.SwitchNotFound:"},{"line_number":488,"context_line":"            # Re-raise SwitchNotFound as-is"},{"line_number":489,"context_line":"            raise"},{"line_number":490,"context_line":"        except Exception as e:"},{"line_number":491,"context_line":"            LOG.error("},{"line_number":492,"context_line":"                \"Failed to reset port %(port)s on switch \""},{"line_number":493,"context_line":"                \"%(switch)s: %(error)s\","}],"source_content_type":"text/x-python","patch_set":5,"id":"49236d50_6f31197e","line":490,"in_reply_to":"25f8f060_837671c2","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        :param default_vlan: VLAN ID to restore onto the port (optional)."},{"line_number":534,"context_line":"        :raises: InvalidParameterValue if validation fails."},{"line_number":535,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":536,"context_line":"        :raises: NotImplemented - LAG is not yet supported."},{"line_number":537,"context_line":"        :returns: Dictionary containing the updated LAG configuration."},{"line_number":538,"context_line":"        \"\"\""},{"line_number":539,"context_line":"        raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":5,"id":"ebd0ff53_19a6e2d3","line":536,"updated":"2025-12-09 16:06:36.000000000","message":"You still raise Invalid, not NotImplemented (same below)","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        :param default_vlan: VLAN ID to restore onto the port (optional)."},{"line_number":534,"context_line":"        :raises: InvalidParameterValue if validation fails."},{"line_number":535,"context_line":"        :raises: NetworkError if the network operation fails."},{"line_number":536,"context_line":"        :raises: NotImplemented - LAG is not yet supported."},{"line_number":537,"context_line":"        :returns: Dictionary containing the updated LAG configuration."},{"line_number":538,"context_line":"        \"\"\""},{"line_number":539,"context_line":"        raise exception.Invalid("}],"source_content_type":"text/x-python","patch_set":5,"id":"113ad765_880a18cc","line":536,"in_reply_to":"ebd0ff53_19a6e2d3","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":586,"context_line":"            try:"},{"line_number":587,"context_line":"                driver \u003d self._switch_driver_factory.get_driver(driver_name)"},{"line_number":588,"context_line":"            except exception.DriverNotFound:"},{"line_number":589,"context_line":"                LOG.error(\"Driver %(driver)s not found\","},{"line_number":590,"context_line":"                          {\"driver\": driver_name})"},{"line_number":591,"context_line":"                continue"},{"line_number":592,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"4f40ffe0_056b9f25","line":589,"updated":"2025-12-09 16:06:36.000000000","message":"s/error/warning/ like on line 230 (since you don\u0027t fail the operation)","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":586,"context_line":"            try:"},{"line_number":587,"context_line":"                driver \u003d self._switch_driver_factory.get_driver(driver_name)"},{"line_number":588,"context_line":"            except exception.DriverNotFound:"},{"line_number":589,"context_line":"                LOG.error(\"Driver %(driver)s not found\","},{"line_number":590,"context_line":"                          {\"driver\": driver_name})"},{"line_number":591,"context_line":"                continue"},{"line_number":592,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":5,"id":"90580f08_39e68249","line":589,"in_reply_to":"4f40ffe0_056b9f25","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":590,"context_line":"                          {\"driver\": driver_name})"},{"line_number":591,"context_line":"                continue"},{"line_number":592,"context_line":"            except Exception as e:"},{"line_number":593,"context_line":"                LOG.error(\"Error accessing driver %(driver)s: %(error)s\","},{"line_number":594,"context_line":"                          {\"driver\": driver_name, \"error\": str(e)})"},{"line_number":595,"context_line":"                continue"},{"line_number":596,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"4b270295_204cef42","line":593,"updated":"2025-12-09 16:06:36.000000000","message":"Same here for the same reason","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":590,"context_line":"                          {\"driver\": driver_name})"},{"line_number":591,"context_line":"                continue"},{"line_number":592,"context_line":"            except Exception as e:"},{"line_number":593,"context_line":"                LOG.error(\"Error accessing driver %(driver)s: %(error)s\","},{"line_number":594,"context_line":"                          {\"driver\": driver_name, \"error\": str(e)})"},{"line_number":595,"context_line":"                continue"},{"line_number":596,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"f4b06b0d_35285ee6","line":593,"in_reply_to":"4b270295_204cef42","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":602,"context_line":"                        if switch_info:"},{"line_number":603,"context_line":"                            switches[switch_id] \u003d switch_info"},{"line_number":604,"context_line":"                    except Exception as e:"},{"line_number":605,"context_line":"                        LOG.error("},{"line_number":606,"context_line":"                            \"Failed to get info for switch \""},{"line_number":607,"context_line":"                            \"%(switch)s from driver %(driver)s: \""},{"line_number":608,"context_line":"                            \"%(error)s\","}],"source_content_type":"text/x-python","patch_set":5,"id":"7db788fe_b3882d19","line":605,"updated":"2025-12-09 16:06:36.000000000","message":"Same. Although... do we actually want to ignore this? What\u0027s the user story behind it, do I want to end up with an incomplete list?","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                        if switch_info:"},{"line_number":603,"context_line":"                            switches[switch_id] \u003d switch_info"},{"line_number":604,"context_line":"                    except Exception as e:"},{"line_number":605,"context_line":"                        LOG.error("},{"line_number":606,"context_line":"                            \"Failed to get info for switch \""},{"line_number":607,"context_line":"                            \"%(switch)s from driver %(driver)s: \""},{"line_number":608,"context_line":"                            \"%(error)s\","}],"source_content_type":"text/x-python","patch_set":5,"id":"d5fc1a6a_7ddf6e18","line":605,"in_reply_to":"7db788fe_b3882d19","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"569325024c34d6254e9a35ec4f0a21a291335e29","unresolved":true,"context_lines":[{"line_number":613,"context_line":"                            },"},{"line_number":614,"context_line":"                        )"},{"line_number":615,"context_line":"            except Exception as e:"},{"line_number":616,"context_line":"                LOG.warning(\"Failed to get switch IDs from driver \""},{"line_number":617,"context_line":"                            \"%(driver)s: %(error)s\","},{"line_number":618,"context_line":"                            {\"driver\": driver_name, \"error\": str(e)})"},{"line_number":619,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"a453dcf7_2b5c8f03","line":616,"updated":"2025-12-09 16:06:36.000000000","message":"I\u0027m also questioning returning an incomplete list here.","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"},{"author":{"_account_id":25437,"name":"Allain Legacy","email":"alegacy@redhat.com","username":"alegacy"},"change_message_id":"9283a3528c9c8e5ba98a03592f3fe20bf8d0c506","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                            },"},{"line_number":614,"context_line":"                        )"},{"line_number":615,"context_line":"            except Exception as e:"},{"line_number":616,"context_line":"                LOG.warning(\"Failed to get switch IDs from driver \""},{"line_number":617,"context_line":"                            \"%(driver)s: %(error)s\","},{"line_number":618,"context_line":"                            {\"driver\": driver_name, \"error\": str(e)})"},{"line_number":619,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2be92cf2_aba95bc5","line":616,"in_reply_to":"a453dcf7_2b5c8f03","updated":"2025-12-09 18:32:39.000000000","message":"Done","commit_id":"278cf5f963f68f810ae1a042c182923e42e54287"}]}
