)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"1156880d111287baec63087569ea9176a75c1a97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"61f79092_7a11b62a","updated":"2026-06-04 10:34:18.000000000","message":"FYI, you can (and likely should) disable the strict checks for this module while you\u0027re importing it. We can add hints later then. Simply extend the `[[tool.mypy.overrides]]` section in `pyproject.toml` to add this new module.","commit_id":"8f9cebef62e1caa2ecf8583d85f7fb6071427724"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"049c414464110c68b202506fe20656753eca9d27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fe78edba_3aa093be","in_reply_to":"61f79092_7a11b62a","updated":"2026-06-04 10:36:12.000000000","message":"Done","commit_id":"8f9cebef62e1caa2ecf8583d85f7fb6071427724"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"12c91b64_fad26816","updated":"2026-06-04 10:58:49.000000000","message":"Couple of early comments","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"78079f58ed5d09c01b5292055ed21308e4965786","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"effd3fe4_63e194a7","updated":"2026-06-04 10:41:33.000000000","message":"I have yet to review this in depth, but you need to ignore the old modules to ensure we don\u0027t randomly load them. You want to extend `API_EXTENSIONS` in `openstackclient/network/client.py` and `IGNORED_MODULES` in `openstackclient/shell.py`","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"05921c921d00b40144fe3e4146482006f6672e31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"38f4d9a6_18913ef6","updated":"2026-06-26 13:35:04.000000000","message":"There are a number of additional follow-ups needed here, on top of the typing changes, but let\u0027s get this in","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"}],"openstackclient/network/v2/vpnaas/endpoint_group.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":43,"context_line":"    \u0027project_id\u0027: \u0027Project\u0027,"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _get_common_parser(parser):"},{"line_number":48,"context_line":"    parser.add_argument("},{"line_number":49,"context_line":"        \u0027--description\u0027,"},{"line_number":50,"context_line":"        metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":51,"context_line":"        help\u003d_(\u0027Description for the endpoint group\u0027),"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":"    return parser"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":57,"context_line":"    attrs \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fed59fe_2bc4e3db","line":54,"range":{"start_line":46,"start_character":1,"end_line":54,"end_character":1},"updated":"2026-06-04 10:58:49.000000000","message":"Can we just inline this?","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027project_id\u0027: \u0027Project\u0027,"},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def _get_common_parser(parser):"},{"line_number":48,"context_line":"    parser.add_argument("},{"line_number":49,"context_line":"        \u0027--description\u0027,"},{"line_number":50,"context_line":"        metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":51,"context_line":"        help\u003d_(\u0027Description for the endpoint group\u0027),"},{"line_number":52,"context_line":"    )"},{"line_number":53,"context_line":"    return parser"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":57,"context_line":"    attrs \u003d {}"}],"source_content_type":"text/x-python","patch_set":3,"id":"ddb18f40_0db794e5","line":54,"range":{"start_line":46,"start_character":1,"end_line":54,"end_character":1},"in_reply_to":"1fed59fe_2bc4e3db","updated":"2026-06-09 12:22:28.000000000","message":"I inlined all","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    attrs \u003d {}"},{"line_number":58,"context_line":"    if is_create:"},{"line_number":59,"context_line":"        if parsed_args.project is not None:"},{"line_number":60,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d identity_common.find_project("},{"line_number":61,"context_line":"                client_manager.identity,"},{"line_number":62,"context_line":"                parsed_args.project,"},{"line_number":63,"context_line":"                parsed_args.project_domain,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9ebb2569_074d1e7c","line":60,"updated":"2026-06-04 10:58:49.000000000","message":"Should this be `project_id` now?","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    attrs \u003d {}"},{"line_number":58,"context_line":"    if is_create:"},{"line_number":59,"context_line":"        if parsed_args.project is not None:"},{"line_number":60,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d identity_common.find_project("},{"line_number":61,"context_line":"                client_manager.identity,"},{"line_number":62,"context_line":"                parsed_args.project,"},{"line_number":63,"context_line":"                parsed_args.project_domain,"}],"source_content_type":"text/x-python","patch_set":3,"id":"29aae693_f600cef2","line":60,"in_reply_to":"05a472d3_1937e9f4","updated":"2026-06-22 11:51:33.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a9caadfe2eb22d88f1dcb9aa07426a7a19993198","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    attrs \u003d {}"},{"line_number":58,"context_line":"    if is_create:"},{"line_number":59,"context_line":"        if parsed_args.project is not None:"},{"line_number":60,"context_line":"            attrs[\u0027tenant_id\u0027] \u003d identity_common.find_project("},{"line_number":61,"context_line":"                client_manager.identity,"},{"line_number":62,"context_line":"                parsed_args.project,"},{"line_number":63,"context_line":"                parsed_args.project_domain,"}],"source_content_type":"text/x-python","patch_set":3,"id":"05a472d3_1937e9f4","line":60,"in_reply_to":"9ebb2569_074d1e7c","updated":"2026-06-09 12:41:42.000000000","message":"I changed all relevant tenant_id to project_id","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    \u0027project_id\u0027: \u0027Project\u0027,"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":47,"context_line":"    attrs \u003d {}"},{"line_number":48,"context_line":"    if is_create:"},{"line_number":49,"context_line":"        if parsed_args.project is not None:"},{"line_number":50,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":51,"context_line":"                client_manager.identity,"},{"line_number":52,"context_line":"                parsed_args.project,"},{"line_number":53,"context_line":"                parsed_args.project_domain,"},{"line_number":54,"context_line":"            ).id"},{"line_number":55,"context_line":"    if parsed_args.description:"},{"line_number":56,"context_line":"        attrs[\u0027description\u0027] \u003d parsed_args.description"},{"line_number":57,"context_line":"    return attrs"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class CreateEndpointGroup(command.ShowOne):"}],"source_content_type":"text/x-python","patch_set":6,"id":"4f0fd170_54fe214c","line":57,"range":{"start_line":45,"start_character":1,"end_line":57,"end_character":16},"updated":"2026-06-22 11:51:33.000000000","message":"Could we inline this? For the sake of a tiny bit of duplication it would be much more readable, IMO (and it\u0027s barely any duplication given there are only two users here)\n\nAlso, could you use SDK here instead of keystoneclient? See [the migration patch](https://review.opendev.org/c/openstack/python-openstackclient/+/994097) for other commands for an example of how to do this (it\u0027s pretty simple)","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    \u0027project_id\u0027: \u0027Project\u0027,"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":47,"context_line":"    attrs \u003d {}"},{"line_number":48,"context_line":"    if is_create:"},{"line_number":49,"context_line":"        if parsed_args.project is not None:"},{"line_number":50,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":51,"context_line":"                client_manager.identity,"},{"line_number":52,"context_line":"                parsed_args.project,"},{"line_number":53,"context_line":"                parsed_args.project_domain,"},{"line_number":54,"context_line":"            ).id"},{"line_number":55,"context_line":"    if parsed_args.description:"},{"line_number":56,"context_line":"        attrs[\u0027description\u0027] \u003d parsed_args.description"},{"line_number":57,"context_line":"    return attrs"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class CreateEndpointGroup(command.ShowOne):"}],"source_content_type":"text/x-python","patch_set":6,"id":"e8d6b1e2_477f3378","line":57,"range":{"start_line":45,"start_character":1,"end_line":57,"end_character":16},"in_reply_to":"4f0fd170_54fe214c","updated":"2026-06-23 14:08:44.000000000","message":"good idea, done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6991b7f242e15cc8d64bbeb14f46acf2a1d4bb0b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \u0027project_id\u0027: \u0027Project\u0027,"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":47,"context_line":"    attrs \u003d {}"},{"line_number":48,"context_line":"    if is_create:"},{"line_number":49,"context_line":"        if parsed_args.project is not None:"},{"line_number":50,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":51,"context_line":"                client_manager.identity,"},{"line_number":52,"context_line":"                parsed_args.project,"},{"line_number":53,"context_line":"                parsed_args.project_domain,"},{"line_number":54,"context_line":"            ).id"},{"line_number":55,"context_line":"    if parsed_args.description:"},{"line_number":56,"context_line":"        attrs[\u0027description\u0027] \u003d parsed_args.description"},{"line_number":57,"context_line":"    return attrs"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class CreateEndpointGroup(command.ShowOne):"}],"source_content_type":"text/x-python","patch_set":6,"id":"46cf4051_3e41c330","line":57,"range":{"start_line":45,"start_character":1,"end_line":57,"end_character":16},"in_reply_to":"e8d6b1e2_477f3378","updated":"2026-06-26 10:27:21.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--type\u0027,"},{"line_number":75,"context_line":"            required\u003dTrue,"},{"line_number":76,"context_line":"            help\u003d_(\u0027Type of endpoints in group (e.g. subnet, cidr)\u0027),"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"68e4615f_0c87ca7d","line":75,"updated":"2026-06-22 11:51:33.000000000","message":"Should we have `choices` defined here? Are there a finite set of types?","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        parser.add_argument("},{"line_number":74,"context_line":"            \u0027--type\u0027,"},{"line_number":75,"context_line":"            required\u003dTrue,"},{"line_number":76,"context_line":"            help\u003d_(\u0027Type of endpoints in group (e.g. subnet, cidr)\u0027),"},{"line_number":77,"context_line":"        )"},{"line_number":78,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":6,"id":"fb305473_8d1f246b","line":75,"in_reply_to":"68e4615f_0c87ca7d","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        parser.add_argument("},{"line_number":119,"context_line":"            \u0027endpoint_group\u0027,"},{"line_number":120,"context_line":"            metavar\u003d\u0027\u003cendpoint-group\u003e\u0027,"},{"line_number":121,"context_line":"            nargs\u003d\u0027+\u0027,"},{"line_number":122,"context_line":"            help\u003d_(\u0027Endpoint group(s) to delete (name or ID)\u0027),"},{"line_number":123,"context_line":"        )"},{"line_number":124,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a1fedf8_d060bceb","line":121,"updated":"2026-06-22 11:51:33.000000000","message":"nit:\n\n```suggestion\n            nargs\u003d\u0027+\u0027,\n            dest\u003d\u0027endpoint_groups\u0027,\n```\n\nand then the for-loop below looks a little saner 😀","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6991b7f242e15cc8d64bbeb14f46acf2a1d4bb0b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        parser.add_argument("},{"line_number":119,"context_line":"            \u0027endpoint_group\u0027,"},{"line_number":120,"context_line":"            metavar\u003d\u0027\u003cendpoint-group\u003e\u0027,"},{"line_number":121,"context_line":"            nargs\u003d\u0027+\u0027,"},{"line_number":122,"context_line":"            help\u003d_(\u0027Endpoint group(s) to delete (name or ID)\u0027),"},{"line_number":123,"context_line":"        )"},{"line_number":124,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":6,"id":"49f2fffb_770a14e3","line":121,"in_reply_to":"1f52907f_1d43eff0","updated":"2026-06-26 10:27:21.000000000","message":"Ah, indeed. It\u0027s a positional argument so we actually change the first argument (`\u0027endpoint_group\u0027` -\u003e `\u0027endpoint_groups\u0027`). This can be done as a follow-up","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        parser.add_argument("},{"line_number":119,"context_line":"            \u0027endpoint_group\u0027,"},{"line_number":120,"context_line":"            metavar\u003d\u0027\u003cendpoint-group\u003e\u0027,"},{"line_number":121,"context_line":"            nargs\u003d\u0027+\u0027,"},{"line_number":122,"context_line":"            help\u003d_(\u0027Endpoint group(s) to delete (name or ID)\u0027),"},{"line_number":123,"context_line":"        )"},{"line_number":124,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f52907f_1d43eff0","line":121,"in_reply_to":"7a1fedf8_d060bceb","updated":"2026-06-23 14:08:44.000000000","message":"I tried it but seems like together with  nargs\u003d\u0027+\u0027, argparse complains","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"}],"openstackclient/network/v2/vpnaas/ikepolicy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":165,"context_line":"    return parser"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":169,"context_line":"    attrs \u003d {}"},{"line_number":170,"context_line":"    if is_create:"},{"line_number":171,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"49466a86_34ea9f6b","line":168,"updated":"2026-06-22 11:51:33.000000000","message":"Can you pass `network_client` here instead of the `client_manager` since that\u0027s all you should need after (see below)","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":165,"context_line":"    return parser"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":169,"context_line":"    attrs \u003d {}"},{"line_number":170,"context_line":"    if is_create:"},{"line_number":171,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6806af98_dfbfff73","line":168,"in_reply_to":"49466a86_34ea9f6b","updated":"2026-06-23 14:08:44.000000000","message":"makes sense","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":169,"context_line":"    attrs \u003d {}"},{"line_number":170,"context_line":"    if is_create:"},{"line_number":171,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":172,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":173,"context_line":"                client_manager.identity,"},{"line_number":174,"context_line":"                parsed_args.project,"},{"line_number":175,"context_line":"                parsed_args.project_domain,"},{"line_number":176,"context_line":"            ).id"},{"line_number":177,"context_line":"    if parsed_args.description:"},{"line_number":178,"context_line":"        attrs[\u0027description\u0027] \u003d parsed_args.description"},{"line_number":179,"context_line":"    if parsed_args.auth_algorithm:"}],"source_content_type":"text/x-python","patch_set":6,"id":"8119be64_5f7ec220","line":176,"range":{"start_line":170,"start_character":0,"end_line":176,"end_character":16},"updated":"2026-06-22 11:51:33.000000000","message":"Same comment about using SDK here instead. I also wonder if we could inline this one at the call sites and drop the `is_create` flag to simplify this?","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":169,"context_line":"    attrs \u003d {}"},{"line_number":170,"context_line":"    if is_create:"},{"line_number":171,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":172,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":173,"context_line":"                client_manager.identity,"},{"line_number":174,"context_line":"                parsed_args.project,"},{"line_number":175,"context_line":"                parsed_args.project_domain,"},{"line_number":176,"context_line":"            ).id"},{"line_number":177,"context_line":"    if parsed_args.description:"},{"line_number":178,"context_line":"        attrs[\u0027description\u0027] \u003d parsed_args.description"},{"line_number":179,"context_line":"    if parsed_args.auth_algorithm:"}],"source_content_type":"text/x-python","patch_set":6,"id":"b83c88dc_c35604ba","line":176,"range":{"start_line":170,"start_character":0,"end_line":176,"end_character":16},"in_reply_to":"8119be64_5f7ec220","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"}],"openstackclient/network/v2/vpnaas/ipsec_site_connection.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":149,"context_line":"    )"},{"line_number":150,"context_line":"    return parser"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":154,"context_line":"    attrs \u003d {}"},{"line_number":155,"context_line":"    if is_create:"},{"line_number":156,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":157,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":158,"context_line":"                client_manager.identity,"},{"line_number":159,"context_line":"                parsed_args.project,"},{"line_number":160,"context_line":"                parsed_args.project_domain,"},{"line_number":161,"context_line":"            ).id"},{"line_number":162,"context_line":"    if parsed_args.description:"},{"line_number":163,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":164,"context_line":"    if parsed_args.mtu:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a101ea00_3202e9c5","line":161,"range":{"start_line":152,"start_character":1,"end_line":161,"end_character":16},"updated":"2026-06-22 11:51:33.000000000","message":"Same comments","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    )"},{"line_number":150,"context_line":"    return parser"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":154,"context_line":"    attrs \u003d {}"},{"line_number":155,"context_line":"    if is_create:"},{"line_number":156,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":157,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":158,"context_line":"                client_manager.identity,"},{"line_number":159,"context_line":"                parsed_args.project,"},{"line_number":160,"context_line":"                parsed_args.project_domain,"},{"line_number":161,"context_line":"            ).id"},{"line_number":162,"context_line":"    if parsed_args.description:"},{"line_number":163,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":164,"context_line":"    if parsed_args.mtu:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ea99e1da_bba622d7","line":161,"range":{"start_line":152,"start_character":1,"end_line":161,"end_character":16},"in_reply_to":"a101ea00_3202e9c5","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"}],"openstackclient/network/v2/vpnaas/ipsecpolicy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":159,"context_line":"        help\u003d_(\u0027Transform protocol for IPsec policy\u0027),"},{"line_number":160,"context_line":"    )"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":164,"context_line":"    attrs \u003d {}"},{"line_number":165,"context_line":"    if is_create:"},{"line_number":166,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":167,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":168,"context_line":"                client_manager.identity,"},{"line_number":169,"context_line":"                parsed_args.project,"},{"line_number":170,"context_line":"                parsed_args.project_domain,"},{"line_number":171,"context_line":"            ).id"},{"line_number":172,"context_line":"    if parsed_args.description:"},{"line_number":173,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":174,"context_line":"    if parsed_args.auth_algorithm:"}],"source_content_type":"text/x-python","patch_set":6,"id":"91cdb407_a6c51f8b","line":171,"range":{"start_line":162,"start_character":1,"end_line":171,"end_character":16},"updated":"2026-06-22 11:51:33.000000000","message":"Same comments","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        help\u003d_(\u0027Transform protocol for IPsec policy\u0027),"},{"line_number":160,"context_line":"    )"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":164,"context_line":"    attrs \u003d {}"},{"line_number":165,"context_line":"    if is_create:"},{"line_number":166,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":167,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":168,"context_line":"                client_manager.identity,"},{"line_number":169,"context_line":"                parsed_args.project,"},{"line_number":170,"context_line":"                parsed_args.project_domain,"},{"line_number":171,"context_line":"            ).id"},{"line_number":172,"context_line":"    if parsed_args.description:"},{"line_number":173,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":174,"context_line":"    if parsed_args.auth_algorithm:"}],"source_content_type":"text/x-python","patch_set":6,"id":"cf499864_8b71237f","line":171,"range":{"start_line":162,"start_character":1,"end_line":171,"end_character":16},"in_reply_to":"91cdb407_a6c51f8b","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"}],"openstackclient/network/v2/vpnaas/utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"05921c921d00b40144fe3e4146482006f6672e31","unresolved":true,"context_lines":[{"line_number":36,"context_line":"lifetime_keys \u003d [\u0027units\u0027, \u0027value\u0027]"},{"line_number":37,"context_line":"lifetime_units \u003d [\u0027seconds\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def validate_dpd_dict(dpd_dict):"},{"line_number":41,"context_line":"    for key, value in dpd_dict.items():"},{"line_number":42,"context_line":"        if key not in DPD_SUPPORTED_KEYS:"},{"line_number":43,"context_line":"            message \u003d _("},{"line_number":44,"context_line":"                \"DPD Dictionary KeyError: \""},{"line_number":45,"context_line":"                \"Reason-Invalid DPD key : \""},{"line_number":46,"context_line":"                \"\u0027%(key)s\u0027 not in %(supported_key)s\""},{"line_number":47,"context_line":"            ) % {\u0027key\u0027: key, \u0027supported_key\u0027: DPD_SUPPORTED_KEYS}"},{"line_number":48,"context_line":"            raise exceptions.CommandError(message)"},{"line_number":49,"context_line":"        if key \u003d\u003d \u0027action\u0027 and value not in DPD_SUPPORTED_ACTIONS:"},{"line_number":50,"context_line":"            message \u003d _("},{"line_number":51,"context_line":"                \"DPD Dictionary ValueError: \""},{"line_number":52,"context_line":"                \"Reason-Invalid DPD action : \""},{"line_number":53,"context_line":"                \"\u0027%(key_value)s\u0027 not in %(supported_action)s\""},{"line_number":54,"context_line":"            ) % {\u0027key_value\u0027: value, \u0027supported_action\u0027: DPD_SUPPORTED_ACTIONS}"},{"line_number":55,"context_line":"            raise exceptions.CommandError(message)"},{"line_number":56,"context_line":"        if key in (\u0027interval\u0027, \u0027timeout\u0027):"},{"line_number":57,"context_line":"            try:"},{"line_number":58,"context_line":"                if int(value) \u003c\u003d 0:"},{"line_number":59,"context_line":"                    raise ValueError()"},{"line_number":60,"context_line":"            except ValueError:"},{"line_number":61,"context_line":"                message \u003d _("},{"line_number":62,"context_line":"                    \"DPD Dictionary ValueError: \""},{"line_number":63,"context_line":"                    \"Reason-Invalid positive integer value: \""},{"line_number":64,"context_line":"                    \"\u0027%(key)s\u0027 \u003d %(value)s\""},{"line_number":65,"context_line":"                ) % {\u0027key\u0027: key, \u0027value\u0027: value}"},{"line_number":66,"context_line":"                raise exceptions.CommandError(message)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                dpd_dict[key] \u003d int(value)"},{"line_number":69,"context_line":"    return"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def validate_lifetime_dict(lifetime_dict):"}],"source_content_type":"text/x-python","patch_set":8,"id":"6fa5ed32_ebdb6768","line":69,"range":{"start_line":39,"start_character":1,"end_line":69,"end_character":10},"updated":"2026-06-26 13:35:04.000000000","message":"This has a single caller (`openstackclient/network/v2/vpnaas/ipsec_site_connection.py`) and should be moved there","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec574437169b1a69be10289b719e87f689018852","unresolved":false,"context_lines":[{"line_number":36,"context_line":"lifetime_keys \u003d [\u0027units\u0027, \u0027value\u0027]"},{"line_number":37,"context_line":"lifetime_units \u003d [\u0027seconds\u0027]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"def validate_dpd_dict(dpd_dict):"},{"line_number":41,"context_line":"    for key, value in dpd_dict.items():"},{"line_number":42,"context_line":"        if key not in DPD_SUPPORTED_KEYS:"},{"line_number":43,"context_line":"            message \u003d _("},{"line_number":44,"context_line":"                \"DPD Dictionary KeyError: \""},{"line_number":45,"context_line":"                \"Reason-Invalid DPD key : \""},{"line_number":46,"context_line":"                \"\u0027%(key)s\u0027 not in %(supported_key)s\""},{"line_number":47,"context_line":"            ) % {\u0027key\u0027: key, \u0027supported_key\u0027: DPD_SUPPORTED_KEYS}"},{"line_number":48,"context_line":"            raise exceptions.CommandError(message)"},{"line_number":49,"context_line":"        if key \u003d\u003d \u0027action\u0027 and value not in DPD_SUPPORTED_ACTIONS:"},{"line_number":50,"context_line":"            message \u003d _("},{"line_number":51,"context_line":"                \"DPD Dictionary ValueError: \""},{"line_number":52,"context_line":"                \"Reason-Invalid DPD action : \""},{"line_number":53,"context_line":"                \"\u0027%(key_value)s\u0027 not in %(supported_action)s\""},{"line_number":54,"context_line":"            ) % {\u0027key_value\u0027: value, \u0027supported_action\u0027: DPD_SUPPORTED_ACTIONS}"},{"line_number":55,"context_line":"            raise exceptions.CommandError(message)"},{"line_number":56,"context_line":"        if key in (\u0027interval\u0027, \u0027timeout\u0027):"},{"line_number":57,"context_line":"            try:"},{"line_number":58,"context_line":"                if int(value) \u003c\u003d 0:"},{"line_number":59,"context_line":"                    raise ValueError()"},{"line_number":60,"context_line":"            except ValueError:"},{"line_number":61,"context_line":"                message \u003d _("},{"line_number":62,"context_line":"                    \"DPD Dictionary ValueError: \""},{"line_number":63,"context_line":"                    \"Reason-Invalid positive integer value: \""},{"line_number":64,"context_line":"                    \"\u0027%(key)s\u0027 \u003d %(value)s\""},{"line_number":65,"context_line":"                ) % {\u0027key\u0027: key, \u0027value\u0027: value}"},{"line_number":66,"context_line":"                raise exceptions.CommandError(message)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                dpd_dict[key] \u003d int(value)"},{"line_number":69,"context_line":"    return"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def validate_lifetime_dict(lifetime_dict):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5e03044f_7f978914","line":69,"range":{"start_line":39,"start_character":1,"end_line":69,"end_character":10},"in_reply_to":"6fa5ed32_ebdb6768","updated":"2026-06-26 16:14:08.000000000","message":"https://review.opendev.org/c/openstack/python-openstackclient/+/995106","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"05921c921d00b40144fe3e4146482006f6672e31","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                lifetime_dict[\u0027value\u0027] \u003d int(value)"},{"line_number":102,"context_line":"    return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def lifetime_help(policy):"},{"line_number":106,"context_line":"    lifetime \u003d ("},{"line_number":107,"context_line":"        _("},{"line_number":108,"context_line":"            \"%s lifetime attributes. \""},{"line_number":109,"context_line":"            \"\u0027units\u0027-seconds, default:seconds. \""},{"line_number":110,"context_line":"            \"\u0027value\u0027-non negative integer, default:3600.\""},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        % policy"},{"line_number":113,"context_line":"    )"},{"line_number":114,"context_line":"    return lifetime"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def dpd_help(policy):"},{"line_number":118,"context_line":"    dpd \u003d ("},{"line_number":119,"context_line":"        _("},{"line_number":120,"context_line":"            \" %s Dead Peer Detection attributes.\""},{"line_number":121,"context_line":"            \" \u0027action\u0027-hold,clear,disabled,restart,restart-by-peer.\""},{"line_number":122,"context_line":"            \" \u0027interval\u0027 and \u0027timeout\u0027 are non negative integers. \""},{"line_number":123,"context_line":"            \" \u0027interval\u0027 should be less than \u0027timeout\u0027 value. \""},{"line_number":124,"context_line":"            \" \u0027action\u0027, default:hold \u0027interval\u0027, default:30, \""},{"line_number":125,"context_line":"            \" \u0027timeout\u0027, default:120.\""},{"line_number":126,"context_line":"        )"},{"line_number":127,"context_line":"        % policy.capitalize()"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    return dpd"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"def str2dict(strdict, required_keys\u003dNone, optional_keys\u003dNone):"},{"line_number":133,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."}],"source_content_type":"text/x-python","patch_set":8,"id":"0d392725_b0c71d0d","line":130,"range":{"start_line":104,"start_character":1,"end_line":130,"end_character":1},"updated":"2026-06-26 13:35:04.000000000","message":"I\u0027d rather we flatten these into their callers. One for a follow-up","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec574437169b1a69be10289b719e87f689018852","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                lifetime_dict[\u0027value\u0027] \u003d int(value)"},{"line_number":102,"context_line":"    return"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def lifetime_help(policy):"},{"line_number":106,"context_line":"    lifetime \u003d ("},{"line_number":107,"context_line":"        _("},{"line_number":108,"context_line":"            \"%s lifetime attributes. \""},{"line_number":109,"context_line":"            \"\u0027units\u0027-seconds, default:seconds. \""},{"line_number":110,"context_line":"            \"\u0027value\u0027-non negative integer, default:3600.\""},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        % policy"},{"line_number":113,"context_line":"    )"},{"line_number":114,"context_line":"    return lifetime"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def dpd_help(policy):"},{"line_number":118,"context_line":"    dpd \u003d ("},{"line_number":119,"context_line":"        _("},{"line_number":120,"context_line":"            \" %s Dead Peer Detection attributes.\""},{"line_number":121,"context_line":"            \" \u0027action\u0027-hold,clear,disabled,restart,restart-by-peer.\""},{"line_number":122,"context_line":"            \" \u0027interval\u0027 and \u0027timeout\u0027 are non negative integers. \""},{"line_number":123,"context_line":"            \" \u0027interval\u0027 should be less than \u0027timeout\u0027 value. \""},{"line_number":124,"context_line":"            \" \u0027action\u0027, default:hold \u0027interval\u0027, default:30, \""},{"line_number":125,"context_line":"            \" \u0027timeout\u0027, default:120.\""},{"line_number":126,"context_line":"        )"},{"line_number":127,"context_line":"        % policy.capitalize()"},{"line_number":128,"context_line":"    )"},{"line_number":129,"context_line":"    return dpd"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"def str2dict(strdict, required_keys\u003dNone, optional_keys\u003dNone):"},{"line_number":133,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."}],"source_content_type":"text/x-python","patch_set":8,"id":"ca4b366e_1e97244f","line":130,"range":{"start_line":104,"start_character":1,"end_line":130,"end_character":1},"in_reply_to":"0d392725_b0c71d0d","updated":"2026-06-26 16:14:08.000000000","message":"https://review.opendev.org/c/openstack/python-openstackclient/+/995106","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"05921c921d00b40144fe3e4146482006f6672e31","unresolved":true,"context_lines":[{"line_number":129,"context_line":"    return dpd"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"def str2dict(strdict, required_keys\u003dNone, optional_keys\u003dNone):"},{"line_number":133,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    :param strdict: string in the form of key1\u003dvalue1,key2\u003dvalue2"},{"line_number":136,"context_line":"    :param required_keys: list of required keys. All keys in this list must be"},{"line_number":137,"context_line":"                       specified. Otherwise ArgumentTypeError will be raised."},{"line_number":138,"context_line":"                       If this parameter is unspecified, no required key check"},{"line_number":139,"context_line":"                       will be done."},{"line_number":140,"context_line":"    :param optional_keys: list of optional keys."},{"line_number":141,"context_line":"                       This parameter is used for valid key check."},{"line_number":142,"context_line":"                       When at least one of required_keys and optional_keys,"},{"line_number":143,"context_line":"                       a key must be a member of either of required_keys or"},{"line_number":144,"context_line":"                       optional_keys. Otherwise, ArgumentTypeError will be"},{"line_number":145,"context_line":"                       raised. When both required_keys and optional_keys are"},{"line_number":146,"context_line":"                       unspecified, no valid key check will be done."},{"line_number":147,"context_line":"    \"\"\""},{"line_number":148,"context_line":"    result \u003d {}"},{"line_number":149,"context_line":"    if strdict:"},{"line_number":150,"context_line":"        i \u003d 0"},{"line_number":151,"context_line":"        kvlist \u003d []"},{"line_number":152,"context_line":"        for kv in strdict.split(\u0027,\u0027):"},{"line_number":153,"context_line":"            if \u0027\u003d\u0027 in kv:"},{"line_number":154,"context_line":"                kvlist.append(kv)"},{"line_number":155,"context_line":"                i +\u003d 1"},{"line_number":156,"context_line":"            elif i \u003d\u003d 0:"},{"line_number":157,"context_line":"                msg \u003d _(\"missing value for key \u0027%s\u0027\")"},{"line_number":158,"context_line":"                raise argparse.ArgumentTypeError(msg % kv)"},{"line_number":159,"context_line":"            else:"},{"line_number":160,"context_line":"                kvlist[i - 1] \u003d f\"{kvlist[i - 1]},{kv}\""},{"line_number":161,"context_line":"        for kv in kvlist:"},{"line_number":162,"context_line":"            key, sep, value \u003d kv.partition(\u0027\u003d\u0027)"},{"line_number":163,"context_line":"            if not sep:"},{"line_number":164,"context_line":"                msg \u003d _(\"invalid key-value \u0027%s\u0027, expected format: key\u003dvalue\")"},{"line_number":165,"context_line":"                raise argparse.ArgumentTypeError(msg % kv)"},{"line_number":166,"context_line":"            result[key] \u003d value"},{"line_number":167,"context_line":"    valid_keys \u003d set(required_keys or []) | set(optional_keys or [])"},{"line_number":168,"context_line":"    if valid_keys:"},{"line_number":169,"context_line":"        invalid_keys \u003d [k for k in result if k not in valid_keys]"},{"line_number":170,"context_line":"        if invalid_keys:"},{"line_number":171,"context_line":"            msg \u003d _("},{"line_number":172,"context_line":"                \"Invalid key(s) \u0027%(invalid_keys)s\u0027 specified. \""},{"line_number":173,"context_line":"                \"Valid key(s): \u0027%(valid_keys)s\u0027.\""},{"line_number":174,"context_line":"            )"},{"line_number":175,"context_line":"            raise argparse.ArgumentTypeError("},{"line_number":176,"context_line":"                msg"},{"line_number":177,"context_line":"                % {"},{"line_number":178,"context_line":"                    \u0027invalid_keys\u0027: \u0027, \u0027.join(sorted(invalid_keys)),"},{"line_number":179,"context_line":"                    \u0027valid_keys\u0027: \u0027, \u0027.join(sorted(valid_keys)),"},{"line_number":180,"context_line":"                }"},{"line_number":181,"context_line":"            )"},{"line_number":182,"context_line":"    if required_keys:"},{"line_number":183,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":184,"context_line":"        if not_found_keys:"},{"line_number":185,"context_line":"            msg \u003d _(\"Required key(s) \u0027%s\u0027 not specified.\")"},{"line_number":186,"context_line":"            raise argparse.ArgumentTypeError(msg % \u0027, \u0027.join(not_found_keys))"},{"line_number":187,"context_line":"    return result"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"def str2dict_type(optional_keys\u003dNone, required_keys\u003dNone):"},{"line_number":191,"context_line":"    return functools.partial("},{"line_number":192,"context_line":"        str2dict, optional_keys\u003doptional_keys, required_keys\u003drequired_keys"},{"line_number":193,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":8,"id":"6294b52d_10da4e97","line":193,"range":{"start_line":132,"start_character":0,"end_line":193,"end_character":5},"updated":"2026-06-26 13:35:04.000000000","message":"There\u0027s already a `str2dict` utility in `openstackclient/network/utils.py` that could be expanded to cover this. More importantly, the `osc_lib.cli.parseractions.MultiKeyValueAction` action achieves the exact same thing as this and should be used instead.","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec574437169b1a69be10289b719e87f689018852","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    return dpd"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"def str2dict(strdict, required_keys\u003dNone, optional_keys\u003dNone):"},{"line_number":133,"context_line":"    \"\"\"Convert key1\u003dvalue1,key2\u003dvalue2,... string into dictionary."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    :param strdict: string in the form of key1\u003dvalue1,key2\u003dvalue2"},{"line_number":136,"context_line":"    :param required_keys: list of required keys. All keys in this list must be"},{"line_number":137,"context_line":"                       specified. Otherwise ArgumentTypeError will be raised."},{"line_number":138,"context_line":"                       If this parameter is unspecified, no required key check"},{"line_number":139,"context_line":"                       will be done."},{"line_number":140,"context_line":"    :param optional_keys: list of optional keys."},{"line_number":141,"context_line":"                       This parameter is used for valid key check."},{"line_number":142,"context_line":"                       When at least one of required_keys and optional_keys,"},{"line_number":143,"context_line":"                       a key must be a member of either of required_keys or"},{"line_number":144,"context_line":"                       optional_keys. Otherwise, ArgumentTypeError will be"},{"line_number":145,"context_line":"                       raised. When both required_keys and optional_keys are"},{"line_number":146,"context_line":"                       unspecified, no valid key check will be done."},{"line_number":147,"context_line":"    \"\"\""},{"line_number":148,"context_line":"    result \u003d {}"},{"line_number":149,"context_line":"    if strdict:"},{"line_number":150,"context_line":"        i \u003d 0"},{"line_number":151,"context_line":"        kvlist \u003d []"},{"line_number":152,"context_line":"        for kv in strdict.split(\u0027,\u0027):"},{"line_number":153,"context_line":"            if \u0027\u003d\u0027 in kv:"},{"line_number":154,"context_line":"                kvlist.append(kv)"},{"line_number":155,"context_line":"                i +\u003d 1"},{"line_number":156,"context_line":"            elif i \u003d\u003d 0:"},{"line_number":157,"context_line":"                msg \u003d _(\"missing value for key \u0027%s\u0027\")"},{"line_number":158,"context_line":"                raise argparse.ArgumentTypeError(msg % kv)"},{"line_number":159,"context_line":"            else:"},{"line_number":160,"context_line":"                kvlist[i - 1] \u003d f\"{kvlist[i - 1]},{kv}\""},{"line_number":161,"context_line":"        for kv in kvlist:"},{"line_number":162,"context_line":"            key, sep, value \u003d kv.partition(\u0027\u003d\u0027)"},{"line_number":163,"context_line":"            if not sep:"},{"line_number":164,"context_line":"                msg \u003d _(\"invalid key-value \u0027%s\u0027, expected format: key\u003dvalue\")"},{"line_number":165,"context_line":"                raise argparse.ArgumentTypeError(msg % kv)"},{"line_number":166,"context_line":"            result[key] \u003d value"},{"line_number":167,"context_line":"    valid_keys \u003d set(required_keys or []) | set(optional_keys or [])"},{"line_number":168,"context_line":"    if valid_keys:"},{"line_number":169,"context_line":"        invalid_keys \u003d [k for k in result if k not in valid_keys]"},{"line_number":170,"context_line":"        if invalid_keys:"},{"line_number":171,"context_line":"            msg \u003d _("},{"line_number":172,"context_line":"                \"Invalid key(s) \u0027%(invalid_keys)s\u0027 specified. \""},{"line_number":173,"context_line":"                \"Valid key(s): \u0027%(valid_keys)s\u0027.\""},{"line_number":174,"context_line":"            )"},{"line_number":175,"context_line":"            raise argparse.ArgumentTypeError("},{"line_number":176,"context_line":"                msg"},{"line_number":177,"context_line":"                % {"},{"line_number":178,"context_line":"                    \u0027invalid_keys\u0027: \u0027, \u0027.join(sorted(invalid_keys)),"},{"line_number":179,"context_line":"                    \u0027valid_keys\u0027: \u0027, \u0027.join(sorted(valid_keys)),"},{"line_number":180,"context_line":"                }"},{"line_number":181,"context_line":"            )"},{"line_number":182,"context_line":"    if required_keys:"},{"line_number":183,"context_line":"        not_found_keys \u003d [k for k in required_keys if k not in result]"},{"line_number":184,"context_line":"        if not_found_keys:"},{"line_number":185,"context_line":"            msg \u003d _(\"Required key(s) \u0027%s\u0027 not specified.\")"},{"line_number":186,"context_line":"            raise argparse.ArgumentTypeError(msg % \u0027, \u0027.join(not_found_keys))"},{"line_number":187,"context_line":"    return result"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"def str2dict_type(optional_keys\u003dNone, required_keys\u003dNone):"},{"line_number":191,"context_line":"    return functools.partial("},{"line_number":192,"context_line":"        str2dict, optional_keys\u003doptional_keys, required_keys\u003drequired_keys"},{"line_number":193,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ef59180_d18b5b53","line":193,"range":{"start_line":132,"start_character":0,"end_line":193,"end_character":5},"in_reply_to":"6294b52d_10da4e97","updated":"2026-06-26 16:14:08.000000000","message":"https://review.opendev.org/c/openstack/python-openstackclient/+/995106","commit_id":"502de4d25dcee4594a2c2d2c9991f142ddf24bbf"}],"openstackclient/network/v2/vpnaas/vpnservice.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    return parser"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":83,"context_line":"    attrs \u003d {}"},{"line_number":84,"context_line":"    if is_create:"},{"line_number":85,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":86,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":87,"context_line":"                client_manager.identity,"},{"line_number":88,"context_line":"                parsed_args.project,"},{"line_number":89,"context_line":"                parsed_args.project_domain,"},{"line_number":90,"context_line":"            ).id"},{"line_number":91,"context_line":"    if parsed_args.description:"},{"line_number":92,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":93,"context_line":"    if parsed_args.subnet:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6748c4ed_dedf5260","line":90,"range":{"start_line":81,"start_character":1,"end_line":90,"end_character":16},"updated":"2026-06-22 11:51:33.000000000","message":"Same comments","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    )"},{"line_number":79,"context_line":"    return parser"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def _get_common_attrs(client_manager, parsed_args, is_create\u003dTrue):"},{"line_number":83,"context_line":"    attrs \u003d {}"},{"line_number":84,"context_line":"    if is_create:"},{"line_number":85,"context_line":"        if \u0027project\u0027 in parsed_args and parsed_args.project is not None:"},{"line_number":86,"context_line":"            attrs[\u0027project_id\u0027] \u003d identity_common.find_project("},{"line_number":87,"context_line":"                client_manager.identity,"},{"line_number":88,"context_line":"                parsed_args.project,"},{"line_number":89,"context_line":"                parsed_args.project_domain,"},{"line_number":90,"context_line":"            ).id"},{"line_number":91,"context_line":"    if parsed_args.description:"},{"line_number":92,"context_line":"        attrs[\u0027description\u0027] \u003d str(parsed_args.description)"},{"line_number":93,"context_line":"    if parsed_args.subnet:"}],"source_content_type":"text/x-python","patch_set":6,"id":"2df7b2ca_3b2ad588","line":90,"range":{"start_line":81,"start_character":1,"end_line":90,"end_character":16},"in_reply_to":"6748c4ed_dedf5260","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"41539e0179b320a04403d98e8b6bf35e125eed34","unresolved":true,"context_lines":[{"line_number":160,"context_line":"        client \u003d self.app.client_manager.network"},{"line_number":161,"context_line":"        result \u003d 0"},{"line_number":162,"context_line":"        for vpn in parsed_args.vpnservice:"},{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                vpn_id \u003d client.find_vpn_service(vpn, ignore_missing\u003dFalse)["},{"line_number":165,"context_line":"                    \u0027id\u0027"},{"line_number":166,"context_line":"                ]"},{"line_number":167,"context_line":"                client.delete_vpn_service(vpn_id)"},{"line_number":168,"context_line":"            except Exception as e:"},{"line_number":169,"context_line":"                result +\u003d 1"},{"line_number":170,"context_line":"                print("}],"source_content_type":"text/x-python","patch_set":6,"id":"5f4ede7a_1d0cfd8c","line":167,"range":{"start_line":163,"start_character":16,"end_line":167,"end_character":49},"updated":"2026-06-22 11:51:33.000000000","message":"```suggestion\n            try:\n                vpn_id \u003d client.find_vpn_service(vpn, ignore_missing\u003dFalse).id\n                client.delete_vpn_service(vpn_id)\n```","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"7403fed83368b89a6cd0735b215188ecff0ba6f9","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        client \u003d self.app.client_manager.network"},{"line_number":161,"context_line":"        result \u003d 0"},{"line_number":162,"context_line":"        for vpn in parsed_args.vpnservice:"},{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                vpn_id \u003d client.find_vpn_service(vpn, ignore_missing\u003dFalse)["},{"line_number":165,"context_line":"                    \u0027id\u0027"},{"line_number":166,"context_line":"                ]"},{"line_number":167,"context_line":"                client.delete_vpn_service(vpn_id)"},{"line_number":168,"context_line":"            except Exception as e:"},{"line_number":169,"context_line":"                result +\u003d 1"},{"line_number":170,"context_line":"                print("}],"source_content_type":"text/x-python","patch_set":6,"id":"a4cbd6ba_823f8e59","line":167,"range":{"start_line":163,"start_character":16,"end_line":167,"end_character":49},"in_reply_to":"5f4ede7a_1d0cfd8c","updated":"2026-06-23 14:08:44.000000000","message":"Done","commit_id":"6a4ec007987e812a03add4cf4c373febd18b4f29"}],"openstackclient/tests/unit/network/v2/vpnaas/fakes.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as test_fakes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestNeutronVpnaasOSCV2(test_fakes.TestNetworkV2):"},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        super().setUp()"},{"line_number":34,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class FakeVPNaaS:"},{"line_number":38,"context_line":"    def create(self, attrs\u003d{}):"}],"source_content_type":"text/x-python","patch_set":3,"id":"8f452b73_ac8795d4","line":35,"range":{"start_line":30,"start_character":1,"end_line":35,"end_character":1},"updated":"2026-06-04 10:58:49.000000000","message":"You don\u0027t need `self.namespace`, so this class can go away","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from openstackclient.tests.unit.network.v2 import fakes as test_fakes"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class TestNeutronVpnaasOSCV2(test_fakes.TestNetworkV2):"},{"line_number":32,"context_line":"    def setUp(self):"},{"line_number":33,"context_line":"        super().setUp()"},{"line_number":34,"context_line":"        self.namespace \u003d argparse.Namespace()"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class FakeVPNaaS:"},{"line_number":38,"context_line":"    def create(self, attrs\u003d{}):"}],"source_content_type":"text/x-python","patch_set":3,"id":"e318b442_b2fd835c","line":35,"range":{"start_line":30,"start_character":1,"end_line":35,"end_character":1},"in_reply_to":"8f452b73_ac8795d4","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"}],"openstackclient/tests/unit/network/v2/vpnaas/test_endpoint_group.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":120,"context_line":"            _endpoint_group"},{"line_number":121,"context_line":"        )"},{"line_number":122,"context_line":"        self.mocked \u003d self.network_client.create_vpn_endpoint_group"},{"line_number":123,"context_line":"        self.cmd \u003d endpoint_group.CreateEndpointGroup(self.app, self.namespace)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _update_expect_response(self, request, response):"},{"line_number":126,"context_line":"        \"\"\"Set expected request and response"}],"source_content_type":"text/x-python","patch_set":3,"id":"555e3f74_67ac2622","line":123,"updated":"2026-06-04 10:58:49.000000000","message":"```suggestion\n        self.cmd \u003d endpoint_group.CreateEndpointGroup(self.app, None)\n```\n\nSee I135c24d0f6450d5af4e1860218bf3a65c09e36cc for more info.","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            _endpoint_group"},{"line_number":121,"context_line":"        )"},{"line_number":122,"context_line":"        self.mocked \u003d self.network_client.create_vpn_endpoint_group"},{"line_number":123,"context_line":"        self.cmd \u003d endpoint_group.CreateEndpointGroup(self.app, self.namespace)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def _update_expect_response(self, request, response):"},{"line_number":126,"context_line":"        \"\"\"Set expected request and response"}],"source_content_type":"text/x-python","patch_set":3,"id":"1eed7264_4c438cfa","line":123,"in_reply_to":"555e3f74_67ac2622","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":247,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":248,"context_line":"        resource_name \u003d self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":249,"context_line":"        msg \u003d f\"1 of 2 {resource_name}(s) failed to delete.\""},{"line_number":250,"context_line":"        with testtools.ExpectedException(exceptions.CommandError) as e:"},{"line_number":251,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":252,"context_line":"            self.assertEqual(msg, str(e))"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3dd36c94_7da5cd65","line":250,"updated":"2026-06-04 10:58:49.000000000","message":"Can you use self.assertRaises here instead?","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":248,"context_line":"        resource_name \u003d self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":249,"context_line":"        msg \u003d f\"1 of 2 {resource_name}(s) failed to delete.\""},{"line_number":250,"context_line":"        with testtools.ExpectedException(exceptions.CommandError) as e:"},{"line_number":251,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":252,"context_line":"            self.assertEqual(msg, str(e))"},{"line_number":253,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e4428f47_06a81f33","line":250,"in_reply_to":"3dd36c94_7da5cd65","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"}],"openstackclient/tests/unit/network/v2/vpnaas/test_ikepolicy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":279,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":280,"context_line":"        resource_name \u003d self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":281,"context_line":"        msg \u003d f\"1 of 2 {resource_name}(s) failed to delete.\""},{"line_number":282,"context_line":"        with testtools.ExpectedException(exceptions.CommandError) as e:"},{"line_number":283,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":284,"context_line":"            self.assertEqual(msg, str(e))"},{"line_number":285,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f6b7da0a_e48f621e","line":282,"updated":"2026-06-04 10:58:49.000000000","message":"Can you use `self.assertRaises` here instead?","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":280,"context_line":"        resource_name \u003d self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":281,"context_line":"        msg \u003d f\"1 of 2 {resource_name}(s) failed to delete.\""},{"line_number":282,"context_line":"        with testtools.ExpectedException(exceptions.CommandError) as e:"},{"line_number":283,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":284,"context_line":"            self.assertEqual(msg, str(e))"},{"line_number":285,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c1d8d84a_04a4ca06","line":282,"in_reply_to":"f6b7da0a_e48f621e","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"}],"openstackclient/tests/unit/network/v2/vpnaas/test_ipsec_site_connection.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"c8c217afc2d2c57f2bd917a484b90e063e19b20a","unresolved":true,"context_lines":[{"line_number":372,"context_line":"        ]"},{"line_number":373,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":374,"context_line":"        self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":375,"context_line":"        with testtools.ExpectedException(exceptions.CommandError):"},{"line_number":376,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"00ea6e00_22fd0d93","line":375,"updated":"2026-06-04 10:58:49.000000000","message":"Can you use `self.assertRaises` here instead?","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":372,"context_line":"        ]"},{"line_number":373,"context_line":"        parsed_args \u003d self.check_parser(self.cmd, arglist, verifylist)"},{"line_number":374,"context_line":"        self.res.replace(\u0027_\u0027, \u0027 \u0027)"},{"line_number":375,"context_line":"        with testtools.ExpectedException(exceptions.CommandError):"},{"line_number":376,"context_line":"            self.cmd.take_action(parsed_args)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a4a5ed08_9b84657a","line":375,"in_reply_to":"00ea6e00_22fd0d93","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"}],"pyproject.toml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"78079f58ed5d09c01b5292055ed21308e4965786","unresolved":true,"context_lines":[{"line_number":585,"context_line":"firewall_group_rule_show \u003d \"openstackclient.network.v2.fwaas.rule:ShowFirewallRule\""},{"line_number":586,"context_line":"firewall_group_rule_unset \u003d \"openstackclient.network.v2.fwaas.rule:UnsetFirewallRule\""},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"[project.entry-points.\"openstack.network.v2.vpnaas\"]"},{"line_number":589,"context_line":"vpn_endpoint_group_create \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:CreateEndpointGroup\""},{"line_number":590,"context_line":"vpn_endpoint_group_delete \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:DeleteEndpointGroup\""},{"line_number":591,"context_line":"vpn_endpoint_group_list \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:ListEndpointGroup\""}],"source_content_type":"text/x-toml","patch_set":3,"id":"c76fd212_5a8585a7","line":588,"updated":"2026-06-04 10:41:33.000000000","message":"nit: can you place this after `openstack.network.v2.taas` (alphabetical ordering)","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"00649f4dcf22325ef71d08418c48af1762624b01","unresolved":false,"context_lines":[{"line_number":585,"context_line":"firewall_group_rule_show \u003d \"openstackclient.network.v2.fwaas.rule:ShowFirewallRule\""},{"line_number":586,"context_line":"firewall_group_rule_unset \u003d \"openstackclient.network.v2.fwaas.rule:UnsetFirewallRule\""},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"[project.entry-points.\"openstack.network.v2.vpnaas\"]"},{"line_number":589,"context_line":"vpn_endpoint_group_create \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:CreateEndpointGroup\""},{"line_number":590,"context_line":"vpn_endpoint_group_delete \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:DeleteEndpointGroup\""},{"line_number":591,"context_line":"vpn_endpoint_group_list \u003d \"openstackclient.network.v2.vpnaas.endpoint_group:ListEndpointGroup\""}],"source_content_type":"text/x-toml","patch_set":3,"id":"47a3e37a_37aeeb07","line":588,"in_reply_to":"c76fd212_5a8585a7","updated":"2026-06-09 12:22:28.000000000","message":"Done","commit_id":"3dd8f1061516339141fdabef9352672d4b4b3fb5"}]}
