)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"14977eeb1b76b2736f4ef095209ce87f6581249f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Miro Tomaska \u003cmtomaska@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-10-08 15:35:41 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[DNM] Moving tapas osc client code from neutronclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Proposal to move all stadium projects from neutronclient"},{"line_number":10,"context_line":"to openstackclient repo. Tap-as-a-service is the first example."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"c6faea97_dc8985e4","line":7,"range":{"start_line":7,"start_character":13,"end_line":7,"end_character":18},"updated":"2025-10-08 19:49:05.000000000","message":"nit: tapaas","commit_id":"17c737b2f8511d2be34b8bf9b5ecab3f49d19939"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0053af18c037dd3c333f816b431ee5896574e428","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Miro Tomaska \u003cmtomaska@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-10-08 15:35:41 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[DNM] Moving tapas osc client code from neutronclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Proposal to move all stadium projects from neutronclient"},{"line_number":10,"context_line":"to openstackclient repo. Tap-as-a-service is the first example."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d8b0e655_5aa03981","line":7,"range":{"start_line":7,"start_character":13,"end_line":7,"end_character":18},"in_reply_to":"c6faea97_dc8985e4","updated":"2025-11-03 19:23:25.000000000","message":"Acknowledged","commit_id":"17c737b2f8511d2be34b8bf9b5ecab3f49d19939"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"799bec598138584a11cf02e03a4a50f58c840750","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8cc0e1a4_fb1697f0","updated":"2025-10-14 15:43:36.000000000","message":"As an aside, it might be good to apply those fixes at the source first, so that we\u0027re copy-pasting things as-is. However, I\u0027m happy with this move in general 👌","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"42fc36af_747cd4a2","updated":"2025-10-14 16:51:59.000000000","message":"Little more thorough review","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"cda733d0_a9f4e0eb","updated":"2025-11-07 12:07:04.000000000","message":"I have a couple of general points inline, mostly around the tests. I\u0027m okay doing this in a follow-up, but I\u0027d like to see the follow-up proposed first before we merge this (so I know it\u0027ll get done).\n\nIt occurred to me during review that I\u0027ve no idea what happens if we have register two identical entrypoints under the same group. What happens if you co-install OSC with this patch alongside the current TaaS client package? Which version of the entrypoint do we pick up? I\u0027d be concerned that it would be random, which would be very confusing for users in an upgrade environment where they\u0027ve updated OSC and are not seeing bug fixes due to a legacy TaaS client install. Could you investigate? Once we know the answer to this question, it would be good to note in the docs for other people looking to migrate commands _into_ OSC.","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e94ca5489ad9a27372387879b14bd0ac3afbb3b5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3372500a_993703ab","in_reply_to":"19e41e24_63591e95","updated":"2025-11-07 14:26:58.000000000","message":"aaaand I was too intrigued not to try. I checked out this change, created a virtualenv and then installed the master branch of neutronclient (which includes https://review.opendev.org/c/openstack/python-neutronclient/+/960846) and openstackclient with this change. It appears OSC continues to pull the older version of the command from neutronclient:\n\n```\n❯ OS_CLOUD\u003ddevstack-admin openstack tap flow create --help | tail -10\n  --max-width \u003cinteger\u003e\n                        Maximum display width, \u003c1 to disable. You can also use\n                        the CLIFF_MAX_TERM_WIDTH environment variable, but the\n                        parameter takes precedence.\n  --fit-width           Fit the table to the display width. Implied if --max-\n                        width greater than 0. Set the environment variable\n                        CLIFF_FIT_WIDTH\u003d1 to always enable\n  --print-empty         Print empty table if there is no data to show.\n\nThis command is provided by the python-neutronclient plugin.\n```\n\nLooks like it might be ordering dependent. By hacking on `osc-lib` as suggsted above and running e.g. `flavor list`, I see:\n\n```\n...\nfound extension EntryPoint(name\u003d\u0027subnet_unset\u0027, value\u003d\u0027openstackclient.network.v2.subnet:UnsetSubnet\u0027, group\u003d\u0027openstack.network.v2\u0027)                                     \nfound extension EntryPoint(name\u003d\u0027tap_flow_create\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_flow:CreateTapFlow\u0027, group\u003d\u0027openstack.network.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_flow_delete\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\u0027, group\u003d\u0027openstack.network.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_flow_list\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_flow:ListTapFlow\u0027, group\u003d\u0027openstack.network.v2\u0027)                             \nfound extension EntryPoint(name\u003d\u0027tap_flow_show\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_flow:ShowTapFlow\u0027, group\u003d\u0027openstack.network.v2\u0027)                             \nfound extension EntryPoint(name\u003d\u0027tap_flow_update\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_flow:UpdateTapFlow\u0027, group\u003d\u0027openstack.network.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_mirror_create\u0027, value\u003d\u0027openstackclient.network.v2.taas.tap_mirror:CreateTapMirror\u0027, group\u003d\u0027openstack.network.v2\u0027)                   \n...\nfound extension EntryPoint(name\u003d\u0027sfc_service_graph_show\u0027, value\u003d\u0027neutronclient.osc.v2.sfc.sfc_service_graph:ShowSfcServiceGraph\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)    \nfound extension EntryPoint(name\u003d\u0027tap_flow_create\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_flow:CreateTapFlow\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_flow_delete\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_flow:DeleteTapFlow\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_flow_list\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_flow:ListTapFlow\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)                             \nfound extension EntryPoint(name\u003d\u0027tap_flow_show\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_flow:ShowTapFlow\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)                             \nfound extension EntryPoint(name\u003d\u0027tap_flow_update\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_flow:UpdateTapFlow\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027)                         \nfound extension EntryPoint(name\u003d\u0027tap_mirror_create\u0027, value\u003d\u0027neutronclient.osc.v2.taas.tap_mirror:CreateTapMirror\u0027, group\u003d\u0027openstack.neutronclient.v2\u0027\n...\n```\n\nLooks like we need to do some work here with one or more of `python-openstackclient`, `osc-lib`, `cliff`, or `stevedore` first? Perhaps we could blacklist loading commands with particular groups or values?","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"95a7c8de5e18ae61262e3be4ace8c41f8b66ad75","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"fabd0e5a_977f66a7","in_reply_to":"3372500a_993703ab","updated":"2025-11-11 14:36:37.000000000","message":"We are removing the code from neutronclient now: https://review.opendev.org/c/openstack/python-neutronclient/+/966356. It is dependant of this patch.","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5361d6acedf0735bd7b8efa15aecd05f8e1ea851","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"19e41e24_63591e95","in_reply_to":"cda733d0_a9f4e0eb","updated":"2025-11-07 14:17:29.000000000","message":"\u003e It occurred to me during review that I\u0027ve no idea what happens if we have register two identical entrypoints under the same group. What happens if you co-install OSC with this patch alongside the current TaaS client package? Which version of the entrypoint do we pick up? I\u0027d be concerned that it would be random, which would be very confusing for users in an upgrade environment where they\u0027ve updated OSC and are not seeing bug fixes due to a legacy TaaS client install. Could you investigate? Once we know the answer to this question, it would be good to note in the docs for other people looking to migrate commands _into_ OSC.\n\nhint: entrypoint loading is managed by stevedore, and osc-lib disables logging for stevedore in `osc_lib.logs`. You probably want to re-enable logging if you look into this.","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cdcc767b6f803888116acbd8e085c274b802fa37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"77e9cb7d_2c0fde76","in_reply_to":"fabd0e5a_977f66a7","updated":"2025-11-11 17:32:17.000000000","message":"Yes, but that won\u0027t cause removal of neutronclient from existing installations. This is an upgrade issue.\n\nFortunately, I have started on a solution [here](https://review.opendev.org/c/openstack/stevedore/+/966696/). It still needs to piped through to cliff (and then osc-lib and osc) but it should do the trick once that\u0027s done, so you can hopefully ignore this issue now.","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"b4312e5c_6667ee90","updated":"2025-11-21 20:27:55.000000000","message":"Really just text nits","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"888b26e5_d4ed83f3","updated":"2025-11-26 19:01:51.000000000","message":"Resolved string related feedback as a separate patch\nhttps://review.opendev.org/c/openstack/python-openstackclient/+/968546","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"74403fc8_1c62f656","updated":"2025-11-28 16:09:45.000000000","message":"-1 is for the dead code and the questions. I\u0027d also like to see [the test fixes patch](https://review.opendev.org/c/openstack/python-openstackclient/+/966354/1?usp\u003drelated-change) rebased and passing or (better) merged in here. The nits are just that: nits. \n\nI have a patch above this to resolve the plugin loading issue, so this should be good to go once the above are addressed.","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"df5ec5186f943095cc0fe8abb2893b2449cab8c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"89a57ef5_9abf0972","updated":"2025-12-05 13:17:07.000000000","message":"thanks, I had finally time to put this (and https://review.opendev.org/c/openstack/python-neutronclient/+/966356 ) into a test env, and it looks ok and working.\nPlease check Stephen\u0027s comments","commit_id":"b58bd41e6e0affa5027b0e06ab9ca9d3a08f3ce2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0fabcf07155725e8d6f12176b474d0d77e4e85ff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"4564181b_c47bc25e","updated":"2025-12-04 19:28:47.000000000","message":"Can you add address the outstanding issue. I think this is good to go then","commit_id":"b1b96b12f61db5a7f14f3b75c6dae6de1721b585"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"48d0a11793a28e97d047fe10f0ccddf3aae099b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a3efb8b4_1dea963d","updated":"2025-12-08 18:27:24.000000000","message":"I\u0027m +W once we have CI on this and the two follow-ups 🙏","commit_id":"97c2238df17e7e586f00a5fb06da4ec008ad834d"}],"openstackclient/network/v2/taas/tap_flow.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            choices\u003d[\u0027IN\u0027, \u0027OUT\u0027, \u0027BOTH\u0027],"},{"line_number":79,"context_line":"            type\u003dlambda s: s.upper(),"},{"line_number":80,"context_line":"            help\u003d_("},{"line_number":81,"context_line":"                \u0027Direction of the Tap flow. Possible options are: \u0027"},{"line_number":82,"context_line":"                \u0027IN, OUT, BOTH\u0027"},{"line_number":83,"context_line":"            ),"},{"line_number":84,"context_line":"        )"},{"line_number":85,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":7,"id":"c9148543_176f2765","line":82,"range":{"start_line":81,"start_character":44,"end_line":82,"end_character":30},"updated":"2025-11-21 20:27:55.000000000","message":"s/Valid options are: IN, OUT and BOTH","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            choices\u003d[\u0027IN\u0027, \u0027OUT\u0027, \u0027BOTH\u0027],"},{"line_number":79,"context_line":"            type\u003dlambda s: s.upper(),"},{"line_number":80,"context_line":"            help\u003d_("},{"line_number":81,"context_line":"                \u0027Direction of the Tap flow. Possible options are: \u0027"},{"line_number":82,"context_line":"                \u0027IN, OUT, BOTH\u0027"},{"line_number":83,"context_line":"            ),"},{"line_number":84,"context_line":"        )"},{"line_number":85,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":7,"id":"ad32123c_8772ee9d","line":82,"range":{"start_line":81,"start_character":44,"end_line":82,"end_character":30},"in_reply_to":"c9148543_176f2765","updated":"2025-11-26 19:01:51.000000000","message":"I made a separate patch for addressing string related feedback.\n\nhttps://review.opendev.org/c/openstack/python-openstackclient/+/968546","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":166,"context_line":"        parser.add_argument("},{"line_number":167,"context_line":"            TAP_FLOW,"},{"line_number":168,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":169,"context_line":"            help\u003d_(\"ID or name of tap flow to look up.\"),"},{"line_number":170,"context_line":"        )"},{"line_number":171,"context_line":"        return parser"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8f9576d4_938391ea","line":169,"range":{"start_line":169,"start_character":20,"end_line":169,"end_character":54},"updated":"2025-11-21 20:27:55.000000000","message":"s/Tap flow to display (name or ID)\n\nI just pushed a change to try and make all the strings consistent, so this and most comments relate to that. If we want to copy the code as-is from the neutronclient repo and fix later I would be fine with that as well.","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        parser.add_argument("},{"line_number":167,"context_line":"            TAP_FLOW,"},{"line_number":168,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":169,"context_line":"            help\u003d_(\"ID or name of tap flow to look up.\"),"},{"line_number":170,"context_line":"        )"},{"line_number":171,"context_line":"        return parser"},{"line_number":172,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"d48ab8e9_ac4dcd6d","line":169,"range":{"start_line":169,"start_character":20,"end_line":169,"end_character":54},"in_reply_to":"8f9576d4_938391ea","updated":"2025-11-26 19:01:51.000000000","message":"Yep I would be for a separate patch in order not to overload this patch. It is already getting overloaded 😊 with other stuff. I can chain that change to this one","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":190,"context_line":"            TAP_FLOW,"},{"line_number":191,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":192,"context_line":"            nargs\u003d\"+\","},{"line_number":193,"context_line":"            help\u003d_(\"ID(s) or name(s) of tap flow to delete.\"),"},{"line_number":194,"context_line":"        )"},{"line_number":195,"context_line":"        return parser"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ae47a187_cabc3899","line":193,"range":{"start_line":193,"start_character":20,"end_line":193,"end_character":59},"updated":"2025-11-21 20:27:55.000000000","message":"Tap flow(s) to delete (name or ID)","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            TAP_FLOW,"},{"line_number":191,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":192,"context_line":"            nargs\u003d\"+\","},{"line_number":193,"context_line":"            help\u003d_(\"ID(s) or name(s) of tap flow to delete.\"),"},{"line_number":194,"context_line":"        )"},{"line_number":195,"context_line":"        return parser"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f0aa5efa_2563b2c4","line":193,"range":{"start_line":193,"start_character":20,"end_line":193,"end_character":59},"in_reply_to":"ae47a187_cabc3899","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":201,"context_line":"            try:"},{"line_number":202,"context_line":"                id \u003d client.find_tap_flow(id_or_name, ignore_missing\u003dFalse).id"},{"line_number":203,"context_line":"                client.delete_tap_flow(id)"},{"line_number":204,"context_line":"                LOG.warning(\"Tap flow %(id)s deleted\", {\u0027id\u0027: id})"},{"line_number":205,"context_line":"            except Exception as e:"},{"line_number":206,"context_line":"                fails +\u003d 1"},{"line_number":207,"context_line":"                LOG.error("}],"source_content_type":"text/x-python","patch_set":7,"id":"6aa8b54e_027d52ae","line":204,"updated":"2025-11-21 20:27:55.000000000","message":"Do we need this?","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            try:"},{"line_number":202,"context_line":"                id \u003d client.find_tap_flow(id_or_name, ignore_missing\u003dFalse).id"},{"line_number":203,"context_line":"                client.delete_tap_flow(id)"},{"line_number":204,"context_line":"                LOG.warning(\"Tap flow %(id)s deleted\", {\u0027id\u0027: id})"},{"line_number":205,"context_line":"            except Exception as e:"},{"line_number":206,"context_line":"                fails +\u003d 1"},{"line_number":207,"context_line":"                LOG.error("}],"source_content_type":"text/x-python","patch_set":7,"id":"616e9305_352dbad3","line":204,"in_reply_to":"6aa8b54e_027d52ae","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":217,"context_line":"            raise exceptions.CommandError(msg)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class UpdateTapFlow(command.ShowOne):"},{"line_number":221,"context_line":"    _description \u003d _(\"Update a tap flow.\")"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7f8684a8_9a024bc3","line":220,"range":{"start_line":220,"start_character":6,"end_line":220,"end_character":12},"updated":"2025-11-21 20:27:55.000000000","message":"nit: most of the other networking code uses \u0027Set\u0027 for these class names, which I think corresponds with the command name?","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":217,"context_line":"            raise exceptions.CommandError(msg)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class UpdateTapFlow(command.ShowOne):"},{"line_number":221,"context_line":"    _description \u003d _(\"Update a tap flow.\")"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def get_parser(self, prog_name):"}],"source_content_type":"text/x-python","patch_set":7,"id":"a28072a6_1ff05c93","line":220,"range":{"start_line":220,"start_character":6,"end_line":220,"end_character":12},"in_reply_to":"7f8684a8_9a024bc3","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":225,"context_line":"        parser.add_argument("},{"line_number":226,"context_line":"            TAP_FLOW,"},{"line_number":227,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":228,"context_line":"            help\u003d_(\"ID or name of tap flow to update.\"),"},{"line_number":229,"context_line":"        )"},{"line_number":230,"context_line":"        _add_updatable_args(parser)"},{"line_number":231,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":7,"id":"59f8ae50_2b4fb43f","line":228,"range":{"start_line":228,"start_character":20,"end_line":228,"end_character":53},"updated":"2025-11-21 20:27:55.000000000","message":"s/Tap flow to modify (name or ID)","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        parser.add_argument("},{"line_number":226,"context_line":"            TAP_FLOW,"},{"line_number":227,"context_line":"            metavar\u003df\"\u003c{TAP_FLOW}\u003e\","},{"line_number":228,"context_line":"            help\u003d_(\"ID or name of tap flow to update.\"),"},{"line_number":229,"context_line":"        )"},{"line_number":230,"context_line":"        _add_updatable_args(parser)"},{"line_number":231,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":7,"id":"15c3311a_c888e935","line":228,"range":{"start_line":228,"start_character":20,"end_line":228,"end_character":53},"in_reply_to":"59f8ae50_2b4fb43f","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        client \u003d self.app.client_manager.network"},{"line_number":95,"context_line":"        attrs \u003d {}"},{"line_number":96,"context_line":"        if parsed_args.name is not None:"},{"line_number":97,"context_line":"            attrs[\u0027name\u0027] \u003d str(parsed_args.name)"},{"line_number":98,"context_line":"        if parsed_args.description is not None:"},{"line_number":99,"context_line":"            attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":100,"context_line":"        if parsed_args.port is not None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1d641415_5b96c169","line":97,"updated":"2025-11-28 16:09:45.000000000","message":"nit: `str` isn\u0027t needed here or below: these will always be strings\n\n\n```suggestion\n            attrs[\u0027name\u0027] \u003d parsed_args.name\n```","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        client \u003d self.app.client_manager.network"},{"line_number":95,"context_line":"        attrs \u003d {}"},{"line_number":96,"context_line":"        if parsed_args.name is not None:"},{"line_number":97,"context_line":"            attrs[\u0027name\u0027] \u003d str(parsed_args.name)"},{"line_number":98,"context_line":"        if parsed_args.description is not None:"},{"line_number":99,"context_line":"            attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":100,"context_line":"        if parsed_args.port is not None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"48e54527_7ccb6c5d","line":97,"in_reply_to":"1d641415_5b96c169","updated":"2025-12-02 21:44:58.000000000","message":"Done","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        if parsed_args.port is not None:"},{"line_number":101,"context_line":"            source_port \u003d client.find_port("},{"line_number":102,"context_line":"                parsed_args.port, ignore_missing\u003dFalse"},{"line_number":103,"context_line":"            )[\u0027id\u0027]"},{"line_number":104,"context_line":"            attrs[\u0027source_port\u0027] \u003d source_port"},{"line_number":105,"context_line":"        if parsed_args.tap_service is not None:"},{"line_number":106,"context_line":"            tap_service_id \u003d client.find_tap_service("}],"source_content_type":"text/x-python","patch_set":8,"id":"c0b953c5_271b02cd","line":103,"updated":"2025-11-28 16:09:45.000000000","message":"nit: use attr-style access instead of dict access\n\n\n```suggestion\n            ).id\n```","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if parsed_args.port is not None:"},{"line_number":101,"context_line":"            source_port \u003d client.find_port("},{"line_number":102,"context_line":"                parsed_args.port, ignore_missing\u003dFalse"},{"line_number":103,"context_line":"            )[\u0027id\u0027]"},{"line_number":104,"context_line":"            attrs[\u0027source_port\u0027] \u003d source_port"},{"line_number":105,"context_line":"        if parsed_args.tap_service is not None:"},{"line_number":106,"context_line":"            tap_service_id \u003d client.find_tap_service("}],"source_content_type":"text/x-python","patch_set":8,"id":"c032f5ec_6ae878ee","line":103,"in_reply_to":"c0b953c5_271b02cd","updated":"2025-12-02 21:44:58.000000000","message":"Because this changes how test object access `id` I will address this here:\nhttps://review.opendev.org/c/openstack/python-openstackclient/+/966354/","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        if parsed_args.vlan_filter is not None:"},{"line_number":113,"context_line":"            attrs[\u0027vlan_filter\u0027] \u003d parsed_args.vlan_filter"},{"line_number":114,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":115,"context_line":"            project_id \u003d identity_utils.find_project("},{"line_number":116,"context_line":"                self.app.client_manager.identity,"},{"line_number":117,"context_line":"                parsed_args.project,"},{"line_number":118,"context_line":"                parsed_args.project_domain,"}],"source_content_type":"text/x-python","patch_set":8,"id":"aa93707a_9149d2e3","line":115,"updated":"2025-11-28 16:09:45.000000000","message":"I\u0027d rather we used SDK here, but the patch that adds the helper you\u0027d use here [hasn\u0027t merged yet](https://review.opendev.org/c/openstack/python-openstackclient/+/965317/6/openstackclient/identity/common.py). One for another day.","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":117,"context_line":"                parsed_args.project,"},{"line_number":118,"context_line":"                parsed_args.project_domain,"},{"line_number":119,"context_line":"            ).id"},{"line_number":120,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":121,"context_line":"        obj \u003d client.create_tap_flow(**attrs)"},{"line_number":122,"context_line":"        display_columns, columns \u003d tap_service._get_columns(obj)"},{"line_number":123,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns)"}],"source_content_type":"text/x-python","patch_set":8,"id":"c140f48d_ff0013ba","line":120,"updated":"2025-11-28 16:09:45.000000000","message":"Shouldn\u0027t this be\n\n```suggestion\n            attrs[\u0027project_id\u0027] \u003d project_id\n```\n\nnowadays?\n\nditto for other instances below","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                parsed_args.project,"},{"line_number":118,"context_line":"                parsed_args.project_domain,"},{"line_number":119,"context_line":"            ).id"},{"line_number":120,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d project_id"},{"line_number":121,"context_line":"        obj \u003d client.create_tap_flow(**attrs)"},{"line_number":122,"context_line":"        display_columns, columns \u003d tap_service._get_columns(obj)"},{"line_number":123,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns)"}],"source_content_type":"text/x-python","patch_set":8,"id":"cb132c2b_0753cfab","line":120,"in_reply_to":"c140f48d_ff0013ba","updated":"2025-12-02 21:44:58.000000000","message":"Done","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class ListTapFlow(command.Lister):"},{"line_number":128,"context_line":"    _description \u003d _(\"List tap flows that belong to a given tenant\")"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def get_parser(self, prog_name):"},{"line_number":131,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"b1e5e2a0_e599c7d5","line":128,"range":{"start_line":128,"start_character":60,"end_line":128,"end_character":66},"updated":"2025-11-28 16:09:45.000000000","message":"```suggestion\n    _description \u003d _(\"List tap flows that belong to a given project\")\n```","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"class ListTapFlow(command.Lister):"},{"line_number":128,"context_line":"    _description \u003d _(\"List tap flows that belong to a given tenant\")"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def get_parser(self, prog_name):"},{"line_number":131,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":8,"id":"b0c14afe_5ebcf0d2","line":128,"range":{"start_line":128,"start_character":60,"end_line":128,"end_character":66},"in_reply_to":"b1e5e2a0_e599c7d5","updated":"2025-12-02 21:44:58.000000000","message":"this was implicitly addressed in the patch which changes all helps strings.\nhttps://review.opendev.org/c/openstack/python-openstackclient/+/968546","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"}],"openstackclient/network/v2/taas/tap_mirror.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":18,"context_line":"from osc_lib import utils as osc_utils"},{"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.network.v2 import port as osc_port"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from openstackclient.i18n import _"},{"line_number":24,"context_line":"from openstackclient.network.v2.taas import tap_service"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"c51ec826_9aedcdbc","line":24,"range":{"start_line":21,"start_character":0,"end_line":24,"end_character":55},"updated":"2025-10-14 16:51:59.000000000","message":"As a general point, we can probably regroup these now. It might be worth seeing if we can get ruff to do it for us...","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from osc_lib import utils as osc_utils"},{"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.network.v2 import port as osc_port"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from openstackclient.i18n import _"},{"line_number":24,"context_line":"from openstackclient.network.v2.taas import tap_service"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":2,"id":"c60a813c_d31de7d5","line":24,"range":{"start_line":21,"start_character":0,"end_line":24,"end_character":55},"in_reply_to":"c51ec826_9aedcdbc","updated":"2025-11-07 12:07:04.000000000","message":"Done","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _get_columns(item):"},{"line_number":44,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":45,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027tenant_id\u0027]"},{"line_number":46,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":47,"context_line":"        item, column_map, hidden_columns"},{"line_number":48,"context_line":"    )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class CreateTapMirror(command.ShowOne):"},{"line_number":52,"context_line":"    _description \u003d _(\"Create a Tap Mirror\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"5c314b99_e08334c5","line":49,"range":{"start_line":43,"start_character":0,"end_line":49,"end_character":1},"updated":"2025-10-14 16:51:59.000000000","message":"Could you move this into a `_util` module, or simply duplicate it across the few modules here.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0053af18c037dd3c333f816b431ee5896574e428","unresolved":true,"context_lines":[{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _get_columns(item):"},{"line_number":44,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":45,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027tenant_id\u0027]"},{"line_number":46,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":47,"context_line":"        item, column_map, hidden_columns"},{"line_number":48,"context_line":"    )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class CreateTapMirror(command.ShowOne):"},{"line_number":52,"context_line":"    _description \u003d _(\"Create a Tap Mirror\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf70e255_78697517","line":49,"range":{"start_line":43,"start_character":0,"end_line":49,"end_character":1},"in_reply_to":"5c314b99_e08334c5","updated":"2025-11-03 19:23:25.000000000","message":"I agree. I see that `_get_columns` is used in many files. I will follow up with a separate review where I just consolidate `_get_columns` into utils.py. It will be cleaner then overload this review.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":false,"context_lines":[{"line_number":40,"context_line":")"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def _get_columns(item):"},{"line_number":44,"context_line":"    column_map: dict[str, str] \u003d {}"},{"line_number":45,"context_line":"    hidden_columns \u003d [\u0027location\u0027, \u0027tenant_id\u0027]"},{"line_number":46,"context_line":"    return osc_utils.get_osc_show_columns_for_sdk_resource("},{"line_number":47,"context_line":"        item, column_map, hidden_columns"},{"line_number":48,"context_line":"    )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class CreateTapMirror(command.ShowOne):"},{"line_number":52,"context_line":"    _description \u003d _(\"Create a Tap Mirror\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"c36b6f92_20dc934b","line":49,"range":{"start_line":43,"start_character":0,"end_line":49,"end_character":1},"in_reply_to":"bf70e255_78697517","updated":"2025-11-07 12:07:04.000000000","message":"Acknowledged","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":68,"context_line":"            required\u003dTrue,"},{"line_number":69,"context_line":"            help\u003d_("},{"line_number":70,"context_line":"                \u0027A dictionary of direction and tunnel_id. Direction can \u0027"},{"line_number":71,"context_line":"                \u0027be IN and OUT.\u0027"},{"line_number":72,"context_line":"            ),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":7,"id":"cada9d64_9f720c35","line":71,"updated":"2025-11-21 20:27:55.000000000","message":"s/Valid directions are: IN and OUT","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            required\u003dTrue,"},{"line_number":69,"context_line":"            help\u003d_("},{"line_number":70,"context_line":"                \u0027A dictionary of direction and tunnel_id. Direction can \u0027"},{"line_number":71,"context_line":"                \u0027be IN and OUT.\u0027"},{"line_number":72,"context_line":"            ),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":7,"id":"25c6ed44_20d70006","line":71,"in_reply_to":"cada9d64_9f720c35","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":84,"context_line":"            \u0027--mirror-type\u0027,"},{"line_number":85,"context_line":"            dest\u003d\u0027mirror_type\u0027,"},{"line_number":86,"context_line":"            required\u003dTrue,"},{"line_number":87,"context_line":"            help\u003d_(\u0027The type of the mirroring, it can be gre or erspanv1\u0027),"},{"line_number":88,"context_line":"        )"},{"line_number":89,"context_line":"        return parser"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"eecec673_6be507de","line":87,"range":{"start_line":87,"start_character":47,"end_line":87,"end_character":72},"updated":"2025-11-21 20:27:55.000000000","message":"s/Valid values are: gre or erspanv1","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            \u0027--mirror-type\u0027,"},{"line_number":85,"context_line":"            dest\u003d\u0027mirror_type\u0027,"},{"line_number":86,"context_line":"            required\u003dTrue,"},{"line_number":87,"context_line":"            help\u003d_(\u0027The type of the mirroring, it can be gre or erspanv1\u0027),"},{"line_number":88,"context_line":"        )"},{"line_number":89,"context_line":"        return parser"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f86c95d0_7ae4ec50","line":87,"range":{"start_line":87,"start_character":47,"end_line":87,"end_character":72},"in_reply_to":"eecec673_6be507de","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":156,"context_line":"        parser.add_argument("},{"line_number":157,"context_line":"            TAP_MIRROR,"},{"line_number":158,"context_line":"            metavar\u003df\"\u003c{TAP_MIRROR}\u003e\","},{"line_number":159,"context_line":"            help\u003d_(\"ID or name of Tap Mirror to look up.\"),"},{"line_number":160,"context_line":"        )"},{"line_number":161,"context_line":"        return parser"},{"line_number":162,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"71dcc41f_6eed5625","line":159,"range":{"start_line":159,"start_character":20,"end_line":159,"end_character":56},"updated":"2025-11-21 20:27:55.000000000","message":"s/Tap Mirror to display (name or ID)","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        parser.add_argument("},{"line_number":157,"context_line":"            TAP_MIRROR,"},{"line_number":158,"context_line":"            metavar\u003df\"\u003c{TAP_MIRROR}\u003e\","},{"line_number":159,"context_line":"            help\u003d_(\"ID or name of Tap Mirror to look up.\"),"},{"line_number":160,"context_line":"        )"},{"line_number":161,"context_line":"        return parser"},{"line_number":162,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1c1566e8_34ed4dce","line":159,"range":{"start_line":159,"start_character":20,"end_line":159,"end_character":56},"in_reply_to":"71dcc41f_6eed5625","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"50bb49ebee0197d7ebcad4e3591c4c3792945654","unresolved":true,"context_lines":[{"line_number":180,"context_line":"            TAP_MIRROR,"},{"line_number":181,"context_line":"            metavar\u003df\"\u003c{TAP_MIRROR}\u003e\","},{"line_number":182,"context_line":"            nargs\u003d\"+\","},{"line_number":183,"context_line":"            help\u003d_(\"ID(s) or name(s) of the Tap Mirror to delete.\"),"},{"line_number":184,"context_line":"        )"},{"line_number":185,"context_line":"        return parser"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"88b68798_7e4e5f87","line":183,"range":{"start_line":183,"start_character":20,"end_line":183,"end_character":65},"updated":"2025-11-21 20:27:55.000000000","message":"Same as previous files.\n\nI\u0027ll stop there instead of repeating the same comments.","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            TAP_MIRROR,"},{"line_number":181,"context_line":"            metavar\u003df\"\u003c{TAP_MIRROR}\u003e\","},{"line_number":182,"context_line":"            nargs\u003d\"+\","},{"line_number":183,"context_line":"            help\u003d_(\"ID(s) or name(s) of the Tap Mirror to delete.\"),"},{"line_number":184,"context_line":"        )"},{"line_number":185,"context_line":"        return parser"},{"line_number":186,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"38a6422f_9f45ab0a","line":183,"range":{"start_line":183,"start_character":20,"end_line":183,"end_character":65},"in_reply_to":"88b68798_7e4e5f87","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"6105d0a4477b6ed7b44bfd02f27f8552aa5b9e53"}],"openstackclient/network/v2/taas/tap_service.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class ListTapService(command.Lister):"},{"line_number":104,"context_line":"    _description \u003d _(\"List tap services that belong to a given tenant\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_parser(self, prog_name):"},{"line_number":107,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"743b9b7b_c168f375","line":104,"updated":"2025-11-07 12:07:04.000000000","message":"nit: Should update this verbiage to \"project\"","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class ListTapService(command.Lister):"},{"line_number":104,"context_line":"    _description \u003d _(\"List tap services that belong to a given tenant\")"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def get_parser(self, prog_name):"},{"line_number":107,"context_line":"        parser \u003d super().get_parser(prog_name)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9d850cdc_57658ef2","line":104,"in_reply_to":"743b9b7b_c168f375","updated":"2025-11-18 18:57:15.000000000","message":"Acknowledged","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _updatable_args2body(parsed_args, body):"},{"line_number":48,"context_line":"    for attribute in [\u0027name\u0027, \u0027description\u0027]:"},{"line_number":49,"context_line":"        if ("},{"line_number":50,"context_line":"            hasattr(parsed_args, attribute)"},{"line_number":51,"context_line":"            and getattr(parsed_args, attribute) is not None"},{"line_number":52,"context_line":"        ):"},{"line_number":53,"context_line":"            body[attribute] \u003d getattr(parsed_args, attribute)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _get_columns(item):"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f0839b8_55a417fe","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":61},"updated":"2025-11-28 16:09:45.000000000","message":"Dead code?\n\n(Hopefully: I was going to ask you to delete this and inline the logic 😅)","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    )"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _updatable_args2body(parsed_args, body):"},{"line_number":48,"context_line":"    for attribute in [\u0027name\u0027, \u0027description\u0027]:"},{"line_number":49,"context_line":"        if ("},{"line_number":50,"context_line":"            hasattr(parsed_args, attribute)"},{"line_number":51,"context_line":"            and getattr(parsed_args, attribute) is not None"},{"line_number":52,"context_line":"        ):"},{"line_number":53,"context_line":"            body[attribute] \u003d getattr(parsed_args, attribute)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _get_columns(item):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ca93e223_e534128a","line":53,"range":{"start_line":47,"start_character":0,"end_line":53,"end_character":61},"in_reply_to":"9f0839b8_55a417fe","updated":"2025-12-02 21:44:58.000000000","message":"yep possible. Tap_service and tap_flow is fairly old code. Judging by code search, it is probably some copy/paste thing from the past. I notice that lot of old code is copy/paste instead of reusing as form of import. (I know very bad practice)","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc6b54d3d543a36ae29b1117a5e103d6c9104bee","unresolved":true,"context_lines":[{"line_number":148,"context_line":"        id \u003d client.find_tap_service("},{"line_number":149,"context_line":"            parsed_args.tap_service, ignore_missing\u003dFalse"},{"line_number":150,"context_line":"        ).id"},{"line_number":151,"context_line":"        obj \u003d client.get_tap_service(id)"},{"line_number":152,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":153,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns)"},{"line_number":154,"context_line":"        return display_columns, data"}],"source_content_type":"text/x-python","patch_set":8,"id":"74d098ee_fecf179f","line":151,"updated":"2025-11-28 16:09:45.000000000","message":"I\u0027m guessing the list operation returns a summary view rather than the detailed view you\u0027re looking for, hence the second request?","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"192c5d57ee863760cf7a1503e51b984369e12d62","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        id \u003d client.find_tap_service("},{"line_number":149,"context_line":"            parsed_args.tap_service, ignore_missing\u003dFalse"},{"line_number":150,"context_line":"        ).id"},{"line_number":151,"context_line":"        obj \u003d client.get_tap_service(id)"},{"line_number":152,"context_line":"        display_columns, columns \u003d _get_columns(obj)"},{"line_number":153,"context_line":"        data \u003d osc_utils.get_dict_properties(obj, columns)"},{"line_number":154,"context_line":"        return display_columns, data"}],"source_content_type":"text/x-python","patch_set":8,"id":"3befa38d_2254f21e","line":151,"in_reply_to":"74d098ee_fecf179f","updated":"2025-12-02 21:44:58.000000000","message":"I honestly dont know what was the original author intention. I assume that he/she was after the object returned by get_tap_service. The find_tap_service is to just look up an id? Which is weird becuse id should have come from `parsed_args`","commit_id":"573c5a3914bd5492fa77e5c1e0a74f7ab5f1e027"}],"openstackclient/tests/unit/network/v2/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import argparse"},{"line_number":14,"context_line":"from cliff import columns as cliff_columns"},{"line_number":15,"context_line":"import copy"},{"line_number":16,"context_line":"from random import choice"},{"line_number":17,"context_line":"from random import randint"}],"source_content_type":"text/x-python","patch_set":2,"id":"70445ac9_fa8d6073","line":14,"updated":"2025-10-14 16:51:59.000000000","message":"nit: Any reason for the alias?","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0053af18c037dd3c333f816b431ee5896574e428","unresolved":true,"context_lines":[{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import argparse"},{"line_number":14,"context_line":"from cliff import columns as cliff_columns"},{"line_number":15,"context_line":"import copy"},{"line_number":16,"context_line":"from random import choice"},{"line_number":17,"context_line":"from random import randint"}],"source_content_type":"text/x-python","patch_set":2,"id":"805da25e_baf9387f","line":14,"in_reply_to":"70445ac9_fa8d6073","updated":"2025-11-03 19:23:25.000000000","message":"same situation, I just imported it because that is how it was in the project I moved it from. I will clean it up","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"686a0f70866a5329330bea6a494b19e728027646","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#   under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import argparse"},{"line_number":14,"context_line":"from cliff import columns as cliff_columns"},{"line_number":15,"context_line":"import copy"},{"line_number":16,"context_line":"from random import choice"},{"line_number":17,"context_line":"from random import randint"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fa733e4_f2121309","line":14,"in_reply_to":"805da25e_baf9387f","updated":"2025-11-06 21:23:42.000000000","message":"Done","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":121,"context_line":"    def assertListItemEqual(self, expected, actual):"},{"line_number":122,"context_line":"        self.assertEqual(len(expected), len(actual))"},{"line_number":123,"context_line":"        for item_expected, item_actual in zip(expected, actual):"},{"line_number":124,"context_line":"            self.assertItemEqual(item_expected, item_actual)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # TODO(amotoki): Move this to osc_lib"},{"line_number":127,"context_line":"    def assertItemEqual(self, expected, actual):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6c46652b_6a7d111f","line":124,"updated":"2025-10-14 16:51:59.000000000","message":"This seems to only be necessary because of the below. You should be able to use `assertCountEqual` (or simply `assertEqual`)","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"686a0f70866a5329330bea6a494b19e728027646","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def assertListItemEqual(self, expected, actual):"},{"line_number":122,"context_line":"        self.assertEqual(len(expected), len(actual))"},{"line_number":123,"context_line":"        for item_expected, item_actual in zip(expected, actual):"},{"line_number":124,"context_line":"            self.assertItemEqual(item_expected, item_actual)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # TODO(amotoki): Move this to osc_lib"},{"line_number":127,"context_line":"    def assertItemEqual(self, expected, actual):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f8d751b_d52ccc65","line":124,"in_reply_to":"6c46652b_6a7d111f","updated":"2025-11-06 21:23:42.000000000","message":"Done","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    def assertItemEqual(self, expected, actual):"},{"line_number":128,"context_line":"        self.assertEqual(len(expected), len(actual))"},{"line_number":129,"context_line":"        for col_expected, col_actual in zip(expected, actual):"},{"line_number":130,"context_line":"            if isinstance(col_expected, cliff_columns.FormattableColumn):"},{"line_number":131,"context_line":"                self.assertIsInstance(col_actual, col_expected.__class__)"},{"line_number":132,"context_line":"                self.assertEqual("},{"line_number":133,"context_line":"                    col_expected.human_readable(), col_actual.human_readable()"},{"line_number":134,"context_line":"                )"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                self.assertEqual(col_expected, col_actual)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"070048b7_e756cae1","line":134,"range":{"start_line":130,"start_character":0,"end_line":134,"end_character":17},"updated":"2025-10-14 16:51:59.000000000","message":"This isn\u0027t needed anymore: cliff columns have been comparable for some time https://review.opendev.org/c/openstack/cliff/+/772866","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"686a0f70866a5329330bea6a494b19e728027646","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    def assertItemEqual(self, expected, actual):"},{"line_number":128,"context_line":"        self.assertEqual(len(expected), len(actual))"},{"line_number":129,"context_line":"        for col_expected, col_actual in zip(expected, actual):"},{"line_number":130,"context_line":"            if isinstance(col_expected, cliff_columns.FormattableColumn):"},{"line_number":131,"context_line":"                self.assertIsInstance(col_actual, col_expected.__class__)"},{"line_number":132,"context_line":"                self.assertEqual("},{"line_number":133,"context_line":"                    col_expected.human_readable(), col_actual.human_readable()"},{"line_number":134,"context_line":"                )"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                self.assertEqual(col_expected, col_actual)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"b9a6189d_196d02a7","line":134,"range":{"start_line":130,"start_character":0,"end_line":134,"end_character":17},"in_reply_to":"00803526_768d7b42","updated":"2025-11-06 21:23:42.000000000","message":"Done","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0053af18c037dd3c333f816b431ee5896574e428","unresolved":true,"context_lines":[{"line_number":127,"context_line":"    def assertItemEqual(self, expected, actual):"},{"line_number":128,"context_line":"        self.assertEqual(len(expected), len(actual))"},{"line_number":129,"context_line":"        for col_expected, col_actual in zip(expected, actual):"},{"line_number":130,"context_line":"            if isinstance(col_expected, cliff_columns.FormattableColumn):"},{"line_number":131,"context_line":"                self.assertIsInstance(col_actual, col_expected.__class__)"},{"line_number":132,"context_line":"                self.assertEqual("},{"line_number":133,"context_line":"                    col_expected.human_readable(), col_actual.human_readable()"},{"line_number":134,"context_line":"                )"},{"line_number":135,"context_line":"            else:"},{"line_number":136,"context_line":"                self.assertEqual(col_expected, col_actual)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"00803526_768d7b42","line":134,"range":{"start_line":130,"start_character":0,"end_line":134,"end_character":17},"in_reply_to":"070048b7_e756cae1","updated":"2025-11-03 19:23:25.000000000","message":"Yep, this whole class is here to simply make the unit test pass for now. See my FIXME above. I was planning to refactor this after we discuss it in upcoming PTG.\n\nI see some overlaps between functions available here in utils.py and what is provided in osc_lib\nFor instance, [utils.py.TestCase](https://opendev.org/openstack/python-openstackclient/src/branch/master/openstackclient/tests/unit/utils.py#L37) and [osc_lib.TestCase](https://opendev.org/openstack/osc-lib/src/branch/master/osc_lib/tests/utils/__init__.py#L87)\nI wanted to discuss what would be best approach if we start moving these stadium projects here. Should they depend on osc_lib or local functions? Maybe before I start moving projects we can do some prep. WDYT?","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.app.client_manager.network \u003d mock.Mock(spec\u003d_proxy.Proxy)"},{"line_number":102,"context_line":"        self.network_client \u003d self.app.client_manager.network"},{"line_number":103,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class TestNetworkV2("}],"source_content_type":"text/x-python","patch_set":5,"id":"3caea291_a32546ea","line":103,"updated":"2025-11-07 12:07:04.000000000","message":"You don\u0027t need this: just use `None` when calling the commands\n\nhttps://review.opendev.org/c/openstack/python-openstackclient/+/909037","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"f819e57ec15956d6fc7a77d31fff259be25baa95","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.app.client_manager.network \u003d mock.Mock(spec\u003d_proxy.Proxy)"},{"line_number":102,"context_line":"        self.network_client \u003d self.app.client_manager.network"},{"line_number":103,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class TestNetworkV2("}],"source_content_type":"text/x-python","patch_set":5,"id":"dcdbb064_2f12d7b8","line":103,"in_reply_to":"3caea291_a32546ea","updated":"2025-11-26 19:01:51.000000000","message":"Done","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0fabcf07155725e8d6f12176b474d0d77e4e85ff","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.app.client_manager.network \u003d mock.Mock(spec\u003d_proxy.Proxy)"},{"line_number":102,"context_line":"        self.network_client \u003d self.app.client_manager.network"},{"line_number":103,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class TestNetworkV2("}],"source_content_type":"text/x-python","patch_set":10,"id":"37ade65d_bb4ca09e","line":103,"updated":"2025-12-04 19:28:47.000000000","message":"That has made its way back in (you removed it in PS6 based on feedback in PS5)","commit_id":"b1b96b12f61db5a7f14f3b75c6dae6de1721b585"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ce827be0b91de29f40a791669d9bc7965b516d00","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.app.client_manager.network \u003d mock.Mock(spec\u003d_proxy.Proxy)"},{"line_number":102,"context_line":"        self.network_client \u003d self.app.client_manager.network"},{"line_number":103,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class TestNetworkV2("}],"source_content_type":"text/x-python","patch_set":10,"id":"8eb824ba_79041dd8","line":103,"in_reply_to":"37ade65d_bb4ca09e","updated":"2025-12-08 18:26:39.000000000","message":"Done","commit_id":"b1b96b12f61db5a7f14f3b75c6dae6de1721b585"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"3c32d2eb8c04dadc5b243a40cb43ac6ae4b03be5","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.app.client_manager.network \u003d mock.Mock(spec\u003d_proxy.Proxy)"},{"line_number":102,"context_line":"        self.network_client \u003d self.app.client_manager.network"},{"line_number":103,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class TestNetworkV2("}],"source_content_type":"text/x-python","patch_set":10,"id":"4b728fa1_1e981640","line":103,"in_reply_to":"37ade65d_bb4ca09e","updated":"2025-12-09 14:11:23.000000000","message":"Thanks, this must have happened when rebasing with other `relation chain` patches.","commit_id":"b1b96b12f61db5a7f14f3b75c6dae6de1721b585"}],"openstackclient/tests/unit/network/v2/taas/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":17,"context_line":"from oslo_utils import uuidutils"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class FakeTapService:"},{"line_number":21,"context_line":"    @staticmethod"},{"line_number":22,"context_line":"    def create_tap_service(attrs\u003dNone):"},{"line_number":23,"context_line":"        \"\"\"Create a fake tap service.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"b724c94c_dc8c32d7","line":20,"updated":"2025-10-14 16:51:59.000000000","message":"These are all neutronclient-style objects. You shouldn\u0027t be using them since they don\u0027t match the type of object that the actual SDK proxy methods would return. Instead, you should either have methods that generate fake SDK objects or use SDK\u0027s fake generation utilities, `generate_fake_resource` and `generate_fake_resources` from `openstack.test.utils`. This could be tackled in a follow-up patch, but I\u0027d like to see that patch before we merge this.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"686a0f70866a5329330bea6a494b19e728027646","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from oslo_utils import uuidutils"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"class FakeTapService:"},{"line_number":21,"context_line":"    @staticmethod"},{"line_number":22,"context_line":"    def create_tap_service(attrs\u003dNone):"},{"line_number":23,"context_line":"        \"\"\"Create a fake tap service.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"2da46850_1b4bfcf2","line":20,"in_reply_to":"b724c94c_dc8c32d7","updated":"2025-11-06 21:23:42.000000000","message":"I chained a review[1] to this review to address it.\n\n[1] https://review.opendev.org/c/openstack/python-openstackclient/+/966354","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"}],"openstackclient/tests/unit/network/v2/taas/test_osc_tap_flow.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from openstack.network.v2 import tap_flow as _tap_flow"},{"line_number":20,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":21,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":22,"context_line":"from oslo_utils import uuidutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from openstackclient.network.v2.taas import tap_flow as osc_tap_flow"},{"line_number":25,"context_line":"from openstackclient.network.v2.taas import tap_service as osc_tap_service"},{"line_number":26,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as network_fakes"},{"line_number":27,"context_line":"from openstackclient.tests.unit.network.v2.taas import fakes"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"columns_long \u003d tuple("},{"line_number":31,"context_line":"    col"}],"source_content_type":"text/x-python","patch_set":2,"id":"aed68a85_746db94a","line":28,"range":{"start_line":22,"start_character":32,"end_line":28,"end_character":1},"updated":"2025-10-14 16:51:59.000000000","message":"nit: import grouping. ditto for the subsequent files","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from openstack.network.v2 import tap_flow as _tap_flow"},{"line_number":20,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":21,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":22,"context_line":"from oslo_utils import uuidutils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from openstackclient.network.v2.taas import tap_flow as osc_tap_flow"},{"line_number":25,"context_line":"from openstackclient.network.v2.taas import tap_service as osc_tap_service"},{"line_number":26,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as network_fakes"},{"line_number":27,"context_line":"from openstackclient.tests.unit.network.v2.taas import fakes"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"columns_long \u003d tuple("},{"line_number":31,"context_line":"    col"}],"source_content_type":"text/x-python","patch_set":2,"id":"bbbb85c4_7db7687d","line":28,"range":{"start_line":22,"start_character":32,"end_line":28,"end_character":1},"in_reply_to":"aed68a85_746db94a","updated":"2025-11-07 12:07:04.000000000","message":"Done","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def setUp(self):"},{"line_number":60,"context_line":"        super().setUp()"},{"line_number":61,"context_line":"        self.cmd \u003d osc_tap_flow.CreateTapFlow(self.app, self.namespace)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_create_tap_flow(self):"},{"line_number":64,"context_line":"        \"\"\"Test Create Tap Flow.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"a7bea1e0_7b09b0a9","line":61,"updated":"2025-11-07 12:07:04.000000000","message":"As noted previously\n\n```suggestion\n        self.cmd \u003d osc_tap_flow.CreateTapFlow(self.app, None)\n```\n\nHere and elsewhere (and easy `sed` replacement)","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def setUp(self):"},{"line_number":60,"context_line":"        super().setUp()"},{"line_number":61,"context_line":"        self.cmd \u003d osc_tap_flow.CreateTapFlow(self.app, self.namespace)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_create_tap_flow(self):"},{"line_number":64,"context_line":"        \"\"\"Test Create Tap Flow.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3326807e_9fe86ef6","line":61,"in_reply_to":"a7bea1e0_7b09b0a9","updated":"2025-11-18 18:57:15.000000000","message":"Done","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                \u0027source_port\u0027: port_id,"},{"line_number":73,"context_line":"                \u0027tap_service_id\u0027: fake_tap_service[\u0027id\u0027],"},{"line_number":74,"context_line":"            }"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.app.client_manager.network \u003d mock.Mock()"},{"line_number":77,"context_line":"        self.app.client_manager.network.create_tap_flow \u003d mock.Mock("},{"line_number":78,"context_line":"            return_value\u003dfake_tap_flow"},{"line_number":79,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"f7bdeab8_f05ed3e4","line":76,"range":{"start_line":75,"start_character":9,"end_line":76,"end_character":53},"updated":"2025-11-07 12:07:04.000000000","message":"You don\u0027t need to do this: the networking `FakeClientMixin` used by the `TestNetworkV2` base test class [does this for you](https://github.com/openstack/python-openstackclient/blob/3cc6b24bb5a9334ae5117a508d653dc9a727689d/openstackclient/tests/unit/network/v2/fakes.py#L100) (and better too, since it autospecs).","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                \u0027source_port\u0027: port_id,"},{"line_number":73,"context_line":"                \u0027tap_service_id\u0027: fake_tap_service[\u0027id\u0027],"},{"line_number":74,"context_line":"            }"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.app.client_manager.network \u003d mock.Mock()"},{"line_number":77,"context_line":"        self.app.client_manager.network.create_tap_flow \u003d mock.Mock("},{"line_number":78,"context_line":"            return_value\u003dfake_tap_flow"},{"line_number":79,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":5,"id":"2d25359a_135e8f6e","line":76,"range":{"start_line":75,"start_character":9,"end_line":76,"end_character":53},"in_reply_to":"f7bdeab8_f05ed3e4","updated":"2025-11-18 18:57:15.000000000","message":"Done","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":74,"context_line":"            }"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.app.client_manager.network \u003d mock.Mock()"},{"line_number":77,"context_line":"        self.app.client_manager.network.create_tap_flow \u003d mock.Mock("},{"line_number":78,"context_line":"            return_value\u003dfake_tap_flow"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        self.app.client_manager.network.find_port \u003d mock.Mock("},{"line_number":81,"context_line":"            return_value\u003d{\u0027id\u0027: port_id}"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        self.app.client_manager.network.find_tap_service \u003d mock.Mock("},{"line_number":84,"context_line":"            return_value\u003dfake_tap_service"},{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":"        arg_list \u003d ["},{"line_number":87,"context_line":"            \u0027--name\u0027,"},{"line_number":88,"context_line":"            fake_tap_flow[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"1917bcc7_046e0696","line":85,"range":{"start_line":77,"start_character":0,"end_line":85,"end_character":9},"updated":"2025-11-07 12:07:04.000000000","message":"These \"methods\" are already mocks: you can simply set the return value.\n\n```suggestion\n        self.app.client_manager.network.create_tap_flow.return_value \u003d fake_tap_flow\n        self.app.client_manager.network.find_port.return_value \u003d {\u0027id\u0027: port_id}\n        self.app.client_manager.network.find_tap_service.return_value \u003d fake_tap_service\n        )\n```\n\nThere are students working on cleaning this up for existing code so let\u0027s not add to their backlog 😂","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            }"},{"line_number":75,"context_line":"        )"},{"line_number":76,"context_line":"        self.app.client_manager.network \u003d mock.Mock()"},{"line_number":77,"context_line":"        self.app.client_manager.network.create_tap_flow \u003d mock.Mock("},{"line_number":78,"context_line":"            return_value\u003dfake_tap_flow"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        self.app.client_manager.network.find_port \u003d mock.Mock("},{"line_number":81,"context_line":"            return_value\u003d{\u0027id\u0027: port_id}"},{"line_number":82,"context_line":"        )"},{"line_number":83,"context_line":"        self.app.client_manager.network.find_tap_service \u003d mock.Mock("},{"line_number":84,"context_line":"            return_value\u003dfake_tap_service"},{"line_number":85,"context_line":"        )"},{"line_number":86,"context_line":"        arg_list \u003d ["},{"line_number":87,"context_line":"            \u0027--name\u0027,"},{"line_number":88,"context_line":"            fake_tap_flow[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":5,"id":"d2c05f5b_cc03065a","line":85,"range":{"start_line":77,"start_character":0,"end_line":85,"end_character":9},"in_reply_to":"1917bcc7_046e0696","updated":"2025-11-18 18:57:15.000000000","message":"Done","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arg_list, verify_list)"},{"line_number":104,"context_line":"        with mock.patch.object("},{"line_number":105,"context_line":"            self.app.client_manager.network, \u0027_find\u0027"},{"line_number":106,"context_line":"        ) as nc_find:"},{"line_number":107,"context_line":"            nc_find.side_effect \u003d [{\u0027id\u0027: fake_tap_flow[\u0027tap_service_id\u0027]}]"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":110,"context_line":"            mock_create_t_f \u003d self.app.client_manager.network.create_tap_flow"}],"source_content_type":"text/x-python","patch_set":5,"id":"607742fc_0af29209","line":107,"range":{"start_line":104,"start_character":0,"end_line":107,"end_character":75},"updated":"2025-11-07 12:07:04.000000000","message":"As above, this should already be a mock. You should be able to remove the context manager and simply set \u0027side_effect`\n\n\n```suggestion\n        self.app.client_manager.network._find.side_effect \u003d [{\u0027id\u0027: fake_tap_flow[\u0027tap_service_id\u0027]}]\n```\n\nAlthough I\u0027m personally surprised that this is needed. Are you sure it is? I don\u0027t see any `assert_called_once_with` calls below...","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arg_list, verify_list)"},{"line_number":104,"context_line":"        with mock.patch.object("},{"line_number":105,"context_line":"            self.app.client_manager.network, \u0027_find\u0027"},{"line_number":106,"context_line":"        ) as nc_find:"},{"line_number":107,"context_line":"            nc_find.side_effect \u003d [{\u0027id\u0027: fake_tap_flow[\u0027tap_service_id\u0027]}]"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            columns, data \u003d self.cmd.take_action(parsed_args)"},{"line_number":110,"context_line":"            mock_create_t_f \u003d self.app.client_manager.network.create_tap_flow"}],"source_content_type":"text/x-python","patch_set":5,"id":"db7fa529_c384b7d1","line":107,"range":{"start_line":104,"start_character":0,"end_line":107,"end_character":75},"in_reply_to":"607742fc_0af29209","updated":"2025-11-18 18:57:15.000000000","message":"Good catch. I also don\u0027t even see need to mock the private `_find`","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"}],"openstackclient/tests/unit/network/v2/taas/test_osc_tap_mirror.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":17,"context_line":"from openstack.network.v2 import tap_mirror"},{"line_number":18,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":19,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":20,"context_line":"from oslo_utils import uuidutils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from openstackclient.network.v2.taas import tap_mirror as osc_tap_mirror"},{"line_number":23,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as network_fakes"}],"source_content_type":"text/x-python","patch_set":5,"id":"5abe3f66_447bd78c","line":20,"updated":"2025-11-07 12:07:04.000000000","message":"We don\u0027t use oslo in SDK or OSC since they\u0027re too big/expensive to import. I\u0027m guessing it\u0027s getting dragged into tests somehow (to say this is passing) but it shouldn\u0027t be used. You want stdlib `uuid` here","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d4b7bc5880e008d071c003cbf3cf503cebc6846b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from openstack.network.v2 import tap_mirror"},{"line_number":18,"context_line":"from osc_lib import utils as osc_utils"},{"line_number":19,"context_line":"from osc_lib.utils import columns as column_util"},{"line_number":20,"context_line":"from oslo_utils import uuidutils"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from openstackclient.network.v2.taas import tap_mirror as osc_tap_mirror"},{"line_number":23,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as network_fakes"}],"source_content_type":"text/x-python","patch_set":5,"id":"6bd3dede_28c2e9f9","line":20,"in_reply_to":"5abe3f66_447bd78c","updated":"2025-11-18 18:57:15.000000000","message":"Done","commit_id":"08207fd0f09320e4fe4f839aec736d32fc57ea86"}],"pyproject.toml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a9b16c317829beddf66c22c62064dbccba903692","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"51646ba6_55169a6a","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"updated":"2025-10-14 16:51:59.000000000","message":"```suggestion\nsubnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\"\n```","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e62fdf0891e19254af58cdadb825afd7a4554453","unresolved":false,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"2f33ddd7_f1f5bc69","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"448dc4b1_c9829e80","updated":"2025-12-11 13:28:30.000000000","message":"The code can stay in the same modules, yes, but if we want to change the entrypoint group they are under we need to make some changes. I\u0027ve proposed a potential solution at https://review.opendev.org/c/openstack/python-openstackclient/+/970622","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0053af18c037dd3c333f816b431ee5896574e428","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"a372453b_15aa0d74","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"51646ba6_55169a6a","updated":"2025-11-03 19:23:25.000000000","message":"Do you have a concern with having a comment in .toml file? I like the comment because it gives me nice visual clue where to find entry points for tapaas stadium project under neutron.v2 section.\nOnce we move more stadium projects this will include additinal sections like\n```\n# Firewall-as-a-Service\n...\n\n# Vpn-as-a-Service\n...\n```\n all still under network.v2 namespace...\nBut if you want me to remove it I can, i dont feel strongly about it.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"3c32d2eb8c04dadc5b243a40cb43ac6ae4b03be5","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"448dc4b1_c9829e80","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"5830e581_a7f63d9e","updated":"2025-12-09 14:11:23.000000000","message":"Correct me if I am wrong but I think we can leave this as is. I.e. leave tapaas under `network.v2.taas.*`. And future network stadium projects will also go under `network.v2.\u003cstadium project name\u003e.*`","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c0a3ecfb7887b02ef66ad210d8bc79d02adc2df2","unresolved":false,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"e76b9099_3ae086b9","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"5830e581_a7f63d9e","updated":"2025-12-08 18:26:52.000000000","message":"Let\u0027s come back to this later.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d88f943bb7d7149e65043f279eefa1c061102ff0","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"fc47dfc6_18a9815a","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"6b8a4fdd_b9144a2c","updated":"2025-11-11 14:35:22.000000000","message":"Right, I would need to know if there is any drawback on having `openstack.network.v2.taas` entry point","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1beddbd261365d822844965096a8086b905878a3","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"aa54bc35_71036b05","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"a372453b_15aa0d74","updated":"2025-11-07 11:25:08.000000000","message":"I would prefer to have the stadium project commands separated by these comments.","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"bc0e857d21585f77fd149c8b34e7a62e305bde80","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"6b8a4fdd_b9144a2c","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"aa54bc35_71036b05","updated":"2025-11-07 12:07:04.000000000","message":"We already have a grouping mechanism for this: the entrypoint. Perhaps we could use a different entrypoint instead?","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0ee381a6506da4f2d785b5d3b9fc8f23f68b9d51","unresolved":true,"context_lines":[{"line_number":538,"context_line":"subnet_pool_list \u003d \"openstackclient.network.v2.subnet_pool:ListSubnetPool\""},{"line_number":539,"context_line":"subnet_pool_set \u003d \"openstackclient.network.v2.subnet_pool:SetSubnetPool\""},{"line_number":540,"context_line":"subnet_pool_show \u003d \"openstackclient.network.v2.subnet_pool:ShowSubnetPool\""},{"line_number":541,"context_line":"subnet_pool_unset \u003d \"openstackclient.network.v2.subnet_pool:UnsetSubnetPool\""},{"line_number":542,"context_line":""},{"line_number":543,"context_line":"# Tap-as-a-Service"},{"line_number":544,"context_line":"tap_flow_create \u003d \"openstackclient.network.v2.taas.tap_flow:CreateTapFlow\""},{"line_number":545,"context_line":"tap_flow_delete \u003d \"openstackclient.network.v2.taas.tap_flow:DeleteTapFlow\""},{"line_number":546,"context_line":"tap_flow_list \u003d \"openstackclient.network.v2.taas.tap_flow:ListTapFlow\""}],"source_content_type":"text/x-toml","patch_set":2,"id":"5830e581_a7f63d9e","line":543,"range":{"start_line":541,"start_character":0,"end_line":543,"end_character":18},"in_reply_to":"fc47dfc6_18a9815a","updated":"2025-11-28 17:46:00.000000000","message":"Sorry, we can\u0027t do this yet. The code for loading from these namespaces is here:\n\nhttps://github.com/openstack/python-openstackclient/blob/f8effe997e7c16b811ce0a165552680f6aaef6a2/openstackclient/shell.py#L121-L128\n\nWe would need to extend that to allow *also* loading subgroups, likely via some attribute in clients (e.g. `openstackclient.network.v2.client`) like `EXTENSIONS` or `SUB_PROJECTS`. I\u0027d personally prefer that, but I won\u0027t insist on it","commit_id":"61731ca37ca574ac730097430e9be0666de8c090"}]}
