)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d65b748ec7a0252c14e5a577c60289193d05e22d","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     lajoskatona \u003clajos.katona@est.tech\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-02-25 16:34:51 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Neutron: Move bgpvp osc client code from neutronclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id87a0e2ac7d3a038eac92e13cd36591534398b69"},{"line_number":10,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"8e95ed8f_d1a95510","line":7,"range":{"start_line":7,"start_character":14,"end_line":7,"end_character":19},"updated":"2026-02-25 15:45:09.000000000","message":"bgpvpn","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a30599805b93044b7673d1034d0f94c0af95a20e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     lajoskatona \u003clajos.katona@est.tech\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-02-25 16:34:51 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Neutron: Move bgpvp osc client code from neutronclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id87a0e2ac7d3a038eac92e13cd36591534398b69"},{"line_number":10,"context_line":"Signed-off-by: lajoskatona \u003clajos.katona@est.tech\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"98d71239_4d420396","line":7,"range":{"start_line":7,"start_character":14,"end_line":7,"end_character":19},"in_reply_to":"8e95ed8f_d1a95510","updated":"2026-03-04 10:03:22.000000000","message":"Done","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"08ca62af9c020563a6d8e3ed43e529df47e7fc6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"686821d1_cc851355","updated":"2026-02-25 15:43:40.000000000","message":"You need to add these command in `pyproject.toml`, ideally using a separate group. See https://review.opendev.org/c/openstack/python-openstackclient/+/970622 for an example.\n\nYou also need to ignore the previous entrypoint so that we only load a single command. See https://review.opendev.org/c/openstack/python-openstackclient/+/968178 for this.\n\nFinally, we should probably document these steps somewhere. I\u0027d be happy to do it in-tree or via an amendment to the neutron spec (if there is one). Could you take care of that?","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d519741b689414c72cc9f2ab067bd04508390989","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"898657b7_4e6ea1b5","in_reply_to":"686821d1_cc851355","updated":"2026-02-25 15:47:37.000000000","message":"Also can we call the directory (and the equivalent test directory) simply `bgpvpn`? That mirrors the naming in [SDK](https://github.com/openstack/openstacksdk/blob/master/openstack/network/v2/bgpvpn.py) and [Gophercloud](https://github.com/gophercloud/gophercloud/tree/main/openstack/networking/v2/extensions/bgpvpns) and is descriptive enough, IMO","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"31f0ad7bba7413dc65a2b5673b571031f58e0318","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d405ff09_0aa03b57","in_reply_to":"898657b7_4e6ea1b5","updated":"2026-03-03 19:44:06.000000000","message":"sure, tomorrow I hope I can push a new ps for it, thanks for checking.","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bb162e34c2b253c56a51655104ba80d5ebea18bc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e60db73e_d2b0f3b9","in_reply_to":"d405ff09_0aa03b57","updated":"2026-03-04 10:03:02.000000000","message":"I added doc/source/contributor/neutron-cli-migration.rst , hope this was what you missed to give guidance for coming migrations","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9a610cccc29d939b404f8b68ed724a9f6d470385","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8bc18ad9_269ffa23","in_reply_to":"e60db73e_d2b0f3b9","updated":"2026-03-06 15:25:55.000000000","message":"Acknowledged","commit_id":"fc335fc7efe0494054b4a287694e0cef32b2e999"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"15bfd0f7_75373f5a","updated":"2026-03-04 12:47:48.000000000","message":"Looking much more complete. Couple of new comments based on the changes.","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"193f87ae_7b681235","updated":"2026-03-06 16:07:37.000000000","message":"Looks like there are some valid failures to fix here. I also have some questions about the tests.","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c7c367d8_69de68bf","updated":"2026-03-09 18:16:18.000000000","message":"I apologise in advance for the amount of comments on this: as the easier stuff gets resolved, I\u0027m able to focus on the more nitty-gritty details. I promise I won\u0027t keep finding new things to comment on 😅","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f6a0ab8840315cd0c54f5687bc90b5eb9e960b61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"16ea77ea_c114da98","updated":"2026-04-08 15:11:40.000000000","message":"I\u0027m not sure if you are still working on this or consider it done. If the former, can you mark this as WIP? If the latter, there\u0027s a few comments that can and should be marked as `Resolved` but more that still need to be addressed","commit_id":"83733264182a48ba0eba7915b39acd6021d10d8e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"e06772c64b9be13cfa90e1dec0864cabf245a74a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"20c69239_859afba7","in_reply_to":"16ea77ea_c114da98","updated":"2026-04-13 11:49:57.000000000","message":"I will check them, I hope this week I will have again time to work on this topic.","commit_id":"83733264182a48ba0eba7915b39acd6021d10d8e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1f7222bc89d33b54691e1a1ca52f3178262c3762","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"80fdba97_8289a756","updated":"2026-04-15 17:06:22.000000000","message":"This is on my list to review. Hopefully by EOW. @katonalala@gmail.com in the interim could you mark any comments that you think you\u0027ve resolved as resolved, please?","commit_id":"86297933848839bc969c69ef5e2e2128864505c2"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"650ac7054a31485ce1bf932119d1a0eae7b2d49a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8b846bb0_c9927f85","updated":"2026-05-01 22:33:44.000000000","message":"Follow-up addressed my comments","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a4e64c15_0f88d7f6","updated":"2026-04-29 03:41:19.000000000","message":"I realize I have a lot of comments, but can maybe be addressed in a follow-on as most are related to project_id migration.","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3bae360ad6dac55c9a307ec8ba18e894632ec411","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"b76aea49_ed77dcee","updated":"2026-04-23 12:09:45.000000000","message":"I\u0027m pretty happy with this now. There\u0027s a few things I\u0027d still like to change, but those are achievable with follow-ups. I\u0027ll hold off for another round of reviews from neutron cores before we merge this.","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73632c0f7fc20f3767ae3a252a9705dc264471f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"07533bd3_95d2188a","updated":"2026-04-21 11:02:23.000000000","message":"Note that we\u0027ve merged some typing related changes now, but I don\u0027t think those should block this. They would be nice to fix in a follow-up though, if you\u0027ve time (I suspect claude/codex would make short work of it)","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"f103c0693e53ed8e7268052c0434c799fec5fd07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c5fb675f_0d20343e","in_reply_to":"a4e64c15_0f88d7f6","updated":"2026-04-29 11:22:22.000000000","message":"😃\nI check these. To tell the truth the project_id/tenant_id change in my mind exists in a quantum state somewhere between the 2 states","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1e8a358933642eea98022563e95421be23809564","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"62201fd4_4e38d2c1","in_reply_to":"c5fb675f_0d20343e","updated":"2026-04-29 15:51:24.000000000","message":"And to be fair, this is likely just a copy of the code that was in the other repo, so I would expect this. I\u0027d be fine with a follow-up.","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"doc/source/contributor/neutron-cli-migration.rst":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":1,"context_line":".. _neutron-cli-migration:"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":"Migrating Neutron CLI Commands to OSC"},{"line_number":5,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"This guide documents the process for migrating Neutron CLI commands from"},{"line_number":8,"context_line":"``python-neutronclient`` plugins into ``python-openstackclient``. This applies"},{"line_number":9,"context_line":"to special networking services that were previously implemented as external"},{"line_number":10,"context_line":"OSC plugins (e.g., BGP VPN, TaaS, etc.)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Background"},{"line_number":13,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"0fdadcda_d2fd8c6b","line":10,"range":{"start_line":2,"start_character":1,"end_line":10,"end_character":40},"updated":"2026-03-04 12:47:48.000000000","message":"Could we reframe this \"Migration project CLI commands to OSC\" with neutronclient being the worked example? I am also moving manilaclient commands in-tree and the pattern is broadly similar. tbh, I think you can just rename the file and say something like.\n\n\n\n\n```suggestion\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nMigrating Project Client OSC Plugins to OSC\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nThe guide documents the process for migrating project client OSC plugins from\nthe project client into ``python-openstackclient``. It focuses on neutron client\nand clients for special networking services that were previously implemented as\nexternal OSC plugins (e.g., BGP VPN, TaaS, etc.), but it should apply to any\nproject client\u0027s OSC plugin.\n```","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":true,"context_lines":[{"line_number":1,"context_line":".. _neutron-cli-migration:"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":"Migrating Neutron CLI Commands to OSC"},{"line_number":5,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"This guide documents the process for migrating Neutron CLI commands from"},{"line_number":8,"context_line":"``python-neutronclient`` plugins into ``python-openstackclient``. This applies"},{"line_number":9,"context_line":"to special networking services that were previously implemented as external"},{"line_number":10,"context_line":"OSC plugins (e.g., BGP VPN, TaaS, etc.)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Background"},{"line_number":13,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"66f72a12_343a0f17","line":10,"range":{"start_line":2,"start_character":1,"end_line":10,"end_character":40},"in_reply_to":"0fdadcda_d2fd8c6b","updated":"2026-03-06 14:14:06.000000000","message":"sounds better, I updated, thanks","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9a610cccc29d939b404f8b68ed724a9f6d470385","unresolved":false,"context_lines":[{"line_number":1,"context_line":".. _neutron-cli-migration:"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":"Migrating Neutron CLI Commands to OSC"},{"line_number":5,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"This guide documents the process for migrating Neutron CLI commands from"},{"line_number":8,"context_line":"``python-neutronclient`` plugins into ``python-openstackclient``. This applies"},{"line_number":9,"context_line":"to special networking services that were previously implemented as external"},{"line_number":10,"context_line":"OSC plugins (e.g., BGP VPN, TaaS, etc.)."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Background"},{"line_number":13,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"01dbc4a7_89e7df4a","line":10,"range":{"start_line":2,"start_character":1,"end_line":10,"end_character":40},"in_reply_to":"66f72a12_343a0f17","updated":"2026-03-06 15:25:55.000000000","message":"Acknowledged","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"04189bbe_8c34fbc8","updated":"2026-03-06 16:07:37.000000000","message":"Can we rename this file also? Something like `osc-plugin-migration`?","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"21cbae34_ca465f55","in_reply_to":"04189bbe_8c34fbc8","updated":"2026-03-09 15:46:50.000000000","message":"Done","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"}],"doc/source/contributor/osc-plugin-migration.rst":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":16,"context_line":"Historically, advanced Neutron services provided their CLI commands through"},{"line_number":17,"context_line":"``python-neutronclient`` as OSC plugins. As the old python-xclient libraries"},{"line_number":18,"context_line":"were deprecated and their functionality were moved to python-openstackclient"},{"line_number":19,"context_line":"these plugins were also decided to move to python-openstackclient, see the"},{"line_number":20,"context_line":"2025 October PTG etherpad:"},{"line_number":21,"context_line":"https://etherpad.opendev.org/p/oct2025-ptg-neutron#L156"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"33981cbe_2eb27dbb","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":42},"updated":"2026-04-29 03:41:19.000000000","message":"nit: s/it was also decided to move these plugins to","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Historically, advanced Neutron services provided their CLI commands through"},{"line_number":17,"context_line":"``python-neutronclient`` as OSC plugins. As the old python-xclient libraries"},{"line_number":18,"context_line":"were deprecated and their functionality were moved to python-openstackclient"},{"line_number":19,"context_line":"these plugins were also decided to move to python-openstackclient, see the"},{"line_number":20,"context_line":"2025 October PTG etherpad:"},{"line_number":21,"context_line":"https://etherpad.opendev.org/p/oct2025-ptg-neutron#L156"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"00a02416_56a15a32","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":42},"in_reply_to":"33981cbe_2eb27dbb","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":31,"context_line":"---------------------------------------"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Create a new python module under ``openstackclient/network/v2/`` for your"},{"line_number":34,"context_line":"service with apropriate name, for example for tap-as-a-service ``taas``."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"2. Migrate the Command Classes"},{"line_number":37,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"c414e732_aa3d0c99","line":34,"range":{"start_line":34,"start_character":13,"end_line":34,"end_character":23},"updated":"2026-04-29 03:41:19.000000000","message":"nit: s/appropriate","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"---------------------------------------"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Create a new python module under ``openstackclient/network/v2/`` for your"},{"line_number":34,"context_line":"service with apropriate name, for example for tap-as-a-service ``taas``."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"2. Migrate the Command Classes"},{"line_number":37,"context_line":"-------------------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"22e6098c_40801b28","line":34,"range":{"start_line":34,"start_character":13,"end_line":34,"end_character":23},"in_reply_to":"c414e732_aa3d0c99","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/network/v2/bgpvpn/bgpvpn.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":20,"context_line":"from osc_lib.cli import format_columns"},{"line_number":21,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":22,"context_line":"from osc_lib.cli.parseractions import KeyValueAction"},{"line_number":23,"context_line":"from osc_lib.command import command"},{"line_number":24,"context_line":"from osc_lib import exceptions"},{"line_number":25,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":26,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from openstackclient.i18n import _"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"12c998c5_91fce13c","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":34},"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\nfrom osc_lib import exceptions\nfrom osc_lib import utils as osc_utils\nfrom osc_lib.utils import columns as column_util\n\nfrom openstackclient import command\nfrom openstackclient.i18n import _\n```\n\nThis will resolve the type issues you are seeing below.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from osc_lib.cli import format_columns"},{"line_number":21,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":22,"context_line":"from osc_lib.cli.parseractions import KeyValueAction"},{"line_number":23,"context_line":"from osc_lib.command import command"},{"line_number":24,"context_line":"from osc_lib import exceptions"},{"line_number":25,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":26,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from openstackclient.i18n import _"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"92075927_8d912141","line":28,"range":{"start_line":23,"start_character":0,"end_line":28,"end_character":34},"in_reply_to":"12c998c5_91fce13c","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _get_common_parser(parser, update\u003dNone):"},{"line_number":71,"context_line":"    \"\"\"Adds to parser arguments common to create, set and unset commands."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    :params ArgumentParser parser: argparse object contains all command\u0027s"},{"line_number":74,"context_line":"                                   arguments"},{"line_number":75,"context_line":"    :params string update: Determines if it is a create command (value: None),"},{"line_number":76,"context_line":"                           it is a set command (value: \u0027set\u0027) or if it is an"},{"line_number":77,"context_line":"                           unset command (value: \u0027unset\u0027)"},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":"    ADD_RT \u003d _(\"Add Route Target to import/export list\")"},{"line_number":80,"context_line":"    REMOVE_RT \u003d _(\"Remove Route Target from import/export list\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"34a23928_9eace01f","line":77,"range":{"start_line":72,"start_character":1,"end_line":77,"end_character":57},"updated":"2026-03-09 18:16:18.000000000","message":"nit:\n\n```suggestion\n\n    :params ArgumentParser parser: argparse object contains all command\u0027s\n        arguments\n    :params string update: Determines if it is a create command (value: None),\n        it is a set command (value: \u0027set\u0027) or if it is an unset command (value:\n        \u0027unset\u0027)\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _get_common_parser(parser, update\u003dNone):"},{"line_number":71,"context_line":"    \"\"\"Adds to parser arguments common to create, set and unset commands."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    :params ArgumentParser parser: argparse object contains all command\u0027s"},{"line_number":74,"context_line":"                                   arguments"},{"line_number":75,"context_line":"    :params string update: Determines if it is a create command (value: None),"},{"line_number":76,"context_line":"                           it is a set command (value: \u0027set\u0027) or if it is an"},{"line_number":77,"context_line":"                           unset command (value: \u0027unset\u0027)"},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":"    ADD_RT \u003d _(\"Add Route Target to import/export list\")"},{"line_number":80,"context_line":"    REMOVE_RT \u003d _(\"Remove Route Target from import/export list\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"332d6176_737d8733","line":77,"range":{"start_line":72,"start_character":1,"end_line":77,"end_character":57},"in_reply_to":"34a23928_9eace01f","updated":"2026-04-21 16:05:00.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"def _get_common_parser(parser, update\u003dNone):"},{"line_number":71,"context_line":"    \"\"\"Adds to parser arguments common to create, set and unset commands."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    :params ArgumentParser parser: argparse object contains all command\u0027s"},{"line_number":74,"context_line":"                                   arguments"},{"line_number":75,"context_line":"    :params string update: Determines if it is a create command (value: None),"},{"line_number":76,"context_line":"                           it is a set command (value: \u0027set\u0027) or if it is an"},{"line_number":77,"context_line":"                           unset command (value: \u0027unset\u0027)"},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":"    ADD_RT \u003d _(\"Add Route Target to import/export list\")"},{"line_number":80,"context_line":"    REMOVE_RT \u003d _(\"Remove Route Target from import/export list\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"e569d8b7_41da7682","line":77,"range":{"start_line":72,"start_character":1,"end_line":77,"end_character":57},"in_reply_to":"34a23928_9eace01f","updated":"2026-04-21 16:05:00.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":283,"context_line":"        return parser"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def take_action(self, parsed_args):"},{"line_number":286,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":287,"context_line":"        attrs \u003d {}"},{"line_number":288,"context_line":"        if parsed_args.name is not None:"},{"line_number":289,"context_line":"            attrs[\u0027name\u0027] \u003d str(parsed_args.name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df0a01e3_3d51eb97","line":286,"updated":"2026-03-09 18:16:18.000000000","message":"if you change the import this `type: ignore` can go\n\n```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        return parser"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def take_action(self, parsed_args):"},{"line_number":286,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":287,"context_line":"        attrs \u003d {}"},{"line_number":288,"context_line":"        if parsed_args.name is not None:"},{"line_number":289,"context_line":"            attrs[\u0027name\u0027] \u003d str(parsed_args.name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"10e47356_41adb327","line":286,"in_reply_to":"df0a01e3_3d51eb97","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":330,"context_line":"        return parser"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def take_action(self, parsed_args):"},{"line_number":333,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":334,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":335,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027set\u0027, parsed_args)"},{"line_number":336,"context_line":"        client.update_bgpvpn(id, **body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3db2d0b9_282c647c","line":333,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":330,"context_line":"        return parser"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def take_action(self, parsed_args):"},{"line_number":333,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":334,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":335,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027set\u0027, parsed_args)"},{"line_number":336,"context_line":"        client.update_bgpvpn(id, **body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"47b47038_507d0a9a","line":333,"in_reply_to":"3db2d0b9_282c647c","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def take_action(self, parsed_args):"},{"line_number":333,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":334,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":335,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027set\u0027, parsed_args)"},{"line_number":336,"context_line":"        client.update_bgpvpn(id, **body)"},{"line_number":337,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7d1040ce_e552c6a5","line":334,"updated":"2026-03-09 18:16:18.000000000","message":"I assume you want an error if you can\u0027t find the resource?\n\n```suggestion\n        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dFalse)[\u0027id\u0027]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"f6a0ab8840315cd0c54f5687bc90b5eb9e960b61","unresolved":true,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def take_action(self, parsed_args):"},{"line_number":333,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":334,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":335,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027set\u0027, parsed_args)"},{"line_number":336,"context_line":"        client.update_bgpvpn(id, **body)"},{"line_number":337,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"a929e65d_8882f16b","line":334,"in_reply_to":"7d1040ce_e552c6a5","updated":"2026-04-08 15:11:40.000000000","message":"This is still valid. You\u0027re going to explode here with `TypeError` if you fail to find a matching bgpvpn since it\u0027ll return `None`\n\nDitto for the other unresolved comments below","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def take_action(self, parsed_args):"},{"line_number":333,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":334,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":335,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027set\u0027, parsed_args)"},{"line_number":336,"context_line":"        client.update_bgpvpn(id, **body)"},{"line_number":337,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"660ed359_317c4a91","line":334,"in_reply_to":"a929e65d_8882f16b","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":350,"context_line":"        return parser"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def take_action(self, parsed_args):"},{"line_number":353,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":354,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":355,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027unset\u0027, parsed_args)"},{"line_number":356,"context_line":"        client.update_bgpvpn(id, **body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"495497f2_4c8dd864","line":353,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        return parser"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def take_action(self, parsed_args):"},{"line_number":353,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":354,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":355,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027unset\u0027, parsed_args)"},{"line_number":356,"context_line":"        client.update_bgpvpn(id, **body)"}],"source_content_type":"text/x-python","patch_set":4,"id":"6a9a4e98_f4b52346","line":353,"in_reply_to":"495497f2_4c8dd864","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def take_action(self, parsed_args):"},{"line_number":353,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":354,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":355,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027unset\u0027, parsed_args)"},{"line_number":356,"context_line":"        client.update_bgpvpn(id, **body)"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"cdd22639_3a215eb0","line":354,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dFalse)[\u0027id\u0027]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def take_action(self, parsed_args):"},{"line_number":353,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":354,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":355,"context_line":"        body \u003d _args2body(self.app.client_manager, id, \u0027unset\u0027, parsed_args)"},{"line_number":356,"context_line":"        client.update_bgpvpn(id, **body)"},{"line_number":357,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"0af72b1e_567216a9","line":354,"in_reply_to":"cdd22639_3a215eb0","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":370,"context_line":"        return parser"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def take_action(self, parsed_args):"},{"line_number":373,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":374,"context_line":"        fails \u003d 0"},{"line_number":375,"context_line":"        for id_or_name in parsed_args.bgpvpns:"},{"line_number":376,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"65a1e97f_99fb5018","line":373,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        return parser"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def take_action(self, parsed_args):"},{"line_number":373,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":374,"context_line":"        fails \u003d 0"},{"line_number":375,"context_line":"        for id_or_name in parsed_args.bgpvpns:"},{"line_number":376,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"a1a3a448_6cce6fd8","line":373,"in_reply_to":"65a1e97f_99fb5018","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":374,"context_line":"        fails \u003d 0"},{"line_number":375,"context_line":"        for id_or_name in parsed_args.bgpvpns:"},{"line_number":376,"context_line":"            try:"},{"line_number":377,"context_line":"                id \u003d client.find_bgpvpn(id_or_name, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":378,"context_line":"                client.delete_bgpvpn(id)"},{"line_number":379,"context_line":"                LOG.warning(\"BGP VPN %(id)s deleted\", {\u0027id\u0027: id})"},{"line_number":380,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"d4a0033e_3d65ac20","line":377,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n                id \u003d client.find_bgpvpn(id_or_name, ignore_missing\u003dFalse)[\u0027id\u0027]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        fails \u003d 0"},{"line_number":375,"context_line":"        for id_or_name in parsed_args.bgpvpns:"},{"line_number":376,"context_line":"            try:"},{"line_number":377,"context_line":"                id \u003d client.find_bgpvpn(id_or_name, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":378,"context_line":"                client.delete_bgpvpn(id)"},{"line_number":379,"context_line":"                LOG.warning(\"BGP VPN %(id)s deleted\", {\u0027id\u0027: id})"},{"line_number":380,"context_line":"            except Exception as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3cb774a9_911e1150","line":377,"in_reply_to":"d4a0033e_3d65ac20","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":416,"context_line":"        return parser"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def take_action(self, parsed_args):"},{"line_number":419,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":420,"context_line":"        params \u003d {}"},{"line_number":421,"context_line":"        if parsed_args.project is not None:"},{"line_number":422,"context_line":"            project_id \u003d osc_id.find_project("}],"source_content_type":"text/x-python","patch_set":4,"id":"87a59c8a_fb057dab","line":419,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":416,"context_line":"        return parser"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":"    def take_action(self, parsed_args):"},{"line_number":419,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":420,"context_line":"        params \u003d {}"},{"line_number":421,"context_line":"        if parsed_args.project is not None:"},{"line_number":422,"context_line":"            project_id \u003d osc_id.find_project("}],"source_content_type":"text/x-python","patch_set":4,"id":"2d1aa4d1_7e09120e","line":419,"in_reply_to":"87a59c8a_fb057dab","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":455,"context_line":"        return parser"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def take_action(self, parsed_args):"},{"line_number":458,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":459,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":460,"context_line":"        obj \u003d client.get_bgpvpn(id)"},{"line_number":461,"context_line":"        display_columns, columns \u003d _get_columns(obj)"}],"source_content_type":"text/x-python","patch_set":4,"id":"b1167919_bcb63014","line":458,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":455,"context_line":"        return parser"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def take_action(self, parsed_args):"},{"line_number":458,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":459,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":460,"context_line":"        obj \u003d client.get_bgpvpn(id)"},{"line_number":461,"context_line":"        display_columns, columns \u003d _get_columns(obj)"}],"source_content_type":"text/x-python","patch_set":4,"id":"48cbf714_aaf3330f","line":458,"in_reply_to":"b1167919_bcb63014","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def take_action(self, parsed_args):"},{"line_number":458,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":459,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":460,"context_line":"        obj \u003d client.get_bgpvpn(id)"},{"line_number":461,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":462,"context_line":"        data \u003d osc_utils.get_dict_properties("}],"source_content_type":"text/x-python","patch_set":4,"id":"559e76a9_d45e7456","line":459,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dFalse)[\u0027id\u0027]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":456,"context_line":""},{"line_number":457,"context_line":"    def take_action(self, parsed_args):"},{"line_number":458,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":459,"context_line":"        id \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)[\u0027id\u0027]"},{"line_number":460,"context_line":"        obj \u003d client.get_bgpvpn(id)"},{"line_number":461,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":462,"context_line":"        data \u003d osc_utils.get_dict_properties("}],"source_content_type":"text/x-python","patch_set":4,"id":"5b432020_49bbeca6","line":459,"in_reply_to":"559e76a9_d45e7456","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73632c0f7fc20f3767ae3a252a9705dc264471f5","unresolved":true,"context_lines":[{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":"import typing as ty"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from osc_lib.cli import format_columns"},{"line_number":21,"context_line":"from osc_lib.cli import identity as osc_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"5fba9073_cd920d07","line":18,"updated":"2026-04-21 11:02:23.000000000","message":"I can fix this in a follow-up, but we\u0027ve since replaced this with direct object imports (e.g. `from typing import ...`)","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afca24f8435e089564345f2211d83cc889e0a311","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":"import typing as ty"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from osc_lib.cli import format_columns"},{"line_number":21,"context_line":"from osc_lib.cli import identity as osc_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"84b4d4d7_5f877169","line":18,"in_reply_to":"5fba9073_cd920d07","updated":"2026-05-05 09:40:08.000000000","message":"Let\u0027s do this in a follow-up","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"73632c0f7fc20f3767ae3a252a9705dc264471f5","unresolved":true,"context_lines":[{"line_number":59,"context_line":"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def _get_columns(item):"},{"line_number":63,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":64,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027tenant_id\u0027]"},{"line_number":65,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("}],"source_content_type":"text/x-python","patch_set":10,"id":"86f2ae6b_de2bd294","line":62,"updated":"2026-04-21 11:02:23.000000000","message":"We also have type hints in place for all functions. Again, we can do this after but it would be a good follow-up","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afca24f8435e089564345f2211d83cc889e0a311","unresolved":false,"context_lines":[{"line_number":59,"context_line":"}"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def _get_columns(item):"},{"line_number":63,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":64,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027tenant_id\u0027]"},{"line_number":65,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("}],"source_content_type":"text/x-python","patch_set":10,"id":"934b67fb_27c9d0c3","line":62,"in_reply_to":"86f2ae6b_de2bd294","updated":"2026-05-05 09:40:08.000000000","message":"ditto","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":305,"context_line":"                parsed_args.project,"},{"line_number":306,"context_line":"                parsed_args.project_domain,"},{"line_number":307,"context_line":"            ).id"},{"line_number":308,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":309,"context_line":"        obj \u003d client.create_bgpvpn(**attrs)"},{"line_number":310,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":311,"context_line":"        data \u003d osc_utils.get_dict_properties("}],"source_content_type":"text/x-python","patch_set":10,"id":"cd536bb1_18cadc68","line":308,"range":{"start_line":308,"start_character":19,"end_line":308,"end_character":28},"updated":"2026-04-29 03:41:19.000000000","message":"s/project_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                parsed_args.project,"},{"line_number":306,"context_line":"                parsed_args.project_domain,"},{"line_number":307,"context_line":"            ).id"},{"line_number":308,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":309,"context_line":"        obj \u003d client.create_bgpvpn(**attrs)"},{"line_number":310,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":311,"context_line":"        data \u003d osc_utils.get_dict_properties("}],"source_content_type":"text/x-python","patch_set":10,"id":"3fde59cb_0d22d322","line":308,"range":{"start_line":308,"start_character":19,"end_line":308,"end_character":28},"in_reply_to":"cd536bb1_18cadc68","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":422,"context_line":"                parsed_args.project,"},{"line_number":423,"context_line":"                parsed_args.project_domain,"},{"line_number":424,"context_line":"            ).id"},{"line_number":425,"context_line":"            params[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":426,"context_line":"        if parsed_args.property:"},{"line_number":427,"context_line":"            params.update(parsed_args.property)"},{"line_number":428,"context_line":"        objs \u003d client.bgpvpns(**params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"a631ef69_ab0aa74a","line":425,"range":{"start_line":425,"start_character":20,"end_line":425,"end_character":29},"updated":"2026-04-29 03:41:19.000000000","message":"s/project_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":422,"context_line":"                parsed_args.project,"},{"line_number":423,"context_line":"                parsed_args.project_domain,"},{"line_number":424,"context_line":"            ).id"},{"line_number":425,"context_line":"            params[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":426,"context_line":"        if parsed_args.property:"},{"line_number":427,"context_line":"            params.update(parsed_args.property)"},{"line_number":428,"context_line":"        objs \u003d client.bgpvpns(**params)"}],"source_content_type":"text/x-python","patch_set":10,"id":"d448a4ea_8396dee7","line":425,"range":{"start_line":425,"start_character":20,"end_line":425,"end_character":29},"in_reply_to":"a631ef69_ab0aa74a","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/network/v2/bgpvpn/constants.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":17,"context_line":"BGPVPN \u003d \u0027bgpvpn\u0027"},{"line_number":18,"context_line":"BGPVPNS \u003d f\u0027{BGPVPN}s\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NETWORK_RESOURCE_NAME \u003d \u0027network\u0027"},{"line_number":21,"context_line":"NETWORK_ASSOC \u003d f\u0027{NETWORK_RESOURCE_NAME}_association\u0027"},{"line_number":22,"context_line":"NETWORK_ASSOCS \u003d f\u0027{NETWORK_ASSOC}s\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"ROUTER_RESOURCE_NAME \u003d \u0027router\u0027"},{"line_number":25,"context_line":"ROUTER_ASSOC \u003d f\u0027{ROUTER_RESOURCE_NAME}_association\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"27749aeb_ddcc4e2d","line":22,"range":{"start_line":20,"start_character":33,"end_line":22,"end_character":36},"updated":"2026-03-04 12:47:48.000000000","message":"```suggestion\nNETWORK_RESOURCE_NAME \u003d \u0027network\u0027\nNETWORK_ASSOCIATION \u003d f\u0027{NETWORK_RESOURCE_NAME}_association\u0027\nNETWORK_ASSOCIATIONS \u003d f\u0027{NETWORK_ASSOC}s\u0027\n```\n\nditto for the below","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"BGPVPN \u003d \u0027bgpvpn\u0027"},{"line_number":18,"context_line":"BGPVPNS \u003d f\u0027{BGPVPN}s\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"NETWORK_RESOURCE_NAME \u003d \u0027network\u0027"},{"line_number":21,"context_line":"NETWORK_ASSOC \u003d f\u0027{NETWORK_RESOURCE_NAME}_association\u0027"},{"line_number":22,"context_line":"NETWORK_ASSOCS \u003d f\u0027{NETWORK_ASSOC}s\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"ROUTER_RESOURCE_NAME \u003d \u0027router\u0027"},{"line_number":25,"context_line":"ROUTER_ASSOC \u003d f\u0027{ROUTER_RESOURCE_NAME}_association\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1710e666_14c7bdc2","line":22,"range":{"start_line":20,"start_character":33,"end_line":22,"end_character":36},"in_reply_to":"27749aeb_ddcc4e2d","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"}],"openstackclient/network/v2/bgpvpn/network_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":33,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BgpvpnNetAssoc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"b9dc8a6c_b491f533","line":34,"updated":"2026-03-04 12:47:48.000000000","message":"As mentioned elsewhere, let\u0027s import modules rather than objects.","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":31,"context_line":")"},{"line_number":32,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":33,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class BgpvpnNetAssoc:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7726bbcf_2b711021","line":34,"in_reply_to":"b9dc8a6c_b491f533","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"_attr_map \u003d ("},{"line_number":33,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":34,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":35,"context_line":"    (\u0027network_id\u0027, \u0027Network ID\u0027, column_util.LIST_BOTH),"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"_formatters: dict[str, ty.Any] \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"10a0f25b_030179db","line":34,"range":{"start_line":34,"start_character":6,"end_line":34,"end_character":15},"updated":"2026-04-29 03:41:19.000000000","message":"This should be project_id I think","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"_attr_map \u003d ("},{"line_number":33,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":34,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":35,"context_line":"    (\u0027network_id\u0027, \u0027Network ID\u0027, column_util.LIST_BOTH),"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"_formatters: dict[str, ty.Any] \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"83a80c3f_367fb669","line":34,"range":{"start_line":34,"start_character":6,"end_line":34,"end_character":15},"in_reply_to":"10a0f25b_030179db","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_columns(item):"},{"line_number":41,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":42,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":43,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":44,"context_line":"        item, column_map, hidden_columns"},{"line_number":45,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"1beb7ad6_17950b67","line":42,"range":{"start_line":42,"start_character":43,"end_line":42,"end_character":53},"updated":"2026-04-29 03:41:19.000000000","message":"and this should be tenant_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def _get_columns(item):"},{"line_number":41,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":42,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":43,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":44,"context_line":"        item, column_map, hidden_columns"},{"line_number":45,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"6ee4a43f_c2fdf400","line":42,"range":{"start_line":42,"start_character":43,"end_line":42,"end_character":53},"in_reply_to":"1beb7ad6_17950b67","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":76,"context_line":"                parsed_args.project,"},{"line_number":77,"context_line":"                parsed_args.project_domain,"},{"line_number":78,"context_line":"            ).id"},{"line_number":79,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        obj \u003d client.create_bgpvpn_network_association(bgpvpn[\u0027id\u0027], **body)"},{"line_number":82,"context_line":"        display_columns, columns \u003d _get_columns(obj)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f950376a_a91bc464","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":27},"updated":"2026-04-29 03:41:19.000000000","message":"s/project_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                parsed_args.project,"},{"line_number":77,"context_line":"                parsed_args.project_domain,"},{"line_number":78,"context_line":"            ).id"},{"line_number":79,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        obj \u003d client.create_bgpvpn_network_association(bgpvpn[\u0027id\u0027], **body)"},{"line_number":82,"context_line":"        display_columns, columns \u003d _get_columns(obj)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fdcf4ca0_c15c201f","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":27},"in_reply_to":"f950376a_a91bc464","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/network/v2/bgpvpn/port_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":33,"context_line":"    _resource \u003d constants.PORT_ASSOC"},{"line_number":34,"context_line":"    _resource_plural \u003d constants.PORT_ASSOCS"},{"line_number":35,"context_line":"    _action: str"},{"line_number":36,"context_line":"    app: ty.Any  # Set by command.Command parent class"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    _attr_map \u003d ("},{"line_number":39,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"}],"source_content_type":"text/x-python","patch_set":2,"id":"019271e9_4a873b14","line":36,"updated":"2026-03-04 12:47:48.000000000","message":"nit: you should be able to do:\n\n\n```suggestion\n    app: shell.OpenStackShell\n```\n\nAlternatively, maybe just subclass `command.Command`? Once you don\u0027t register it in `pyproject.toml` it shouldn\u0027t work as a valid command and MRO should be happy.","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    _resource \u003d constants.PORT_ASSOC"},{"line_number":34,"context_line":"    _resource_plural \u003d constants.PORT_ASSOCS"},{"line_number":35,"context_line":"    _action: str"},{"line_number":36,"context_line":"    app: ty.Any  # Set by command.Command parent class"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    _attr_map \u003d ("},{"line_number":39,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"}],"source_content_type":"text/x-python","patch_set":2,"id":"dff6c5f7_4b04027a","line":36,"in_reply_to":"019271e9_4a873b14","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from openstackclient.i18n import _"},{"line_number":25,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":26,"context_line":"from openstackclient.network.v2.bgpvpn import resource_association"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3d5502f1_02bd999d","line":26,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\nfrom openstackclient.network.v2.bgpvpn import resource_association\nfrom openstackclient import shell\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from openstackclient.i18n import _"},{"line_number":25,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":26,"context_line":"from openstackclient.network.v2.bgpvpn import resource_association"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5362f989_7d9a6760","line":26,"in_reply_to":"3d5502f1_02bd999d","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BGPVPNPortAssociation:"},{"line_number":32,"context_line":"    _assoc_res_name \u003d constants.PORT_RESOURCE_NAME"},{"line_number":33,"context_line":"    _resource \u003d constants.PORT_ASSOCIATION"},{"line_number":34,"context_line":"    _resource_plural \u003d constants.PORT_ASSOCIATIONS"}],"source_content_type":"text/x-python","patch_set":4,"id":"17e6e118_ef2bfd94","line":31,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\nclass BGPVPNPortAssociation:\n    app: shell.OpenStackShell\n\n```\n\nThis will fix your type issues below.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BGPVPNPortAssociation:"},{"line_number":32,"context_line":"    _assoc_res_name \u003d constants.PORT_RESOURCE_NAME"},{"line_number":33,"context_line":"    _resource \u003d constants.PORT_ASSOCIATION"},{"line_number":34,"context_line":"    _resource_plural \u003d constants.PORT_ASSOCIATIONS"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fe42e4a_9e9b5f3e","line":31,"in_reply_to":"17e6e118_ef2bfd94","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":225,"context_line":"            )"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def _args2body(self, bgpvpn_id, args):"},{"line_number":228,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":229,"context_line":"        attrs: dict[str, ty.Any] \u003d {}"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        if self._action !\u003d \u0027create\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"f978c118_6d404bea","line":228,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            )"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def _args2body(self, bgpvpn_id, args):"},{"line_number":228,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":229,"context_line":"        attrs: dict[str, ty.Any] \u003d {}"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"        if self._action !\u003d \u0027create\u0027:"}],"source_content_type":"text/x-python","patch_set":4,"id":"65487146_56ed5ebe","line":228,"in_reply_to":"f978c118_6d404bea","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":232,"context_line":"            assoc \u003d client.find_bgpvpn_port_association("},{"line_number":233,"context_line":"                args.resource_association_id,"},{"line_number":234,"context_line":"                bgpvpn_id\u003dbgpvpn_id,"},{"line_number":235,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":236,"context_line":"            )"},{"line_number":237,"context_line":"        else:"},{"line_number":238,"context_line":"            assoc \u003d {\u0027routes\u0027: []}"}],"source_content_type":"text/x-python","patch_set":4,"id":"e429e610_dcedea92","line":235,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n                ignore_missing\u003dFalse,\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            assoc \u003d client.find_bgpvpn_port_association("},{"line_number":233,"context_line":"                args.resource_association_id,"},{"line_number":234,"context_line":"                bgpvpn_id\u003dbgpvpn_id,"},{"line_number":235,"context_line":"                ignore_missing\u003dTrue,"},{"line_number":236,"context_line":"            )"},{"line_number":237,"context_line":"        else:"},{"line_number":238,"context_line":"            assoc \u003d {\u0027routes\u0027: []}"}],"source_content_type":"text/x-python","patch_set":4,"id":"6cd6d593_f8fcfe01","line":235,"in_reply_to":"e429e610_dcedea92","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":281,"context_line":"                    routes \u003d args.bgpvpn_routes"},{"line_number":282,"context_line":"                args_bgpvpn_routes \u003d {"},{"line_number":283,"context_line":"                    client.find_bgpvpn("},{"line_number":284,"context_line":"                        r[\u0027bgpvpn\u0027], ignore_missing\u003dTrue"},{"line_number":285,"context_line":"                    ).id: r.get(\u0027local_pref\u0027)"},{"line_number":286,"context_line":"                    for r in routes"},{"line_number":287,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":4,"id":"a324bfca_dc15bffe","line":284,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n                        r[\u0027bgpvpn\u0027], ignore_missing\u003dFalse\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                    routes \u003d args.bgpvpn_routes"},{"line_number":282,"context_line":"                args_bgpvpn_routes \u003d {"},{"line_number":283,"context_line":"                    client.find_bgpvpn("},{"line_number":284,"context_line":"                        r[\u0027bgpvpn\u0027], ignore_missing\u003dTrue"},{"line_number":285,"context_line":"                    ).id: r.get(\u0027local_pref\u0027)"},{"line_number":286,"context_line":"                    for r in routes"},{"line_number":287,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":4,"id":"2175b1cd_ee833ff7","line":284,"in_reply_to":"a324bfca_dc15bffe","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":294,"context_line":"        if prefix_routes is not None and not prefix_routes:"},{"line_number":295,"context_line":"            attrs.setdefault(\u0027routes\u0027, [])"},{"line_number":296,"context_line":"        elif prefix_routes is not None:"},{"line_number":297,"context_line":"            for prefix, local_pref in prefix_routes.items():  # type: ignore[union-attr]"},{"line_number":298,"context_line":"                route \u003d {"},{"line_number":299,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":300,"context_line":"                    \u0027prefix\u0027: prefix,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ab3b9a9_b7d3d2a3","line":297,"updated":"2026-03-09 18:16:18.000000000","message":"Could we get a comment for why you are ignoring this? This is usually indicative of missing None check, though we have that here so something else is probably going on.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        if prefix_routes is not None and not prefix_routes:"},{"line_number":295,"context_line":"            attrs.setdefault(\u0027routes\u0027, [])"},{"line_number":296,"context_line":"        elif prefix_routes is not None:"},{"line_number":297,"context_line":"            for prefix, local_pref in prefix_routes.items():  # type: ignore[union-attr]"},{"line_number":298,"context_line":"                route \u003d {"},{"line_number":299,"context_line":"                    \u0027type\u0027: \u0027prefix\u0027,"},{"line_number":300,"context_line":"                    \u0027prefix\u0027: prefix,"}],"source_content_type":"text/x-python","patch_set":4,"id":"32662376_288430a4","line":297,"in_reply_to":"9ab3b9a9_b7d3d2a3","updated":"2026-04-21 16:05:00.000000000","message":"after removing all the common resource_association it is not needed anymore.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":305,"context_line":"        if bgpvpn_routes is not None and not bgpvpn_routes:"},{"line_number":306,"context_line":"            attrs.setdefault(\u0027routes\u0027, [])"},{"line_number":307,"context_line":"        elif bgpvpn_routes is not None:"},{"line_number":308,"context_line":"            for bgpvpn_id, local_pref in bgpvpn_routes.items():  # type: ignore[union-attr]"},{"line_number":309,"context_line":"                route \u003d {"},{"line_number":310,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":311,"context_line":"                    \u0027bgpvpn_id\u0027: bgpvpn_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5c1e7aec_77ae5333","line":308,"updated":"2026-03-09 18:16:18.000000000","message":"As above, are you missing a check here? If not, can we get a comment for why this is needed?","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":true,"context_lines":[{"line_number":305,"context_line":"        if bgpvpn_routes is not None and not bgpvpn_routes:"},{"line_number":306,"context_line":"            attrs.setdefault(\u0027routes\u0027, [])"},{"line_number":307,"context_line":"        elif bgpvpn_routes is not None:"},{"line_number":308,"context_line":"            for bgpvpn_id, local_pref in bgpvpn_routes.items():  # type: ignore[union-attr]"},{"line_number":309,"context_line":"                route \u003d {"},{"line_number":310,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":311,"context_line":"                    \u0027bgpvpn_id\u0027: bgpvpn_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a63bef86_9d237b80","line":308,"in_reply_to":"5c1e7aec_77ae5333","updated":"2026-04-21 16:05:00.000000000","message":"after doing the split of common code the type: ignore is not necessary as above, thanks for pointing to it","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"04c9ca3ae93d53d39250624bebda0031a1fbd620","unresolved":false,"context_lines":[{"line_number":305,"context_line":"        if bgpvpn_routes is not None and not bgpvpn_routes:"},{"line_number":306,"context_line":"            attrs.setdefault(\u0027routes\u0027, [])"},{"line_number":307,"context_line":"        elif bgpvpn_routes is not None:"},{"line_number":308,"context_line":"            for bgpvpn_id, local_pref in bgpvpn_routes.items():  # type: ignore[union-attr]"},{"line_number":309,"context_line":"                route \u003d {"},{"line_number":310,"context_line":"                    \u0027type\u0027: \u0027bgpvpn\u0027,"},{"line_number":311,"context_line":"                    \u0027bgpvpn_id\u0027: bgpvpn_id,"}],"source_content_type":"text/x-python","patch_set":4,"id":"dd235aba_728fcf9b","line":308,"in_reply_to":"a63bef86_9d237b80","updated":"2026-04-21 16:05:50.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"_attr_map \u003d ("},{"line_number":33,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":34,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":35,"context_line":"    (\u0027port_id\u0027, \u0027Port ID\u0027, column_util.LIST_BOTH),"},{"line_number":36,"context_line":"    ("},{"line_number":37,"context_line":"        \u0027prefix_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"2a0396ad_9700a8af","line":34,"range":{"start_line":34,"start_character":6,"end_line":34,"end_character":15},"updated":"2026-04-29 03:41:19.000000000","message":"s/project_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"_attr_map \u003d ("},{"line_number":33,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":34,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":35,"context_line":"    (\u0027port_id\u0027, \u0027Port ID\u0027, column_util.LIST_BOTH),"},{"line_number":36,"context_line":"    ("},{"line_number":37,"context_line":"        \u0027prefix_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"0c064f0e_b92240b2","line":34,"range":{"start_line":34,"start_character":6,"end_line":34,"end_character":15},"in_reply_to":"2a0396ad_9700a8af","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _get_columns(item):"},{"line_number":59,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":60,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":61,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":62,"context_line":"        item, column_map, hidden_columns"},{"line_number":63,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"aa3cc5b2_05b8c921","line":60,"range":{"start_line":60,"start_character":43,"end_line":60,"end_character":53},"updated":"2026-04-29 03:41:19.000000000","message":"s/tenant_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def _get_columns(item):"},{"line_number":59,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":60,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":61,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":62,"context_line":"        item, column_map, hidden_columns"},{"line_number":63,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ab12b51_8197b9c1","line":60,"range":{"start_line":60,"start_character":43,"end_line":60,"end_character":53},"in_reply_to":"aa3cc5b2_05b8c921","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":314,"context_line":"                parsed_args.project,"},{"line_number":315,"context_line":"                parsed_args.project_domain,"},{"line_number":316,"context_line":"            ).id"},{"line_number":317,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        body.update(_args2body(client, \u0027create\u0027, bgpvpn[\u0027id\u0027], parsed_args))"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"61b1d627_a030a46e","line":317,"range":{"start_line":317,"start_character":18,"end_line":317,"end_character":27},"updated":"2026-04-29 03:41:19.000000000","message":"s/project_id","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                parsed_args.project,"},{"line_number":315,"context_line":"                parsed_args.project_domain,"},{"line_number":316,"context_line":"            ).id"},{"line_number":317,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        body.update(_args2body(client, \u0027create\u0027, bgpvpn[\u0027id\u0027], parsed_args))"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"d729c9c3_7b463cc0","line":317,"range":{"start_line":317,"start_character":18,"end_line":317,"end_character":27},"in_reply_to":"61b1d627_a030a46e","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/network/v2/bgpvpn/resource_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":18,"context_line":"import typing as ty"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":21,"context_line":"from osc_lib.cli import parseractions"},{"line_number":22,"context_line":"from osc_lib.command import command"},{"line_number":23,"context_line":"from osc_lib import exceptions"},{"line_number":24,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":25,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from openstackclient.i18n import _"},{"line_number":28,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"a77d752f_8e850570","line":28,"range":{"start_line":21,"start_character":37,"end_line":28,"end_character":55},"updated":"2026-03-09 18:16:18.000000000","message":"To fix your type issues.\n\n```suggestion\nfrom osc_lib.cli import parseractions\nfrom osc_lib import exceptions\nfrom osc_lib import utils as osc_utils\nfrom osc_lib.utils import columns as column_util\n\nfrom openstackclient import command\nfrom openstackclient.i18n import _\nfrom openstackclient.network.v2.bgpvpn import constants\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import typing as ty"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":21,"context_line":"from osc_lib.cli import parseractions"},{"line_number":22,"context_line":"from osc_lib.command import command"},{"line_number":23,"context_line":"from osc_lib import exceptions"},{"line_number":24,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":25,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from openstackclient.i18n import _"},{"line_number":28,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2c0f7958_638025f8","line":28,"range":{"start_line":21,"start_character":37,"end_line":28,"end_character":55},"in_reply_to":"a77d752f_8e850570","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":45,"context_line":"    _action \u003d \u0027create\u0027"},{"line_number":46,"context_line":"    _assoc_res_name: str"},{"line_number":47,"context_line":"    _resource: str"},{"line_number":48,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_parser(self, prog_name):"},{"line_number":51,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f2f9565_62e162f2","line":48,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n    _formatters: dict[str, osc_utils.FormatterT]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    _action \u003d \u0027create\u0027"},{"line_number":46,"context_line":"    _assoc_res_name: str"},{"line_number":47,"context_line":"    _resource: str"},{"line_number":48,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def get_parser(self, prog_name):"},{"line_number":51,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"4b458f73_99ed6712","line":48,"in_reply_to":"1f2f9565_62e162f2","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        return parser"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def take_action(self, parsed_args):"},{"line_number":77,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":78,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":79,"context_line":"        find_res_method \u003d getattr(client, f\u0027find_{self._assoc_res_name}\u0027)"},{"line_number":80,"context_line":"        assoc_res \u003d find_res_method(parsed_args.resource)"}],"source_content_type":"text/x-python","patch_set":4,"id":"76660488_1d41438b","line":77,"updated":"2026-03-09 18:16:18.000000000","message":"This shouldn\u0027t be needed once `app` is annotated\n\n```suggestion\n        client \u003d self.app.client_manager.network\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        return parser"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def take_action(self, parsed_args):"},{"line_number":77,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":78,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":79,"context_line":"        find_res_method \u003d getattr(client, f\u0027find_{self._assoc_res_name}\u0027)"},{"line_number":80,"context_line":"        assoc_res \u003d find_res_method(parsed_args.resource)"}],"source_content_type":"text/x-python","patch_set":4,"id":"87a2f5d2_4c3ca578","line":77,"in_reply_to":"76660488_1d41438b","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        return parser"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def take_action(self, parsed_args):"},{"line_number":145,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":146,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":147,"context_line":"        arg2body \u003d getattr(self, \u0027_args2body\u0027, None)"},{"line_number":148,"context_line":"        if callable(arg2body):"}],"source_content_type":"text/x-python","patch_set":4,"id":"f68c911f_199c071b","line":145,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n        client \u003d self.app.client_manager.network\n```\n\nI won\u0027t comment on the rest of these: you get the idea.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        return parser"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def take_action(self, parsed_args):"},{"line_number":145,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":146,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":147,"context_line":"        arg2body \u003d getattr(self, \u0027_args2body\u0027, None)"},{"line_number":148,"context_line":"        if callable(arg2body):"}],"source_content_type":"text/x-python","patch_set":4,"id":"8754fe02_7fc27f97","line":145,"in_reply_to":"f68c911f_199c071b","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":146,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":147,"context_line":"        arg2body \u003d getattr(self, \u0027_args2body\u0027, None)"},{"line_number":148,"context_line":"        if callable(arg2body):"},{"line_number":149,"context_line":"            body \u003d arg2body(bgpvpn[\u0027id\u0027], parsed_args)"},{"line_number":150,"context_line":"            if self._resource \u003d\u003d constants.NETWORK_ASSOCIATION:"},{"line_number":151,"context_line":"                client.update_bgpvpn_network_association("},{"line_number":152,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":153,"context_line":"                )"},{"line_number":154,"context_line":"            elif self._resource \u003d\u003d constants.PORT_ASSOCIATION:"},{"line_number":155,"context_line":"                client.update_bgpvpn_port_association("},{"line_number":156,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":157,"context_line":"                )"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                client.update_bgpvpn_router_association("},{"line_number":160,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":161,"context_line":"                )"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"class UnsetBgpvpnResAssoc(SetBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":4,"id":"d9d8ef1a_c18b2bc9","line":161,"range":{"start_line":148,"start_character":0,"end_line":161,"end_character":17},"updated":"2026-03-09 18:16:18.000000000","message":"nit:\n\n```suggestion\n        if not callable(arg2body):\n            return\n\n        body \u003d arg2body(bgpvpn[\u0027id\u0027], parsed_args)\n        if self._resource \u003d\u003d constants.NETWORK_ASSOCIATION:\n            client.update_bgpvpn_network_association(\n                bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body\n            )\n        elif self._resource \u003d\u003d constants.PORT_ASSOCIATION:\n            client.update_bgpvpn_port_association(\n                bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body\n            )\n        else:\n            client.update_bgpvpn_router_association(\n                bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body\n            )\n```\n\nHowever, there\u0027s also a question here: does this make sense? If you were to define `take_action` in each subclass you might add 7 lines to each command but I think it would likely be more readable. Maybe one for a follow-up if you are copying this logic verbatim for neutronclient?","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"04c9ca3ae93d53d39250624bebda0031a1fbd620","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":146,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":147,"context_line":"        arg2body \u003d getattr(self, \u0027_args2body\u0027, None)"},{"line_number":148,"context_line":"        if callable(arg2body):"},{"line_number":149,"context_line":"            body \u003d arg2body(bgpvpn[\u0027id\u0027], parsed_args)"},{"line_number":150,"context_line":"            if self._resource \u003d\u003d constants.NETWORK_ASSOCIATION:"},{"line_number":151,"context_line":"                client.update_bgpvpn_network_association("},{"line_number":152,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":153,"context_line":"                )"},{"line_number":154,"context_line":"            elif self._resource \u003d\u003d constants.PORT_ASSOCIATION:"},{"line_number":155,"context_line":"                client.update_bgpvpn_port_association("},{"line_number":156,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":157,"context_line":"                )"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                client.update_bgpvpn_router_association("},{"line_number":160,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":161,"context_line":"                )"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"class UnsetBgpvpnResAssoc(SetBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":4,"id":"45e0a222_3c00991b","line":161,"range":{"start_line":148,"start_character":0,"end_line":161,"end_character":17},"in_reply_to":"bc069ef9_7fccb822","updated":"2026-04-21 16:05:50.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        client \u003d self.app.client_manager.network  # type: ignore[attr-defined]"},{"line_number":146,"context_line":"        bgpvpn \u003d client.find_bgpvpn(parsed_args.bgpvpn, ignore_missing\u003dTrue)"},{"line_number":147,"context_line":"        arg2body \u003d getattr(self, \u0027_args2body\u0027, None)"},{"line_number":148,"context_line":"        if callable(arg2body):"},{"line_number":149,"context_line":"            body \u003d arg2body(bgpvpn[\u0027id\u0027], parsed_args)"},{"line_number":150,"context_line":"            if self._resource \u003d\u003d constants.NETWORK_ASSOCIATION:"},{"line_number":151,"context_line":"                client.update_bgpvpn_network_association("},{"line_number":152,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":153,"context_line":"                )"},{"line_number":154,"context_line":"            elif self._resource \u003d\u003d constants.PORT_ASSOCIATION:"},{"line_number":155,"context_line":"                client.update_bgpvpn_port_association("},{"line_number":156,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":157,"context_line":"                )"},{"line_number":158,"context_line":"            else:"},{"line_number":159,"context_line":"                client.update_bgpvpn_router_association("},{"line_number":160,"context_line":"                    bgpvpn[\u0027id\u0027], parsed_args.resource_association_id, **body"},{"line_number":161,"context_line":"                )"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"class UnsetBgpvpnResAssoc(SetBgpvpnResAssoc):"}],"source_content_type":"text/x-python","patch_set":4,"id":"bc069ef9_7fccb822","line":161,"range":{"start_line":148,"start_character":0,"end_line":161,"end_character":17},"in_reply_to":"d9d8ef1a_c18b2bc9","updated":"2026-04-21 16:05:00.000000000","message":"whole thing removed in resource_association with ugly if/elif/else things.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":236,"context_line":"    \"\"\"List BGP VPN resource associations for a given BGP VPN\"\"\""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _resource: str"},{"line_number":239,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":240,"context_line":"    _attr_map: ty.Any  # Tuple defined in subclasses"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4f51fe36_7defed87","line":239,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n    _formatters: dict[str, osc_utils.FormatterT]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":236,"context_line":"    \"\"\"List BGP VPN resource associations for a given BGP VPN\"\"\""},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _resource: str"},{"line_number":239,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":240,"context_line":"    _attr_map: ty.Any  # Tuple defined in subclasses"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7206e5c8_fd3c3f20","line":239,"in_reply_to":"4f51fe36_7defed87","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _resource: str"},{"line_number":239,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":240,"context_line":"    _attr_map: ty.Any  # Tuple defined in subclasses"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def get_parser(self, prog_name):"},{"line_number":243,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"cbf29bea_ebf4b844","line":240,"range":{"start_line":240,"start_character":4,"end_line":240,"end_character":13},"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n    _attr_map: tuple[tuple[str, str, str], ...]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    _resource: str"},{"line_number":239,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":240,"context_line":"    _attr_map: ty.Any  # Tuple defined in subclasses"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def get_parser(self, prog_name):"},{"line_number":243,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"65ceefd3_3236cf20","line":240,"range":{"start_line":240,"start_character":4,"end_line":240,"end_character":13},"in_reply_to":"cbf29bea_ebf4b844","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    _assoc_res_name: str"},{"line_number":308,"context_line":"    _resource: str"},{"line_number":309,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def get_parser(self, prog_name):"},{"line_number":312,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f4843151_7f9ddaba","line":309,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n    _formatters: dict[str, osc_utils.FormatterT]\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    _assoc_res_name: str"},{"line_number":308,"context_line":"    _resource: str"},{"line_number":309,"context_line":"    _formatters: dict[str, ty.Any]"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def get_parser(self, prog_name):"},{"line_number":312,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5addc329_7e264026","line":309,"in_reply_to":"f4843151_7f9ddaba","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"}],"openstackclient/network/v2/bgpvpn/router_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from openstackclient.i18n import _"},{"line_number":22,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":23,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":24,"context_line":"    CreateBgpvpnResAssoc,"},{"line_number":25,"context_line":")"},{"line_number":26,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":27,"context_line":"    DeleteBgpvpnResAssoc,"},{"line_number":28,"context_line":")"},{"line_number":29,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":30,"context_line":"    ListBgpvpnResAssoc,"},{"line_number":31,"context_line":")"},{"line_number":32,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":33,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":36,"context_line":"    SetBgpvpnResAssoc,"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":39,"context_line":"    UnsetBgpvpnResAssoc,"},{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class BgpvpnRouterAssoc:"},{"line_number":44,"context_line":"    _assoc_res_name \u003d constants.ROUTER_RESOURCE_NAME"}],"source_content_type":"text/x-python","patch_set":2,"id":"0711ac1a_d137e3a5","line":41,"range":{"start_line":23,"start_character":0,"end_line":41,"end_character":1},"updated":"2026-03-04 12:47:48.000000000","message":"Let\u0027s stick with importing modules, not objects.\n\n```suggestion\nfrom openstackclient.network.v2.bgpvpn import resource_association\n```","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from openstackclient.i18n import _"},{"line_number":22,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":23,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":24,"context_line":"    CreateBgpvpnResAssoc,"},{"line_number":25,"context_line":")"},{"line_number":26,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":27,"context_line":"    DeleteBgpvpnResAssoc,"},{"line_number":28,"context_line":")"},{"line_number":29,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":30,"context_line":"    ListBgpvpnResAssoc,"},{"line_number":31,"context_line":")"},{"line_number":32,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":33,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":36,"context_line":"    SetBgpvpnResAssoc,"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":39,"context_line":"    UnsetBgpvpnResAssoc,"},{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class BgpvpnRouterAssoc:"},{"line_number":44,"context_line":"    _assoc_res_name \u003d constants.ROUTER_RESOURCE_NAME"}],"source_content_type":"text/x-python","patch_set":2,"id":"e6d03509_582172d8","line":41,"range":{"start_line":23,"start_character":0,"end_line":41,"end_character":1},"in_reply_to":"0711ac1a_d137e3a5","updated":"2026-03-06 14:14:06.000000000","message":"thanks, should have changed these, even strange that no rule catches these, in the past i remember for such hacking or even pep8 rule","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9a610cccc29d939b404f8b68ed724a9f6d470385","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from openstackclient.i18n import _"},{"line_number":22,"context_line":"from openstackclient.network.v2.bgpvpn import constants"},{"line_number":23,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":24,"context_line":"    CreateBgpvpnResAssoc,"},{"line_number":25,"context_line":")"},{"line_number":26,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":27,"context_line":"    DeleteBgpvpnResAssoc,"},{"line_number":28,"context_line":")"},{"line_number":29,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":30,"context_line":"    ListBgpvpnResAssoc,"},{"line_number":31,"context_line":")"},{"line_number":32,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":33,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":34,"context_line":")"},{"line_number":35,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":36,"context_line":"    SetBgpvpnResAssoc,"},{"line_number":37,"context_line":")"},{"line_number":38,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":39,"context_line":"    UnsetBgpvpnResAssoc,"},{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class BgpvpnRouterAssoc:"},{"line_number":44,"context_line":"    _assoc_res_name \u003d constants.ROUTER_RESOURCE_NAME"}],"source_content_type":"text/x-python","patch_set":2,"id":"a19005f0_fd3e8ae8","line":41,"range":{"start_line":23,"start_character":0,"end_line":41,"end_character":1},"in_reply_to":"e6d03509_582172d8","updated":"2026-03-06 15:25:55.000000000","message":"It\u0027s written in HACKING.rst but nothing automates it.","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class BgpvpnRouterAssoc:"},{"line_number":44,"context_line":"    _assoc_res_name \u003d constants.ROUTER_RESOURCE_NAME"},{"line_number":45,"context_line":"    _resource \u003d constants.ROUTER_ASSOC"},{"line_number":46,"context_line":"    _resource_plural \u003d constants.ROUTER_ASSOCS"}],"source_content_type":"text/x-python","patch_set":2,"id":"82a34f7e_513242cd","line":43,"updated":"2026-03-04 12:47:48.000000000","message":"This is a nit, but could we use `BGPVPN` everywhere and `s/Assoc/Association/`?\n\n```suggestion\nclass BGPVPNRouterAssociation:\n```\n\nHopefully this is just a case of `sed -i`","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class BgpvpnRouterAssoc:"},{"line_number":44,"context_line":"    _assoc_res_name \u003d constants.ROUTER_RESOURCE_NAME"},{"line_number":45,"context_line":"    _resource \u003d constants.ROUTER_ASSOC"},{"line_number":46,"context_line":"    _resource_plural \u003d constants.ROUTER_ASSOCS"}],"source_content_type":"text/x-python","patch_set":2,"id":"a14f9c1b_fc418b4e","line":43,"in_reply_to":"82a34f7e_513242cd","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import typing as ty"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from openstackclient.i18n import _"},{"line_number":22,"context_line":"from openstackclient.network.v2.bgpvpn import constants"}],"source_content_type":"text/x-python","patch_set":4,"id":"dc2d27c7_af1f547c","line":19,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\nfrom osc_lib import utils as osc_utils\nfrom osc_lib.utils import columns as column_util\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import typing as ty"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from openstackclient.i18n import _"},{"line_number":22,"context_line":"from openstackclient.network.v2.bgpvpn import constants"}],"source_content_type":"text/x-python","patch_set":4,"id":"f06df064_89eac23f","line":19,"in_reply_to":"dc2d27c7_af1f547c","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":43,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":44,"context_line":"        ),"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":"    _formatters: dict[str, ty.Any] \u003d {}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _get_common_parser(self, parser):"},{"line_number":49,"context_line":"        \"\"\"Adds to parser arguments common to create, set and unset commands."}],"source_content_type":"text/x-python","patch_set":4,"id":"da5d4378_35b08b23","line":46,"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n    _formatters: dict[str, osc_utils.FormatterT] \u003d {}\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":44,"context_line":"        ),"},{"line_number":45,"context_line":"    )"},{"line_number":46,"context_line":"    _formatters: dict[str, ty.Any] \u003d {}"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _get_common_parser(self, parser):"},{"line_number":49,"context_line":"        \"\"\"Adds to parser arguments common to create, set and unset commands."}],"source_content_type":"text/x-python","patch_set":4,"id":"e7b88434_e14fb3d4","line":46,"in_reply_to":"da5d4378_35b08b23","updated":"2026-04-15 13:03:28.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class CreateBgpvpnRouterAssoc("},{"line_number":88,"context_line":"    BGPVPNRouterAssociation, resource_association.CreateBgpvpnResAssoc"},{"line_number":89,"context_line":"):"},{"line_number":90,"context_line":"    _description \u003d _(\"Create a BGP VPN router association\")"},{"line_number":91,"context_line":"    pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class SetBgpvpnRouterAssoc("}],"source_content_type":"text/x-python","patch_set":4,"id":"a67cc327_a3205b2e","line":91,"range":{"start_line":89,"start_character":2,"end_line":91,"end_character":8},"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n):\n    _description \u003d _(\"Create a BGP VPN router association\")\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"68b8cf48d0dc1ee7f2313b2a9cd5cd4a70d78249","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class CreateBgpvpnRouterAssoc("},{"line_number":88,"context_line":"    BGPVPNRouterAssociation, resource_association.CreateBgpvpnResAssoc"},{"line_number":89,"context_line":"):"},{"line_number":90,"context_line":"    _description \u003d _(\"Create a BGP VPN router association\")"},{"line_number":91,"context_line":"    pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class SetBgpvpnRouterAssoc("}],"source_content_type":"text/x-python","patch_set":4,"id":"694a87a3_5e73b064","line":91,"range":{"start_line":89,"start_character":2,"end_line":91,"end_character":8},"in_reply_to":"a67cc327_a3205b2e","updated":"2026-04-15 13:03:28.000000000","message":"my bad, removed","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":102,"context_line":"):"},{"line_number":103,"context_line":"    _description \u003d _(\"Unset BGP VPN router association properties\")"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class DeleteBgpvpnRouterAssoc("},{"line_number":107,"context_line":"    BGPVPNRouterAssociation, resource_association.DeleteBgpvpnResAssoc"},{"line_number":108,"context_line":"):"},{"line_number":109,"context_line":"    _description \u003d _("},{"line_number":110,"context_line":"        \"Delete a BGP VPN router association(s) for a given BGP VPN\""},{"line_number":111,"context_line":"    )"},{"line_number":112,"context_line":"    pass"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ListBgpvpnRouterAssoc("},{"line_number":116,"context_line":"    BGPVPNRouterAssociation, resource_association.ListBgpvpnResAssoc"},{"line_number":117,"context_line":"):"},{"line_number":118,"context_line":"    _description \u003d _(\"List BGP VPN router associations for a given BGP VPN\")"},{"line_number":119,"context_line":"    pass"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class ShowBgpvpnRouterAssoc("},{"line_number":123,"context_line":"    BGPVPNRouterAssociation, resource_association.ShowBgpvpnResAssoc"},{"line_number":124,"context_line":"):"},{"line_number":125,"context_line":"    _description \u003d _(\"Show information of a given BGP VPN router association\")"},{"line_number":126,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"2af5dc01_4be71bf5","line":126,"range":{"start_line":105,"start_character":1,"end_line":126,"end_character":8},"updated":"2026-03-09 18:16:18.000000000","message":"```suggestion\n\nclass DeleteBgpvpnRouterAssoc(\n    BGPVPNRouterAssociation, resource_association.DeleteBgpvpnResAssoc\n):\n    _description \u003d _(\n        \"Delete a BGP VPN router association(s) for a given BGP VPN\"\n    )\n\n\nclass ListBgpvpnRouterAssoc(\n    BGPVPNRouterAssociation, resource_association.ListBgpvpnResAssoc\n):\n    _description \u003d _(\"List BGP VPN router associations for a given BGP VPN\")\n\n\nclass ShowBgpvpnRouterAssoc(\n    BGPVPNRouterAssociation, resource_association.ShowBgpvpnResAssoc\n):\n    _description \u003d _(\"Show information of a given BGP VPN router association\")\n```","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":102,"context_line":"):"},{"line_number":103,"context_line":"    _description \u003d _(\"Unset BGP VPN router association properties\")"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class DeleteBgpvpnRouterAssoc("},{"line_number":107,"context_line":"    BGPVPNRouterAssociation, resource_association.DeleteBgpvpnResAssoc"},{"line_number":108,"context_line":"):"},{"line_number":109,"context_line":"    _description \u003d _("},{"line_number":110,"context_line":"        \"Delete a BGP VPN router association(s) for a given BGP VPN\""},{"line_number":111,"context_line":"    )"},{"line_number":112,"context_line":"    pass"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class ListBgpvpnRouterAssoc("},{"line_number":116,"context_line":"    BGPVPNRouterAssociation, resource_association.ListBgpvpnResAssoc"},{"line_number":117,"context_line":"):"},{"line_number":118,"context_line":"    _description \u003d _(\"List BGP VPN router associations for a given BGP VPN\")"},{"line_number":119,"context_line":"    pass"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"class ShowBgpvpnRouterAssoc("},{"line_number":123,"context_line":"    BGPVPNRouterAssociation, resource_association.ShowBgpvpnResAssoc"},{"line_number":124,"context_line":"):"},{"line_number":125,"context_line":"    _description \u003d _(\"Show information of a given BGP VPN router association\")"},{"line_number":126,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"ea3e561e_8188b7c5","line":126,"range":{"start_line":105,"start_character":1,"end_line":126,"end_character":8},"in_reply_to":"2af5dc01_4be71bf5","updated":"2026-04-21 16:05:00.000000000","message":"as I split the resource_assoc stuff, it is fine as I see, all the x_association things has their own code, classes etc","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_attr_map \u003d ("},{"line_number":32,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":33,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":34,"context_line":"    (\u0027router_id\u0027, \u0027Router ID\u0027, column_util.LIST_BOTH),"},{"line_number":35,"context_line":"    ("},{"line_number":36,"context_line":"        \u0027advertise_extra_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"938c1c11_4a79a23d","line":33,"updated":"2026-04-29 03:41:19.000000000","message":"Same comment here and below as other files","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"_attr_map \u003d ("},{"line_number":32,"context_line":"    (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":33,"context_line":"    (\u0027tenant_id\u0027, \u0027Project\u0027, column_util.LIST_LONG_ONLY),"},{"line_number":34,"context_line":"    (\u0027router_id\u0027, \u0027Router ID\u0027, column_util.LIST_BOTH),"},{"line_number":35,"context_line":"    ("},{"line_number":36,"context_line":"        \u0027advertise_extra_routes\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"273eafd8_d0f92257","line":33,"in_reply_to":"938c1c11_4a79a23d","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def _get_columns(item):"},{"line_number":45,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":46,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":47,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":48,"context_line":"        item, column_map, hidden_columns"},{"line_number":49,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"6d767558_6e1ff50a","line":46,"updated":"2026-04-29 03:41:19.000000000","message":"Same","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def _get_columns(item):"},{"line_number":45,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":46,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027name\u0027, \u0027project_id\u0027]"},{"line_number":47,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":48,"context_line":"        item, column_map, hidden_columns"},{"line_number":49,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":10,"id":"c9e158d6_dd7be58c","line":46,"in_reply_to":"6d767558_6e1ff50a","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":115,"context_line":"                parsed_args.project,"},{"line_number":116,"context_line":"                parsed_args.project_domain,"},{"line_number":117,"context_line":"            ).id"},{"line_number":118,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        body.update(_args2body(\u0027create\u0027, parsed_args))"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"0c550f07_13864e9d","line":118,"updated":"2026-04-29 03:41:19.000000000","message":"Same","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                parsed_args.project,"},{"line_number":116,"context_line":"                parsed_args.project_domain,"},{"line_number":117,"context_line":"            ).id"},{"line_number":118,"context_line":"            body[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        body.update(_args2body(\u0027create\u0027, parsed_args))"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"64514460_b6493af4","line":118,"in_reply_to":"0c550f07_13864e9d","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/shell.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":32,"context_line":"IGNORED_MODULES \u003d ("},{"line_number":33,"context_line":"    \u0027neutron_taas.taas_client.osc\u0027,"},{"line_number":34,"context_line":"    \u0027neutronclient.osc.v2.taas\u0027,"},{"line_number":35,"context_line":"    \u0027neutronclient.osc.v2.networking_bgpvpn\u0027,"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3eff1eb0_3992c7eb","line":35,"updated":"2026-03-04 12:47:48.000000000","message":"Am I correct in understanding that these commands were never shipped via a separate package in `networking-bgpvpn` like the TaaS commands were?","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":true,"context_lines":[{"line_number":32,"context_line":"IGNORED_MODULES \u003d ("},{"line_number":33,"context_line":"    \u0027neutron_taas.taas_client.osc\u0027,"},{"line_number":34,"context_line":"    \u0027neutronclient.osc.v2.taas\u0027,"},{"line_number":35,"context_line":"    \u0027neutronclient.osc.v2.networking_bgpvpn\u0027,"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a4e856c9_57962f46","line":35,"in_reply_to":"3eff1eb0_3992c7eb","updated":"2026-03-06 14:14:06.000000000","message":"as far as my historical knowledge helps me I think it was always in neutronclient.","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9a610cccc29d939b404f8b68ed724a9f6d470385","unresolved":false,"context_lines":[{"line_number":32,"context_line":"IGNORED_MODULES \u003d ("},{"line_number":33,"context_line":"    \u0027neutron_taas.taas_client.osc\u0027,"},{"line_number":34,"context_line":"    \u0027neutronclient.osc.v2.taas\u0027,"},{"line_number":35,"context_line":"    \u0027neutronclient.osc.v2.networking_bgpvpn\u0027,"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fbe2b9f5_9d11ccbe","line":35,"in_reply_to":"a4e856c9_57962f46","updated":"2026-03-06 15:25:55.000000000","message":"Acknowledged","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"}],"openstackclient/tests/unit/network/v2/bgpvpn/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":23,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":26,"context_line":"    CreateBgpvpnResAssoc,"},{"line_number":27,"context_line":")"},{"line_number":28,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":29,"context_line":"    DeleteBgpvpnResAssoc,"},{"line_number":30,"context_line":")"},{"line_number":31,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":32,"context_line":"    ListBgpvpnResAssoc,"},{"line_number":33,"context_line":")"},{"line_number":34,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":35,"context_line":"    SetBgpvpnResAssoc,"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":38,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":41,"context_line":"    UnsetBgpvpnResAssoc,"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":44,"context_line":"    CreateBgpvpnRouterAssoc,"},{"line_number":45,"context_line":")"},{"line_number":46,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":47,"context_line":"    SetBgpvpnRouterAssoc,"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":50,"context_line":"    ShowBgpvpnRouterAssoc,"},{"line_number":51,"context_line":")"},{"line_number":52,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as test_fakes"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fbef09f9_88da47d2","line":51,"range":{"start_line":25,"start_character":0,"end_line":51,"end_character":1},"updated":"2026-03-04 12:47:48.000000000","message":"Let\u0027s stick with importing modules, not objects.\n\n```suggestion\nfrom openstackclient.network.v2.bgpvpn import resource_association\n```","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from osc_lib.cli import identity as osc_id"},{"line_number":23,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":26,"context_line":"    CreateBgpvpnResAssoc,"},{"line_number":27,"context_line":")"},{"line_number":28,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":29,"context_line":"    DeleteBgpvpnResAssoc,"},{"line_number":30,"context_line":")"},{"line_number":31,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":32,"context_line":"    ListBgpvpnResAssoc,"},{"line_number":33,"context_line":")"},{"line_number":34,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":35,"context_line":"    SetBgpvpnResAssoc,"},{"line_number":36,"context_line":")"},{"line_number":37,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":38,"context_line":"    ShowBgpvpnResAssoc,"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":"from openstackclient.network.v2.bgpvpn.resource_association import ("},{"line_number":41,"context_line":"    UnsetBgpvpnResAssoc,"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":44,"context_line":"    CreateBgpvpnRouterAssoc,"},{"line_number":45,"context_line":")"},{"line_number":46,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":47,"context_line":"    SetBgpvpnRouterAssoc,"},{"line_number":48,"context_line":")"},{"line_number":49,"context_line":"from openstackclient.network.v2.bgpvpn.router_association import ("},{"line_number":50,"context_line":"    ShowBgpvpnRouterAssoc,"},{"line_number":51,"context_line":")"},{"line_number":52,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as test_fakes"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"384201c5_a9a724be","line":51,"range":{"start_line":25,"start_character":0,"end_line":51,"end_character":1},"in_reply_to":"fbef09f9_88da47d2","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":33,"context_line":"class TestNeutronClientBgpvpn(test_fakes.TestNetworkV2):"},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super().setUp()"},{"line_number":36,"context_line":"        osc_id.find_project \u003d mock.Mock("},{"line_number":37,"context_line":"            side_effect\u003dlambda _, name_or_id, __: mock.Mock(id\u003dname_or_id)"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        # Access attributes to ensure they exist as mocks"},{"line_number":40,"context_line":"        self.network_client.find_fake_resource \u003d mock.Mock()  # noqa: O402"},{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ea01666_42c223a4","line":38,"range":{"start_line":36,"start_character":0,"end_line":38,"end_character":9},"updated":"2026-03-06 16:07:37.000000000","message":"Let\u0027s not assign mocks: it tends to bleed over into other tests. The identity Proxy API should already be mocked. If something else needs mocking, it\u0027s better to do it in a test\u0027s `setUp` using the mock fixture, else per test using the standard decorator or context manager patterns.","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":false,"context_lines":[{"line_number":33,"context_line":"class TestNeutronClientBgpvpn(test_fakes.TestNetworkV2):"},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super().setUp()"},{"line_number":36,"context_line":"        osc_id.find_project \u003d mock.Mock("},{"line_number":37,"context_line":"            side_effect\u003dlambda _, name_or_id, __: mock.Mock(id\u003dname_or_id)"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        # Access attributes to ensure they exist as mocks"},{"line_number":40,"context_line":"        self.network_client.find_fake_resource \u003d mock.Mock()  # noqa: O402"},{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"}],"source_content_type":"text/x-python","patch_set":3,"id":"94fdbaf4_5958ba05","line":38,"range":{"start_line":36,"start_character":0,"end_line":38,"end_character":9},"in_reply_to":"20775200_b20bd7e7","updated":"2026-03-09 18:16:18.000000000","message":"Done","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":true,"context_lines":[{"line_number":33,"context_line":"class TestNeutronClientBgpvpn(test_fakes.TestNetworkV2):"},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super().setUp()"},{"line_number":36,"context_line":"        osc_id.find_project \u003d mock.Mock("},{"line_number":37,"context_line":"            side_effect\u003dlambda _, name_or_id, __: mock.Mock(id\u003dname_or_id)"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        # Access attributes to ensure they exist as mocks"},{"line_number":40,"context_line":"        self.network_client.find_fake_resource \u003d mock.Mock()  # noqa: O402"},{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"}],"source_content_type":"text/x-python","patch_set":3,"id":"20775200_b20bd7e7","line":38,"range":{"start_line":36,"start_character":0,"end_line":38,"end_character":9},"in_reply_to":"5ea01666_42c223a4","updated":"2026-03-09 15:46:50.000000000","message":"I hope I killed all these, and changed them to decorator","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":35,"context_line":"        super().setUp()"},{"line_number":36,"context_line":"        osc_id.find_project \u003d mock.Mock("},{"line_number":37,"context_line":"            side_effect\u003dlambda _, name_or_id, __: mock.Mock(id\u003dname_or_id)"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        # Access attributes to ensure they exist as mocks"},{"line_number":40,"context_line":"        self.network_client.find_fake_resource \u003d mock.Mock()  # noqa: O402"},{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def create_one_bgpvpn(attrs\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ee018f0_867c692c","line":41,"range":{"start_line":38,"start_character":9,"end_line":41,"end_character":93},"updated":"2026-03-06 16:07:37.000000000","message":"You shouldn\u0027t need to do this. We autospec our mocks, so as long as it\u0027s defined in `openstack.network.v2._proxy.Proxy` it will appear in `self.neutron_client`. That\u0027s what the O402 check is there to show.\n\nI also don\u0027t believe you are using either of these?","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super().setUp()"},{"line_number":36,"context_line":"        osc_id.find_project \u003d mock.Mock("},{"line_number":37,"context_line":"            side_effect\u003dlambda _, name_or_id, __: mock.Mock(id\u003dname_or_id)"},{"line_number":38,"context_line":"        )"},{"line_number":39,"context_line":"        # Access attributes to ensure they exist as mocks"},{"line_number":40,"context_line":"        self.network_client.find_fake_resource \u003d mock.Mock()  # noqa: O402"},{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def create_one_bgpvpn(attrs\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b9b243f5_8a0de725","line":41,"range":{"start_line":38,"start_character":9,"end_line":41,"end_character":93},"in_reply_to":"1ee018f0_867c692c","updated":"2026-03-09 15:46:50.000000000","message":"Done","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def create_one_bgpvpn(attrs\u003dNone):"},{"line_number":45,"context_line":"    \"\"\"Create a fake BGP VPN.\"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    attrs \u003d attrs or {}"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"85048698_7a495129","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":2},"updated":"2026-03-06 16:07:37.000000000","message":"as an aside, you know about the `openstack.test.fakes` module, yeah?\n\nhttps://github.com/openstack/openstacksdk/blob/4.10.0/openstack/test/fakes.py#L37\n\nYou don\u0027t have to use it here, but we do use it in a few places in OSC and it might be a nice follow-up.","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def create_one_bgpvpn(attrs\u003dNone):"},{"line_number":45,"context_line":"    \"\"\"Create a fake BGP VPN.\"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    attrs \u003d attrs or {}"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"40236230_cc369269","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":2},"in_reply_to":"5269b59c_f0544a18","updated":"2026-03-09 18:16:18.000000000","message":"Acknowledged","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association \u003d mock.Mock()  # noqa: O402"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def create_one_bgpvpn(attrs\u003dNone):"},{"line_number":45,"context_line":"    \"\"\"Create a fake BGP VPN.\"\"\""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    attrs \u003d attrs or {}"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5269b59c_f0544a18","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":2},"in_reply_to":"85048698_7a495129","updated":"2026-03-09 15:46:50.000000000","message":"good idea, I played with it and found some examples in network/v2 also","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":177,"context_line":"    pass"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class FakeResource(sdk_resource.Resource):"},{"line_number":181,"context_line":"    resource_key \u003d \u0027fakeresource\u0027"},{"line_number":182,"context_line":"    resources_key \u003d \u0027fakeresources\u0027"},{"line_number":183,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresources\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"dd9b92ca_079245ca","line":180,"updated":"2026-03-06 16:07:37.000000000","message":"I don\u0027t really get the point of this test. Are we missing something from SDK?","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    pass"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class FakeResource(sdk_resource.Resource):"},{"line_number":181,"context_line":"    resource_key \u003d \u0027fakeresource\u0027"},{"line_number":182,"context_line":"    resources_key \u003d \u0027fakeresources\u0027"},{"line_number":183,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresources\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7dee968c_782e368a","line":180,"in_reply_to":"dcdc7b0a_14039171","updated":"2026-03-09 18:16:18.000000000","message":"Done","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":true,"context_lines":[{"line_number":177,"context_line":"    pass"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"class FakeResource(sdk_resource.Resource):"},{"line_number":181,"context_line":"    resource_key \u003d \u0027fakeresource\u0027"},{"line_number":182,"context_line":"    resources_key \u003d \u0027fakeresources\u0027"},{"line_number":183,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresources\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"dcdc7b0a_14039171","line":180,"in_reply_to":"dd9b92ca_079245ca","updated":"2026-03-09 15:46:50.000000000","message":"good idea, I removed it","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":196,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"class FakeResoureAssociation(sdk_resource.Resource):"},{"line_number":200,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":201,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":202,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"6c276ffb_31b5d9d9","line":199,"updated":"2026-03-06 16:07:37.000000000","message":"```suggestion\nclass FakeResourceAssociation(sdk_resource.Resource):\n```","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":false,"context_lines":[{"line_number":196,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"class FakeResoureAssociation(sdk_resource.Resource):"},{"line_number":200,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":201,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":202,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"d4960b36_cc950ac6","line":199,"in_reply_to":"6c276ffb_31b5d9d9","updated":"2026-03-09 15:46:50.000000000","message":"Done","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return bgpvpns"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class BgpvpnFakeAssoc:"},{"line_number":79,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":80,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":81,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    _attr_map \u003d ("},{"line_number":84,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":85,"context_line":"        ("},{"line_number":86,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":87,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":88,"context_line":"            column_util.LIST_BOTH,"},{"line_number":89,"context_line":"        ),"},{"line_number":90,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":91,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    _formatters \u003d {}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class CreateBgpvpnFakeResAssoc("},{"line_number":97,"context_line":"    BgpvpnFakeAssoc, resource_association.CreateBgpvpnResAssoc"},{"line_number":98,"context_line":"):"},{"line_number":99,"context_line":"    pass"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetBgpvpnFakeResAssoc("},{"line_number":103,"context_line":"    BgpvpnFakeAssoc, resource_association.SetBgpvpnResAssoc"},{"line_number":104,"context_line":"):"},{"line_number":105,"context_line":"    pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class UnsetBgpvpnFakeResAssoc("},{"line_number":109,"context_line":"    BgpvpnFakeAssoc, resource_association.UnsetBgpvpnResAssoc"},{"line_number":110,"context_line":"):"},{"line_number":111,"context_line":"    pass"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class DeleteBgpvpnFakeResAssoc("},{"line_number":115,"context_line":"    BgpvpnFakeAssoc, resource_association.DeleteBgpvpnResAssoc"},{"line_number":116,"context_line":"):"},{"line_number":117,"context_line":"    pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class ListBgpvpnFakeResAssoc("},{"line_number":121,"context_line":"    BgpvpnFakeAssoc, resource_association.ListBgpvpnResAssoc"},{"line_number":122,"context_line":"):"},{"line_number":123,"context_line":"    pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class ShowBgpvpnFakeResAssoc("},{"line_number":127,"context_line":"    BgpvpnFakeAssoc, resource_association.ShowBgpvpnResAssoc"},{"line_number":128,"context_line":"):"},{"line_number":129,"context_line":"    pass"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class BgpvpnFakeRouterAssoc:"},{"line_number":133,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":134,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":135,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    _attr_map \u003d ("},{"line_number":138,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":139,"context_line":"        ("},{"line_number":140,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":141,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":142,"context_line":"            column_util.LIST_BOTH,"},{"line_number":143,"context_line":"        ),"},{"line_number":144,"context_line":"        ("},{"line_number":145,"context_line":"            \u0027advertise_extra_routes\u0027,"},{"line_number":146,"context_line":"            \u0027Advertise extra routes\u0027,"},{"line_number":147,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":148,"context_line":"        ),"},{"line_number":149,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":150,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":151,"context_line":"    )"},{"line_number":152,"context_line":"    _formatters \u003d {}"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class CreateBgpvpnFakeRouterAssoc("},{"line_number":156,"context_line":"    BgpvpnFakeRouterAssoc, router_association.CreateBgpvpnRouterAssoc"},{"line_number":157,"context_line":"):"},{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class SetBgpvpnFakeRouterAssoc("},{"line_number":162,"context_line":"    BgpvpnFakeRouterAssoc, router_association.SetBgpvpnRouterAssoc"},{"line_number":163,"context_line":"):"},{"line_number":164,"context_line":"    pass"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class ShowBgpvpnFakeRouterAssoc("},{"line_number":168,"context_line":"    BgpvpnFakeRouterAssoc, router_association.ShowBgpvpnRouterAssoc"},{"line_number":169,"context_line":"):"},{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"18515f47_072a5d00","line":171,"range":{"start_line":77,"start_character":1,"end_line":171,"end_character":1},"updated":"2026-03-09 18:16:18.000000000","message":"I\u0027m still really confused about why we need these? Why can\u0027t we use the actual commands in the tests? It\u0027s easy to mock SDK: we shouldn\u0027t need to provide entirely fake resource classes like this?","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return bgpvpns"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class BgpvpnFakeAssoc:"},{"line_number":79,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":80,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":81,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    _attr_map \u003d ("},{"line_number":84,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":85,"context_line":"        ("},{"line_number":86,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":87,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":88,"context_line":"            column_util.LIST_BOTH,"},{"line_number":89,"context_line":"        ),"},{"line_number":90,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":91,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    _formatters \u003d {}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class CreateBgpvpnFakeResAssoc("},{"line_number":97,"context_line":"    BgpvpnFakeAssoc, resource_association.CreateBgpvpnResAssoc"},{"line_number":98,"context_line":"):"},{"line_number":99,"context_line":"    pass"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetBgpvpnFakeResAssoc("},{"line_number":103,"context_line":"    BgpvpnFakeAssoc, resource_association.SetBgpvpnResAssoc"},{"line_number":104,"context_line":"):"},{"line_number":105,"context_line":"    pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class UnsetBgpvpnFakeResAssoc("},{"line_number":109,"context_line":"    BgpvpnFakeAssoc, resource_association.UnsetBgpvpnResAssoc"},{"line_number":110,"context_line":"):"},{"line_number":111,"context_line":"    pass"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class DeleteBgpvpnFakeResAssoc("},{"line_number":115,"context_line":"    BgpvpnFakeAssoc, resource_association.DeleteBgpvpnResAssoc"},{"line_number":116,"context_line":"):"},{"line_number":117,"context_line":"    pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class ListBgpvpnFakeResAssoc("},{"line_number":121,"context_line":"    BgpvpnFakeAssoc, resource_association.ListBgpvpnResAssoc"},{"line_number":122,"context_line":"):"},{"line_number":123,"context_line":"    pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class ShowBgpvpnFakeResAssoc("},{"line_number":127,"context_line":"    BgpvpnFakeAssoc, resource_association.ShowBgpvpnResAssoc"},{"line_number":128,"context_line":"):"},{"line_number":129,"context_line":"    pass"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class BgpvpnFakeRouterAssoc:"},{"line_number":133,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":134,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":135,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    _attr_map \u003d ("},{"line_number":138,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":139,"context_line":"        ("},{"line_number":140,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":141,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":142,"context_line":"            column_util.LIST_BOTH,"},{"line_number":143,"context_line":"        ),"},{"line_number":144,"context_line":"        ("},{"line_number":145,"context_line":"            \u0027advertise_extra_routes\u0027,"},{"line_number":146,"context_line":"            \u0027Advertise extra routes\u0027,"},{"line_number":147,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":148,"context_line":"        ),"},{"line_number":149,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":150,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":151,"context_line":"    )"},{"line_number":152,"context_line":"    _formatters \u003d {}"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class CreateBgpvpnFakeRouterAssoc("},{"line_number":156,"context_line":"    BgpvpnFakeRouterAssoc, router_association.CreateBgpvpnRouterAssoc"},{"line_number":157,"context_line":"):"},{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class SetBgpvpnFakeRouterAssoc("},{"line_number":162,"context_line":"    BgpvpnFakeRouterAssoc, router_association.SetBgpvpnRouterAssoc"},{"line_number":163,"context_line":"):"},{"line_number":164,"context_line":"    pass"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class ShowBgpvpnFakeRouterAssoc("},{"line_number":168,"context_line":"    BgpvpnFakeRouterAssoc, router_association.ShowBgpvpnRouterAssoc"},{"line_number":169,"context_line":"):"},{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"f97649dc_e11ccdc7","line":171,"range":{"start_line":77,"start_character":1,"end_line":171,"end_character":1},"in_reply_to":"18515f47_072a5d00","updated":"2026-04-21 16:05:00.000000000","message":"As","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return bgpvpns"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class BgpvpnFakeAssoc:"},{"line_number":79,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":80,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":81,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    _attr_map \u003d ("},{"line_number":84,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":85,"context_line":"        ("},{"line_number":86,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":87,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":88,"context_line":"            column_util.LIST_BOTH,"},{"line_number":89,"context_line":"        ),"},{"line_number":90,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":91,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    _formatters \u003d {}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class CreateBgpvpnFakeResAssoc("},{"line_number":97,"context_line":"    BgpvpnFakeAssoc, resource_association.CreateBgpvpnResAssoc"},{"line_number":98,"context_line":"):"},{"line_number":99,"context_line":"    pass"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetBgpvpnFakeResAssoc("},{"line_number":103,"context_line":"    BgpvpnFakeAssoc, resource_association.SetBgpvpnResAssoc"},{"line_number":104,"context_line":"):"},{"line_number":105,"context_line":"    pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class UnsetBgpvpnFakeResAssoc("},{"line_number":109,"context_line":"    BgpvpnFakeAssoc, resource_association.UnsetBgpvpnResAssoc"},{"line_number":110,"context_line":"):"},{"line_number":111,"context_line":"    pass"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class DeleteBgpvpnFakeResAssoc("},{"line_number":115,"context_line":"    BgpvpnFakeAssoc, resource_association.DeleteBgpvpnResAssoc"},{"line_number":116,"context_line":"):"},{"line_number":117,"context_line":"    pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class ListBgpvpnFakeResAssoc("},{"line_number":121,"context_line":"    BgpvpnFakeAssoc, resource_association.ListBgpvpnResAssoc"},{"line_number":122,"context_line":"):"},{"line_number":123,"context_line":"    pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class ShowBgpvpnFakeResAssoc("},{"line_number":127,"context_line":"    BgpvpnFakeAssoc, resource_association.ShowBgpvpnResAssoc"},{"line_number":128,"context_line":"):"},{"line_number":129,"context_line":"    pass"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class BgpvpnFakeRouterAssoc:"},{"line_number":133,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":134,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":135,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    _attr_map \u003d ("},{"line_number":138,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":139,"context_line":"        ("},{"line_number":140,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":141,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":142,"context_line":"            column_util.LIST_BOTH,"},{"line_number":143,"context_line":"        ),"},{"line_number":144,"context_line":"        ("},{"line_number":145,"context_line":"            \u0027advertise_extra_routes\u0027,"},{"line_number":146,"context_line":"            \u0027Advertise extra routes\u0027,"},{"line_number":147,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":148,"context_line":"        ),"},{"line_number":149,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":150,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":151,"context_line":"    )"},{"line_number":152,"context_line":"    _formatters \u003d {}"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class CreateBgpvpnFakeRouterAssoc("},{"line_number":156,"context_line":"    BgpvpnFakeRouterAssoc, router_association.CreateBgpvpnRouterAssoc"},{"line_number":157,"context_line":"):"},{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class SetBgpvpnFakeRouterAssoc("},{"line_number":162,"context_line":"    BgpvpnFakeRouterAssoc, router_association.SetBgpvpnRouterAssoc"},{"line_number":163,"context_line":"):"},{"line_number":164,"context_line":"    pass"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class ShowBgpvpnFakeRouterAssoc("},{"line_number":168,"context_line":"    BgpvpnFakeRouterAssoc, router_association.ShowBgpvpnRouterAssoc"},{"line_number":169,"context_line":"):"},{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"01f82f82_fc4698cd","line":171,"range":{"start_line":77,"start_character":1,"end_line":171,"end_character":1},"in_reply_to":"18515f47_072a5d00","updated":"2026-04-21 16:05:00.000000000","message":"as the resource_assoc code was split, this is not needed anymore","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"04c9ca3ae93d53d39250624bebda0031a1fbd620","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    return bgpvpns"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"class BgpvpnFakeAssoc:"},{"line_number":79,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":80,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":81,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    _attr_map \u003d ("},{"line_number":84,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":85,"context_line":"        ("},{"line_number":86,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":87,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":88,"context_line":"            column_util.LIST_BOTH,"},{"line_number":89,"context_line":"        ),"},{"line_number":90,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":91,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":92,"context_line":"    )"},{"line_number":93,"context_line":"    _formatters \u003d {}"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"class CreateBgpvpnFakeResAssoc("},{"line_number":97,"context_line":"    BgpvpnFakeAssoc, resource_association.CreateBgpvpnResAssoc"},{"line_number":98,"context_line":"):"},{"line_number":99,"context_line":"    pass"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"class SetBgpvpnFakeResAssoc("},{"line_number":103,"context_line":"    BgpvpnFakeAssoc, resource_association.SetBgpvpnResAssoc"},{"line_number":104,"context_line":"):"},{"line_number":105,"context_line":"    pass"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class UnsetBgpvpnFakeResAssoc("},{"line_number":109,"context_line":"    BgpvpnFakeAssoc, resource_association.UnsetBgpvpnResAssoc"},{"line_number":110,"context_line":"):"},{"line_number":111,"context_line":"    pass"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"class DeleteBgpvpnFakeResAssoc("},{"line_number":115,"context_line":"    BgpvpnFakeAssoc, resource_association.DeleteBgpvpnResAssoc"},{"line_number":116,"context_line":"):"},{"line_number":117,"context_line":"    pass"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"class ListBgpvpnFakeResAssoc("},{"line_number":121,"context_line":"    BgpvpnFakeAssoc, resource_association.ListBgpvpnResAssoc"},{"line_number":122,"context_line":"):"},{"line_number":123,"context_line":"    pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"class ShowBgpvpnFakeResAssoc("},{"line_number":127,"context_line":"    BgpvpnFakeAssoc, resource_association.ShowBgpvpnResAssoc"},{"line_number":128,"context_line":"):"},{"line_number":129,"context_line":"    pass"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"class BgpvpnFakeRouterAssoc:"},{"line_number":133,"context_line":"    _assoc_res_name \u003d \u0027fake_resource\u0027"},{"line_number":134,"context_line":"    _resource \u003d f\u0027{_assoc_res_name}_association\u0027"},{"line_number":135,"context_line":"    _resource_plural \u003d f\u0027{_resource}s\u0027"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    _attr_map \u003d ("},{"line_number":138,"context_line":"        (\u0027id\u0027, \u0027ID\u0027, column_util.LIST_BOTH),"},{"line_number":139,"context_line":"        ("},{"line_number":140,"context_line":"            f\u0027{_assoc_res_name}_id\u0027,"},{"line_number":141,"context_line":"            f\u0027{_assoc_res_name.capitalize()} ID\u0027,"},{"line_number":142,"context_line":"            column_util.LIST_BOTH,"},{"line_number":143,"context_line":"        ),"},{"line_number":144,"context_line":"        ("},{"line_number":145,"context_line":"            \u0027advertise_extra_routes\u0027,"},{"line_number":146,"context_line":"            \u0027Advertise extra routes\u0027,"},{"line_number":147,"context_line":"            column_util.LIST_LONG_ONLY,"},{"line_number":148,"context_line":"        ),"},{"line_number":149,"context_line":"        (\u0027name\u0027, \u0027Name\u0027, column_util.LIST_BOTH),"},{"line_number":150,"context_line":"        (\u0027project_id\u0027, \u0027Project ID\u0027, column_util.LIST_BOTH),"},{"line_number":151,"context_line":"    )"},{"line_number":152,"context_line":"    _formatters \u003d {}"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class CreateBgpvpnFakeRouterAssoc("},{"line_number":156,"context_line":"    BgpvpnFakeRouterAssoc, router_association.CreateBgpvpnRouterAssoc"},{"line_number":157,"context_line":"):"},{"line_number":158,"context_line":"    pass"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"class SetBgpvpnFakeRouterAssoc("},{"line_number":162,"context_line":"    BgpvpnFakeRouterAssoc, router_association.SetBgpvpnRouterAssoc"},{"line_number":163,"context_line":"):"},{"line_number":164,"context_line":"    pass"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"class ShowBgpvpnFakeRouterAssoc("},{"line_number":168,"context_line":"    BgpvpnFakeRouterAssoc, router_association.ShowBgpvpnRouterAssoc"},{"line_number":169,"context_line":"):"},{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"e44ebf80_3d518cf2","line":171,"range":{"start_line":77,"start_character":1,"end_line":171,"end_character":1},"in_reply_to":"f97649dc_e11ccdc7","updated":"2026-04-21 16:05:50.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"c36c9327_9dbf974c","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"updated":"2026-03-09 18:16:18.000000000","message":"Again, why are we doing this? Can\u0027t we use the `BgpVpnRouterAssociation` or `BgpVpnPortAssociation` classes from SDK?\n\n**Later:** Wait, is this so you can test the \"mixins\" in `openstackclient/network/v2/bgpvpn/resource_association.py`? If so, (a) I don\u0027t think we need to do that once we test the Commands they are actually used in and (b) maybe this is a sign that that code is a little too complicated for its own good and it would be better to duplicate things slightly (afaict, there are only two types of `*association` resource)?","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"6d7a44ff_729fa4cf","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"in_reply_to":"23f38ea3_35f61841","updated":"2026-04-21 16:05:00.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"743bc36a9f9d531d4796a9b097ccde686fd27b4f","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"23f38ea3_35f61841","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"in_reply_to":"409b10aa_fc81ef4a","updated":"2026-04-15 13:05:20.000000000","message":"After struggling with all the issues with the common resource_association things I removed all that logic and moved it to separate modules.\nI hope I fixed all the issues","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"750a777be5f53cc0b8b5804b477a4c2e3077f766","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"409b10aa_fc81ef4a","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"in_reply_to":"5ef13874_33d8d983","updated":"2026-03-10 12:52:07.000000000","message":"Okay, let\u0027s do this bit in a follow-up so.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5fa180db372913c1331018db40d9c43a283bc4f1","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"e862d35d_4dcfe4ef","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"in_reply_to":"c36c9327_9dbf974c","updated":"2026-03-09 18:17:01.000000000","message":"\u003e (afaict, there are only two types of *association resource)?\n\n`s/two/three/`","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"f4397bef0577eeebe9618c14701db54d8058a219","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    pass"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"class FakeResourceAssociation(sdk_resource.Resource):"},{"line_number":174,"context_line":"    resource_key \u003d \u0027fakeresourceassociation\u0027"},{"line_number":175,"context_line":"    resources_key \u003d \u0027fakeresourceassociations\u0027"},{"line_number":176,"context_line":"    base_path \u003d \u0027/bgpvpn/fakeresourceassociations\u0027"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    _allow_unknown_attrs_in_body \u003d True"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # capabilities"},{"line_number":181,"context_line":"    allow_create \u003d True"},{"line_number":182,"context_line":"    allow_fetch \u003d True"},{"line_number":183,"context_line":"    allow_commit \u003d True"},{"line_number":184,"context_line":"    allow_delete \u003d True"},{"line_number":185,"context_line":"    allow_list \u003d True"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    id \u003d sdk_resource.Body(\u0027id\u0027)"},{"line_number":188,"context_line":"    tenant_id \u003d sdk_resource.Body(\u0027tenant_id\u0027, deprecated\u003dTrue)"},{"line_number":189,"context_line":"    project_id \u003d sdk_resource.Body(\u0027project_id\u0027, alias\u003d\u0027tenant_id\u0027)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def create_one_resource(attrs\u003dNone):"},{"line_number":193,"context_line":"    \"\"\"Create a fake resource.\"\"\""},{"line_number":194,"context_line":"    attrs \u003d attrs or {}"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    res_attrs \u003d {"},{"line_number":197,"context_line":"        \u0027id\u0027: \u0027fake_resource_id\u0027,"},{"line_number":198,"context_line":"        #\u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":199,"context_line":"    }"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    res_attrs.update(attrs)"},{"line_number":202,"context_line":"    return sdk_resource.Resource(**res_attrs)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"def create_resources(attrs\u003dNone, count\u003d1):"},{"line_number":206,"context_line":"    \"\"\"Create multiple fake resources.\"\"\""},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    resources \u003d []"},{"line_number":209,"context_line":"    for i in range(0, count):"},{"line_number":210,"context_line":"        if attrs is None:"},{"line_number":211,"context_line":"            attrs \u003d {\u0027id\u0027: \u0027fake_id{i}\u0027}"},{"line_number":212,"context_line":"        elif getattr(attrs, \u0027id\u0027, None) is None:"},{"line_number":213,"context_line":"            attrs[\u0027id\u0027] \u003d \u0027fake_id{i}\u0027"},{"line_number":214,"context_line":"        resources.append(create_one_resource(attrs))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    return resources"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"def create_one_resource_association(resource, attrs\u003dNone):"},{"line_number":220,"context_line":"    \"\"\"Create a fake resource association.\"\"\""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    attrs \u003d attrs or {}"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    res_assoc_attrs \u003d {"},{"line_number":225,"context_line":"        \u0027id\u0027: \u0027fake_association_id\u0027,"},{"line_number":226,"context_line":"        \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":227,"context_line":"    }"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"    res_assoc_attrs.update(attrs)"},{"line_number":230,"context_line":"    return FakeResourceAssociation(**res_assoc_attrs)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"def create_resource_associations(resources):"},{"line_number":234,"context_line":"    \"\"\"Create multiple fake resource associations.\"\"\""},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    res_assocs \u003d []"},{"line_number":237,"context_line":"    for idx, resource in enumerate(resources):"},{"line_number":238,"context_line":"        res_assoc_attrs \u003d {"},{"line_number":239,"context_line":"            \u0027id\u0027: f\u0027fake_association_id{idx}\u0027,"},{"line_number":240,"context_line":"            \u0027fake_resource_id\u0027: resource[\u0027id\u0027],"},{"line_number":241,"context_line":"        }"},{"line_number":242,"context_line":"        res_assocs.append(copy.deepcopy(res_assoc_attrs))"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    return res_assocs"}],"source_content_type":"text/x-python","patch_set":4,"id":"5ef13874_33d8d983","line":244,"range":{"start_line":173,"start_character":0,"end_line":244,"end_character":21},"in_reply_to":"e862d35d_4dcfe4ef","updated":"2026-03-10 11:28:30.000000000","message":"If I understand well the original authors intention with the introduction of general resource_association they wanted to avoid code duplication and everything is the consequence of that original decision, and since than we keep that code.","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":40,"context_line":"    # Set default attributes."},{"line_number":41,"context_line":"    bgpvpn_attrs \u003d {"},{"line_number":42,"context_line":"        \u0027id\u0027: \u0027fake_bgpvpn_id\u0027,"},{"line_number":43,"context_line":"        \u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":44,"context_line":"        \u0027name\u0027: \u0027\u0027,"},{"line_number":45,"context_line":"        \u0027type\u0027: \u0027l3\u0027,"},{"line_number":46,"context_line":"        \u0027route_targets\u0027: [],"}],"source_content_type":"text/x-python","patch_set":10,"id":"ba795c83_49788430","line":43,"updated":"2026-04-29 03:41:19.000000000","message":"project_id should be used here and a number of places below","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    # Set default attributes."},{"line_number":41,"context_line":"    bgpvpn_attrs \u003d {"},{"line_number":42,"context_line":"        \u0027id\u0027: \u0027fake_bgpvpn_id\u0027,"},{"line_number":43,"context_line":"        \u0027tenant_id\u0027: _FAKE_PROJECT_ID,"},{"line_number":44,"context_line":"        \u0027name\u0027: \u0027\u0027,"},{"line_number":45,"context_line":"        \u0027type\u0027: \u0027l3\u0027,"},{"line_number":46,"context_line":"        \u0027route_targets\u0027: [],"}],"source_content_type":"text/x-python","patch_set":10,"id":"0bb7f289_85d3e1b0","line":43,"in_reply_to":"ba795c83_49788430","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/tests/unit/network/v2/bgpvpn/test_bgpvpn.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":91,"context_line":"    @mock.patch(\u0027osc_lib.cli.identity.find_project\u0027)"},{"line_number":92,"context_line":"    def test_create_bgpvpn_with_all_args(self, mock_find_project):"},{"line_number":93,"context_line":"        attrs \u003d {"},{"line_number":94,"context_line":"            \u0027tenant_id\u0027: \u0027new_fake_project_id\u0027,"},{"line_number":95,"context_line":"            \u0027name\u0027: \u0027fake_name\u0027,"},{"line_number":96,"context_line":"            \u0027type\u0027: \u0027l2\u0027,"},{"line_number":97,"context_line":"            \u0027vni\u0027: 100,"}],"source_content_type":"text/x-python","patch_set":10,"id":"b2963cf7_c86f7c20","line":94,"updated":"2026-04-29 03:41:19.000000000","message":"Same here and below","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"140c0ece714aeb37f700fc0784fc006a1871873f","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    @mock.patch(\u0027osc_lib.cli.identity.find_project\u0027)"},{"line_number":92,"context_line":"    def test_create_bgpvpn_with_all_args(self, mock_find_project):"},{"line_number":93,"context_line":"        attrs \u003d {"},{"line_number":94,"context_line":"            \u0027tenant_id\u0027: \u0027new_fake_project_id\u0027,"},{"line_number":95,"context_line":"            \u0027name\u0027: \u0027fake_name\u0027,"},{"line_number":96,"context_line":"            \u0027type\u0027: \u0027l2\u0027,"},{"line_number":97,"context_line":"            \u0027vni\u0027: 100,"}],"source_content_type":"text/x-python","patch_set":10,"id":"115b99b2_d97333b7","line":94,"in_reply_to":"b2963cf7_c86f7c20","updated":"2026-05-04 10:54:57.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/tests/unit/network/v2/bgpvpn/test_network_association.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":78,"context_line":"        self.network_client.create_bgpvpn_network_association.return_value \u003d ("},{"line_number":79,"context_line":"            fake_assoc"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":"        mock_find_project.return_value \u003d mock.Mock(id\u003dfake_bgpvpn[\u0027tenant_id\u0027])"},{"line_number":82,"context_line":"        arglist \u003d ["},{"line_number":83,"context_line":"            fake_bgpvpn[\u0027id\u0027],"},{"line_number":84,"context_line":"            fake_res[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"b8f00966_a94f3692","line":81,"updated":"2026-04-29 03:41:19.000000000","message":"Same and below","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afca24f8435e089564345f2211d83cc889e0a311","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.network_client.create_bgpvpn_network_association.return_value \u003d ("},{"line_number":79,"context_line":"            fake_assoc"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":"        mock_find_project.return_value \u003d mock.Mock(id\u003dfake_bgpvpn[\u0027tenant_id\u0027])"},{"line_number":82,"context_line":"        arglist \u003d ["},{"line_number":83,"context_line":"            fake_bgpvpn[\u0027id\u0027],"},{"line_number":84,"context_line":"            fake_res[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"00db447d_ede4e85a","line":81,"in_reply_to":"b8f00966_a94f3692","updated":"2026-05-05 09:40:08.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/tests/unit/network/v2/bgpvpn/test_port_association.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":83,"context_line":"            fake_assoc"},{"line_number":84,"context_line":"        )"},{"line_number":85,"context_line":"        mock_find_project.return_value \u003d mock.Mock("},{"line_number":86,"context_line":"            id\u003dself.fake_bgpvpn[\u0027tenant_id\u0027]"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        arglist \u003d ["},{"line_number":89,"context_line":"            self.fake_bgpvpn[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"4727aa90_9939b0b2","line":86,"updated":"2026-04-29 03:41:19.000000000","message":"Same and below","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afca24f8435e089564345f2211d83cc889e0a311","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            fake_assoc"},{"line_number":84,"context_line":"        )"},{"line_number":85,"context_line":"        mock_find_project.return_value \u003d mock.Mock("},{"line_number":86,"context_line":"            id\u003dself.fake_bgpvpn[\u0027tenant_id\u0027]"},{"line_number":87,"context_line":"        )"},{"line_number":88,"context_line":"        arglist \u003d ["},{"line_number":89,"context_line":"            self.fake_bgpvpn[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":10,"id":"4930b817_0043ff94","line":86,"in_reply_to":"4727aa90_9939b0b2","updated":"2026-05-05 09:40:08.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"openstackclient/tests/unit/network/v2/bgpvpn/test_resource_association.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"755b79097af773da46db81afb06f61179b1e17b8","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        self.network_client.create_bgpvpn_router_association.return_value \u003d ("},{"line_number":76,"context_line":"            fake_res_assoc"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association.side_effect \u003d ("},{"line_number":79,"context_line":"            lambda name_or_id: {\u0027id\u0027: name_or_id}"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":"        arglist \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"f4fb47cc_1e3f0ccf","line":78,"updated":"2026-03-06 16:07:37.000000000","message":"`find_bgpvpn_fake_resource_association` \u003c- this looks...wrong?\n\nLater: okay, we\u0027re doing this intentionally though I can\u0027t yet tell why. We might want some context comments, assuming we do in fact need this.","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.network_client.create_bgpvpn_router_association.return_value \u003d ("},{"line_number":76,"context_line":"            fake_res_assoc"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association.side_effect \u003d ("},{"line_number":79,"context_line":"            lambda name_or_id: {\u0027id\u0027: name_or_id}"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":"        arglist \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"d04b165a_92e43e44","line":78,"in_reply_to":"29a02d37_17e8b062","updated":"2026-03-09 18:16:18.000000000","message":"Acknowledged","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"597d046333757af2f66e546a749ee8ca2992d668","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        self.network_client.create_bgpvpn_router_association.return_value \u003d ("},{"line_number":76,"context_line":"            fake_res_assoc"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":"        self.network_client.find_bgpvpn_fake_resource_association.side_effect \u003d ("},{"line_number":79,"context_line":"            lambda name_or_id: {\u0027id\u0027: name_or_id}"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":"        arglist \u003d ["}],"source_content_type":"text/x-python","patch_set":3,"id":"29a02d37_17e8b062","line":78,"in_reply_to":"f4fb47cc_1e3f0ccf","updated":"2026-03-09 15:46:50.000000000","message":"I removed it during the mock changes starting from fakes.py, thanks","commit_id":"77cbfbae9cb42d063ca01d5b94c76d0a1bad2646"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9b3aa46b7358f9488ed9882ec9e745355e170ef4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5b4cc59b_b1976a65","updated":"2026-03-09 18:16:18.000000000","message":"As noted in the previous file, I suspect this should go away in favour of new `test_network_association.py` and `test_port_association.py` files","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"663b96a4825988cce261a28550c0920a1f1a2dfb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"00b37531_8638d0c3","in_reply_to":"5b4cc59b_b1976a65","updated":"2026-04-21 16:05:00.000000000","message":"Done","commit_id":"25ba2b8c5d57c01152cd7d650ad46266972f451a"}],"openstackclient/tests/unit/network/v2/bgpvpn/test_router_association.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7f16462b205c15c438042916d2d3a80e7e8870b3","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            self.fake_bgpvpn[\u0027id\u0027],"},{"line_number":81,"context_line":"            self.fake_router[\u0027id\u0027],"},{"line_number":82,"context_line":"            \u0027--project\u0027,"},{"line_number":83,"context_line":"            self.fake_bgpvpn[\u0027tenant_id\u0027],"},{"line_number":84,"context_line":"        ]"},{"line_number":85,"context_line":"        if param is not None:"},{"line_number":86,"context_line":"            if isinstance(param, list):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1868a9c0_104f1a5a","line":83,"updated":"2026-04-29 03:41:19.000000000","message":"Same and below","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"afca24f8435e089564345f2211d83cc889e0a311","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            self.fake_bgpvpn[\u0027id\u0027],"},{"line_number":81,"context_line":"            self.fake_router[\u0027id\u0027],"},{"line_number":82,"context_line":"            \u0027--project\u0027,"},{"line_number":83,"context_line":"            self.fake_bgpvpn[\u0027tenant_id\u0027],"},{"line_number":84,"context_line":"        ]"},{"line_number":85,"context_line":"        if param is not None:"},{"line_number":86,"context_line":"            if isinstance(param, list):"}],"source_content_type":"text/x-python","patch_set":10,"id":"5351e46d_a63d4236","line":83,"in_reply_to":"1868a9c0_104f1a5a","updated":"2026-05-05 09:40:08.000000000","message":"Done","commit_id":"eb95ef5d254e808a62ea495a743deca9d1095c7e"}],"releasenotes/notes/Move-bgpvpn-CLI-to-OSC-4df0140af2b40577.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``bgpvpn`` OSC commands were moved from ``python-neutronclient`` under"},{"line_number":5,"context_line":"    ``network/v2/bgpvpn``. The following commands are included:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    - bgpvpn create/delete/list/show/set/unset"},{"line_number":8,"context_line":"    - bgpvpn network association create/delete/list/show"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"c4e9c0e3_1e8b6ac7","line":5,"range":{"start_line":3,"start_character":5,"end_line":5,"end_character":63},"updated":"2026-03-04 12:47:48.000000000","message":"The location of the code isn\u0027t relevant to the end user.\n\n```suggestion\n  - |\n    ``bgpvpn`` OSC commands were moved from ``python-neutronclient``. The\n    following commands are included:\n```","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``bgpvpn`` OSC commands were moved from ``python-neutronclient`` under"},{"line_number":5,"context_line":"    ``network/v2/bgpvpn``. The following commands are included:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    - bgpvpn create/delete/list/show/set/unset"},{"line_number":8,"context_line":"    - bgpvpn network association create/delete/list/show"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7b666319_afd4f9ce","line":5,"range":{"start_line":3,"start_character":5,"end_line":5,"end_character":63},"in_reply_to":"c4e9c0e3_1e8b6ac7","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"fa2f750eac94cf8e19d7be4543874c5a378d89a0","unresolved":true,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``bgpvpn`` OSC commands were moved from ``python-neutronclient`` under"},{"line_number":5,"context_line":"    ``network/v2/bgpvpn``. The following commands are included:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    - bgpvpn create/delete/list/show/set/unset"},{"line_number":8,"context_line":"    - bgpvpn network association create/delete/list/show"},{"line_number":9,"context_line":"    - bgpvpn router association create/delete/list/show/set/unset"},{"line_number":10,"context_line":"    - bgpvpn port association create/delete/list/show/set/unset"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"1c1c2b6e_12337296","line":10,"range":{"start_line":6,"start_character":1,"end_line":10,"end_character":63},"updated":"2026-03-04 12:47:48.000000000","message":"Can we format these as code?\n\n```suggestion\n\n    - ``bgpvpn create|delete|list|show|set|unset``\n    - ``bgpvpn network association create|delete|list|show``\n    - ``bgpvpn router association create|delete|list|show|set|unset``\n    - ``bgpvpn port association create|delete|list|show|set|unset``\n```","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5fbfa2d067dda13b7842f8571ac31d5bbe8d2cf8","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    ``bgpvpn`` OSC commands were moved from ``python-neutronclient`` under"},{"line_number":5,"context_line":"    ``network/v2/bgpvpn``. The following commands are included:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    - bgpvpn create/delete/list/show/set/unset"},{"line_number":8,"context_line":"    - bgpvpn network association create/delete/list/show"},{"line_number":9,"context_line":"    - bgpvpn router association create/delete/list/show/set/unset"},{"line_number":10,"context_line":"    - bgpvpn port association create/delete/list/show/set/unset"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"3646159e_363617c7","line":10,"range":{"start_line":6,"start_character":1,"end_line":10,"end_character":63},"in_reply_to":"1c1c2b6e_12337296","updated":"2026-03-06 14:14:06.000000000","message":"Done","commit_id":"ace8f281195fb2d097cc8a0d7d6eced438e6979b"}]}
