)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"119f9b678dcec550a9cd39a02389787b3ec43f8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"44b7ea8f_7be8f9b7","updated":"2026-04-17 01:01:00.000000000","message":"recheck ironic devstack plugin fixed","commit_id":"a8a5c8fcb33fc4cdac80f0506c33c4081e94f447"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2ad5fb6dbb48e3fca8ddefc6fc9d51cc14fb1e20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"96a59170_8170663c","updated":"2026-05-04 15:53:32.000000000","message":"Did a full restore, and took a different approach. Existing pattern prior to 2026 was to log first, then raise exception. This change now follow that pattern.","commit_id":"62c545db23b268a43a8cfd28773628851d11ff07"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"57be40425b7b5ea2cb23a40587046ce6ac29fc1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"53851703_61d8134e","updated":"2026-05-06 13:55:27.000000000","message":"recheck\n\nCI glance image upload issue, should be resolved.","commit_id":"62c545db23b268a43a8cfd28773628851d11ff07"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"dd74896504f911284b10074388356b63ce16cb44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"bbd19dbd_0770e685","updated":"2026-05-07 01:24:22.000000000","message":"I didn’t mean revert it. I meant we should be consistent. I think throwing the error with details might actually be better since it’ll be easier to track what’s wrong.","commit_id":"55b12bfd3a1c30cb068465c091adcb35729e4309"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5e9bcde9a87c753632da57926e67c0ad156f236c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4a19b04d_c9151262","in_reply_to":"230f78c1_2502ae7b","updated":"2026-05-13 00:42:58.000000000","message":"I am ok with it, yet the associated bug description needs an update to reflect what is addressed in this patch.","commit_id":"55b12bfd3a1c30cb068465c091adcb35729e4309"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"b9e74e264b50358840e0d347d7e8ac372f7d69a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"230f78c1_2502ae7b","in_reply_to":"2a54977f_2d0b2b68","updated":"2026-05-12 14:12:32.000000000","message":"Ah good point.","commit_id":"55b12bfd3a1c30cb068465c091adcb35729e4309"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"02c040a36b1e4ec09bb584dc76ce3c8f3fca0f2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2a54977f_2d0b2b68","in_reply_to":"bbd19dbd_0770e685","updated":"2026-05-12 12:12:27.000000000","message":"I think we should keep this as is, see: https://bugs.launchpad.net/networking-generic-switch/+bug/2100566 - The exception is deliberately without details because there is a risk of exposing sensitive information to the user? Hence the pattern of log for operator, and raise exception with instructions to contact cloud operator?","commit_id":"55b12bfd3a1c30cb068465c091adcb35729e4309"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"89e3638be1c7923e6331e11ae1dc9c2d042e6501","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"934834b7_a8e6fef6","updated":"2026-05-13 09:54:43.000000000","message":"recheck","commit_id":"fbb8f60d01f8a415ad2057dd43e5107680ef2acf"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"53121a0321880f14b3af4b7dfde31963e2d50179","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9c2fa9d1_8066aec9","updated":"2026-05-12 19:36:57.000000000","message":"recheck","commit_id":"fbb8f60d01f8a415ad2057dd43e5107680ef2acf"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"8ca2a5138d48a50b176a8c2b65061eacb6912b4e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b8811982_00404bea","updated":"2026-05-15 11:21:32.000000000","message":"recheck","commit_id":"fbb8f60d01f8a415ad2057dd43e5107680ef2acf"}],"networking_generic_switch/devices/netmiko_devices/__init__.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                    raise exc.GenericSwitchNetmikoConfigError("},{"line_number":221,"context_line":"                        switch\u003dself.config.get(\u0027host\u0027, \u0027unknown\u0027),"},{"line_number":222,"context_line":"                        error\u003df\"Invalid value \u0027{value}\u0027 for {key}; \""},{"line_number":223,"context_line":"                              f\"expected {expected_type.__name__}\")"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.lock_kwargs \u003d {"},{"line_number":226,"context_line":"            \u0027locks_pool_size\u0027: int(self.ngs_config[\u0027ngs_max_connections\u0027]),"}],"source_content_type":"text/x-python","patch_set":2,"id":"b54505a7_81c8873c","line":223,"updated":"2026-05-02 03:35:46.000000000","message":"So we log the error and create a message above. And then create the message again. You\u0027re saying the data is lost and people don\u0027t see it so are these log messages not worth it?\n\nAdditionally I think all these sites should do raise exc.GenericSwitchNetmikoConfigError(...) from e\n\nso that when you process the exception you have the full chain.","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"b3afb6851d28e611f4d874a7601b65efd9b21a85","unresolved":true,"context_lines":[{"line_number":220,"context_line":"                    raise exc.GenericSwitchNetmikoConfigError("},{"line_number":221,"context_line":"                        switch\u003dself.config.get(\u0027host\u0027, \u0027unknown\u0027),"},{"line_number":222,"context_line":"                        error\u003df\"Invalid value \u0027{value}\u0027 for {key}; \""},{"line_number":223,"context_line":"                              f\"expected {expected_type.__name__}\")"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"        self.lock_kwargs \u003d {"},{"line_number":226,"context_line":"            \u0027locks_pool_size\u0027: int(self.ngs_config[\u0027ngs_max_connections\u0027]),"}],"source_content_type":"text/x-python","patch_set":2,"id":"65b8bffb_566d0283","line":223,"in_reply_to":"b54505a7_81c8873c","updated":"2026-05-04 15:15:09.000000000","message":"We raise this error in other places, for example [1] and [2], and no logging happens before raising. From what I can tell, prior to the L2VNI work the exception was only raised without arguments, and the actual error was logged before raising GenericSwitchNetmikoConfigError with no arguments.\n\nI will re-work this change to follow the existing pattern of logging then raising in the recent L2VNI code.\n\n\n[1] https://opendev.org/openstack/networking-generic-switch/src/branch/master/networking_generic_switch/devices/netmiko_devices/arista.py#L289-L293\n[2] https://opendev.org/openstack/networking-generic-switch/src/branch/master/networking_generic_switch/devices/netmiko_devices/sonic.py#L525-L535","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"}],"networking_generic_switch/devices/netmiko_devices/cumulus.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":273,"context_line":"                    \"Expected \u0027physnet1:ip1,ip2;physnet2:ip3,ip4\u0027, got: \""},{"line_number":274,"context_line":"                    \"\u0027%s\u0027. Error: %s\","},{"line_number":275,"context_line":"                    self.physnet_her_flood, e)"},{"line_number":276,"context_line":"                from networking_generic_switch import exceptions as exc"},{"line_number":277,"context_line":"                raise exc.GenericSwitchNetmikoConfigError("},{"line_number":278,"context_line":"                    switch\u003ddevice_cfg.get(\u0027host\u0027, \u0027unknown\u0027),"},{"line_number":279,"context_line":"                    error\u003df\"Invalid ngs_physnet_her_flood format: {e}\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"d4d47ec7_bddb1ec2","line":276,"updated":"2026-05-02 03:35:46.000000000","message":"Should we move this to the top?","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"2ad5fb6dbb48e3fca8ddefc6fc9d51cc14fb1e20","unresolved":false,"context_lines":[{"line_number":273,"context_line":"                    \"Expected \u0027physnet1:ip1,ip2;physnet2:ip3,ip4\u0027, got: \""},{"line_number":274,"context_line":"                    \"\u0027%s\u0027. Error: %s\","},{"line_number":275,"context_line":"                    self.physnet_her_flood, e)"},{"line_number":276,"context_line":"                from networking_generic_switch import exceptions as exc"},{"line_number":277,"context_line":"                raise exc.GenericSwitchNetmikoConfigError("},{"line_number":278,"context_line":"                    switch\u003ddevice_cfg.get(\u0027host\u0027, \u0027unknown\u0027),"},{"line_number":279,"context_line":"                    error\u003df\"Invalid ngs_physnet_her_flood format: {e}\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e5e78b2_3ac043b6","line":276,"in_reply_to":"d4d47ec7_bddb1ec2","updated":"2026-05-04 15:53:32.000000000","message":"Done","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":276,"context_line":"                from networking_generic_switch import exceptions as exc"},{"line_number":277,"context_line":"                raise exc.GenericSwitchNetmikoConfigError("},{"line_number":278,"context_line":"                    switch\u003ddevice_cfg.get(\u0027host\u0027, \u0027unknown\u0027),"},{"line_number":279,"context_line":"                    error\u003df\"Invalid ngs_physnet_her_flood format: {e}\")"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        super(CumulusNVUE, self).__init__(device_cfg, *args, **kwargs)"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"d4cd7a4c_fbdeb588","line":279,"updated":"2026-05-02 03:35:46.000000000","message":"The other place you took a format error you formatted it but here you just string-ify it?\n\nThis should be \"from e\"","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"}],"networking_generic_switch/devices/netmiko_devices/juniper.py":[{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"5bb92fc09e997764e868875337825a30c7982ebd","unresolved":true,"context_lines":[{"line_number":209,"context_line":"                        \u0027device\u0027: device_utils.sanitise_config(self.config),"},{"line_number":210,"context_line":"                        \u0027error\u0027: e}"},{"line_number":211,"context_line":"            LOG.error(msg)"},{"line_number":212,"context_line":"            raise exc.GenericSwitchNetmikoConfigError("},{"line_number":213,"context_line":"                switch\u003dself.device_name,"},{"line_number":214,"context_line":"                error\u003df\"DB lock timeout: {e}\")"},{"line_number":215,"context_line":"        except (WarningStmtNotExist, WarningStmtExists) as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfc37868_ed4fe36d","line":212,"updated":"2026-04-28 01:12:11.000000000","message":"we already generated error message for logging, so why not just pass the result to the exception?","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":209,"context_line":"                        \u0027device\u0027: device_utils.sanitise_config(self.config),"},{"line_number":210,"context_line":"                        \u0027error\u0027: e}"},{"line_number":211,"context_line":"            LOG.error(msg)"},{"line_number":212,"context_line":"            raise exc.GenericSwitchNetmikoConfigError("},{"line_number":213,"context_line":"                switch\u003dself.device_name,"},{"line_number":214,"context_line":"                error\u003df\"DB lock timeout: {e}\")"},{"line_number":215,"context_line":"        except (WarningStmtNotExist, WarningStmtExists) as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f10ce96_4c5ec633","line":212,"in_reply_to":"bfc37868_ed4fe36d","updated":"2026-05-02 03:35:46.000000000","message":"Agreed","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":211,"context_line":"            LOG.error(msg)"},{"line_number":212,"context_line":"            raise exc.GenericSwitchNetmikoConfigError("},{"line_number":213,"context_line":"                switch\u003dself.device_name,"},{"line_number":214,"context_line":"                error\u003df\"DB lock timeout: {e}\")"},{"line_number":215,"context_line":"        except (WarningStmtNotExist, WarningStmtExists) as e:"},{"line_number":216,"context_line":"            msg \u003d _(\"Reached timeout while attempting to apply \""},{"line_number":217,"context_line":"                    \"configuration. This is likely to be caused by multiple \""}],"source_content_type":"text/x-python","patch_set":2,"id":"a6cb30d0_f9f8cebd","line":214,"updated":"2026-05-02 03:35:46.000000000","message":"```suggestion\n                error\u003df\"DB lock timeout: {e}\") from e\n```","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":222,"context_line":"            LOG.error(msg)"},{"line_number":223,"context_line":"            raise exc.GenericSwitchNetmikoConfigError("},{"line_number":224,"context_line":"                switch\u003dself.device_name,"},{"line_number":225,"context_line":"                error\u003df\"Concurrent configuration conflict: {e}\")"},{"line_number":226,"context_line":"        except ValueError as e:"},{"line_number":227,"context_line":"            msg \u003d _(\"Failed to commit configuration: Device: %(device)s, \""},{"line_number":228,"context_line":"                    \"error: %(error)s\") % {"}],"source_content_type":"text/x-python","patch_set":2,"id":"e3fe8605_54221855","line":225,"updated":"2026-05-02 03:35:46.000000000","message":"```suggestion\n                error\u003df\"Concurrent configuration conflict: {e}\") from e\n```\n\nAgain the error log is teh detailed stuff","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"74b5c6023ed32930cc522b48a9fc2aec5799acb6","unresolved":true,"context_lines":[{"line_number":231,"context_line":"            LOG.error(msg)"},{"line_number":232,"context_line":"            raise exc.GenericSwitchNetmikoConfigError("},{"line_number":233,"context_line":"                switch\u003dself.device_name,"},{"line_number":234,"context_line":"                error\u003df\"Failed to commit: {e}\")"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _get_vlan_name_by_id(self, segmentation_id: int) -\u003e str:"},{"line_number":237,"context_line":"        \"\"\"Get VLAN name from segmentation ID by querying the switch."}],"source_content_type":"text/x-python","patch_set":2,"id":"d0e745b0_15ded1dc","line":234,"updated":"2026-05-02 03:35:46.000000000","message":"```suggestion\n                error\u003df\"Failed to commit: {e}\") from e\n```\n\nthe message again to log is detailed","commit_id":"7327eee5ade7b4449c6a824f3416db57eadc29b3"}]}
