)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"f5b95b0d0bd197885c0dc93c809d9c474bac5011","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"85e9643c_82f4c7af","updated":"2026-08-18 08:25:58.000000000","message":"I am still working on improving this patch","commit_id":"8e681cdcd9d5aef4adf20da96680e8d6167fa370"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"609d3f4a9b3641290a665954841d8f8664b1ed73","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ed3bd81a_8c0619d9","updated":"2026-08-17 12:12:41.000000000","message":"I am working on improving this. I am planning to use the network context for the network topology. Right now we create the network topology in every iteration which I feel is unnecessary when we want to benchmark FwaaS only.","commit_id":"8e681cdcd9d5aef4adf20da96680e8d6167fa370"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"d66aab26175cf39cbeeee618964e6124ab06e601","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b966be26_110ea1be","updated":"2026-08-21 06:10:34.000000000","message":"recheck","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"a9c6b21cc15951fc61210ef6faaca0d46693c59a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f23bb8d4_ecddc860","updated":"2026-08-30 05:27:45.000000000","message":"recheck","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"e2318479_23869662","updated":"2026-10-15 03:42:49.000000000","message":"Work is still in progress for this PR","commit_id":"5b2cef7a293d8dad9b7750a0f0670d2518770032"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"6f80ebdbd85770ea259e163eb4db14b0bc6881aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"4f751e8f_08eda27a","updated":"2026-10-21 18:37:21.000000000","message":"thank you","commit_id":"16d9e61cd4b24868286906bc2116b117aa86c4e5"}],"rally-jobs/fwaas.yaml":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        subnets_per_network: 1"},{"line_number":155,"context_line":"        router:"},{"line_number":156,"context_line":"          external: true"},{"line_number":157,"context_line":"      roles:"},{"line_number":158,"context_line":"        - admin"},{"line_number":159,"context_line":"      quotas:"},{"line_number":160,"context_line":"        neutron:"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"e9b8d776_61a82c78","line":157,"updated":"2026-10-10 11:05:19.000000000","message":"If the scenario is expected ot be called by admin, usually we just mark it with `@validation.add(\"required_platform\", platform\u003d\"openstack\", admin\u003dTrue)` and use clients like `self.admin_clients`. \n\nWhy do we need an admin role here? Is it expected to be needed for 99% of consumers of this scenario?","commit_id":"0eae3e1a3292209c915967cfd9964e9b03dba61f"}],"rally_openstack/common/validators.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":true,"context_lines":[{"line_number":672,"context_line":"                f\"expects \u0027{self.context_config}\u0027\")"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"@validation.configure(name\u003d\"fwaas_network_sizing\", platform\u003d\"openstack\")"},{"line_number":676,"context_line":"class FWaaSNetworkSizingValidator(validation.Validator):"},{"line_number":677,"context_line":"    \"\"\"Validate that networks_per_tenant is sufficient for concurrency."},{"line_number":678,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"f2c0ca5f_d5f00d00","line":675,"updated":"2026-10-10 11:05:19.000000000","message":"The only thing that makes this validator fwaas specific is name and error message. Can you rename this to something `project_count`(or something like that) with one configurable option - like `multiplier: int \u003d 1` to require X projects per iteration","commit_id":"0eae3e1a3292209c915967cfd9964e9b03dba61f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"6f80ebdbd85770ea259e163eb4db14b0bc6881aa","unresolved":false,"context_lines":[{"line_number":672,"context_line":"                f\"expects \u0027{self.context_config}\u0027\")"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"@validation.configure(name\u003d\"fwaas_network_sizing\", platform\u003d\"openstack\")"},{"line_number":676,"context_line":"class FWaaSNetworkSizingValidator(validation.Validator):"},{"line_number":677,"context_line":"    \"\"\"Validate that networks_per_tenant is sufficient for concurrency."},{"line_number":678,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"4f0390df_350c55a9","line":675,"in_reply_to":"f2c0ca5f_d5f00d00","updated":"2026-10-21 18:37:21.000000000","message":"Done","commit_id":"0eae3e1a3292209c915967cfd9964e9b03dba61f"}],"rally_openstack/task/scenarios/neutron/fwaas.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":308,"context_line":"        Requires ``network@openstack`` context with ``router`` enabled"},{"line_number":309,"context_line":"        (for example ``router: {external: true}``)."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        Each concurrent iteration needs its own router interface port."},{"line_number":312,"context_line":"        With one tenant, set ``networks_per_tenant`` to at least the runner"},{"line_number":313,"context_line":"        ``concurrency`` (e.g. concurrency 20 needs"},{"line_number":314,"context_line":"        ``networks_per_tenant: 20``). With multiple tenants, each tenant"},{"line_number":315,"context_line":"        needs at least ``ceil(concurrency / tenants)`` networks."},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        Measure associate and disassociate firewall group performance."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d6f52b51_ff5c02c1","line":315,"range":{"start_line":311,"start_character":0,"end_line":315,"end_character":64},"updated":"2026-09-10 08:24:35.000000000","message":"It would be nice to add a new validator for that. Take https://github.com/openstack/rally/blob/5.1.1/rally/plugins/common/validators.py#L561-L590 as an example.  `config.get(\"contexts\", {})` should give you access to contexts configuration and `config.get(\"runner\", {})` should give you info about concurrency","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        Requires ``network@openstack`` context with ``router`` enabled"},{"line_number":309,"context_line":"        (for example ``router: {external: true}``)."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        Each concurrent iteration needs its own router interface port."},{"line_number":312,"context_line":"        With one tenant, set ``networks_per_tenant`` to at least the runner"},{"line_number":313,"context_line":"        ``concurrency`` (e.g. concurrency 20 needs"},{"line_number":314,"context_line":"        ``networks_per_tenant: 20``). With multiple tenants, each tenant"},{"line_number":315,"context_line":"        needs at least ``ceil(concurrency / tenants)`` networks."},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        Measure associate and disassociate firewall group performance."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"e1a09bec_57ad5ee7","line":315,"range":{"start_line":311,"start_character":0,"end_line":315,"end_character":64},"in_reply_to":"d6f52b51_ff5c02c1","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":308,"context_line":"        Requires ``network@openstack`` context with ``router`` enabled"},{"line_number":309,"context_line":"        (for example ``router: {external: true}``)."},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"        Each concurrent iteration needs its own router interface port."},{"line_number":312,"context_line":"        With one tenant, set ``networks_per_tenant`` to at least the runner"},{"line_number":313,"context_line":"        ``concurrency`` (e.g. concurrency 20 needs"},{"line_number":314,"context_line":"        ``networks_per_tenant: 20``). With multiple tenants, each tenant"},{"line_number":315,"context_line":"        needs at least ``ceil(concurrency / tenants)`` networks."},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        Measure associate and disassociate firewall group performance."},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"b752dc34_aaece722","line":315,"range":{"start_line":311,"start_character":0,"end_line":315,"end_character":64},"in_reply_to":"d6f52b51_ff5c02c1","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":328,"context_line":"        firewall_group_create_args \u003d firewall_group_create_args or {}"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        networks \u003d self.context[\"tenant\"][\"networks\"]"},{"line_number":331,"context_line":"        if not networks:"},{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"de4984a5_e2fc0ef0","line":334,"range":{"start_line":331,"start_character":0,"end_line":334,"end_character":65},"updated":"2026-09-10 08:24:35.000000000","message":"check is redundant. It duplicates `required_contexts` validator which runs before scenario is executed (quicker validation)","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        firewall_group_create_args \u003d firewall_group_create_args or {}"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        networks \u003d self.context[\"tenant\"][\"networks\"]"},{"line_number":331,"context_line":"        if not networks:"},{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"eaace518_4c15be3e","line":334,"range":{"start_line":331,"start_character":0,"end_line":334,"end_character":65},"in_reply_to":"de4984a5_e2fc0ef0","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        firewall_group_create_args \u003d firewall_group_create_args or {}"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        networks \u003d self.context[\"tenant\"][\"networks\"]"},{"line_number":331,"context_line":"        if not networks:"},{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"64c9f07c_882f73af","line":334,"range":{"start_line":331,"start_character":0,"end_line":334,"end_character":65},"in_reply_to":"de4984a5_e2fc0ef0","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"},{"line_number":338,"context_line":"        if not router_id:"},{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"67e3f2a3_64c7d55f","line":341,"range":{"start_line":335,"start_character":0,"end_line":341,"end_character":57},"updated":"2026-09-10 08:24:35.000000000","message":"This can be validated by existing validator (with some adjustment).\n\n```\n@validation.add(\n    \"required_context_config\",\n    context_name\u003d\"networks\",\n    context_config\u003d{\"router\": {\"external\": True}},\n    exact\u003dFalse\n)\n```\nThe current revision of `required_context_config`(https://github.com/openstack/rally-openstack/blob/4.1.0/rally_openstack/common/validators.py#L644-L648) validator does not support `exact: bool` option, so it always requires exact match of the values of `context_config` dict (instead of iterating deeper in case of dict values)","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"},{"line_number":338,"context_line":"        if not router_id:"},{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3748407f_600f7e7b","line":341,"range":{"start_line":335,"start_character":0,"end_line":341,"end_character":57},"in_reply_to":"67e3f2a3_64c7d55f","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            raise RuntimeError("},{"line_number":333,"context_line":"                \"No networks available in context. \""},{"line_number":334,"context_line":"                \"Ensure network context is properly configured.\")"},{"line_number":335,"context_line":"        idx \u003d self.context[\"iteration\"] % len(networks)"},{"line_number":336,"context_line":"        network \u003d networks[idx]"},{"line_number":337,"context_line":"        router_id \u003d network.get(\"router_id\")"},{"line_number":338,"context_line":"        if not router_id:"},{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7ef1e06e_24719a0f","line":341,"range":{"start_line":335,"start_character":0,"end_line":341,"end_character":57},"in_reply_to":"67e3f2a3_64c7d55f","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        firewall_group \u003d None"},{"line_number":346,"context_line":"        associated \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"aa44ed34_72f2f4e7","line":343,"range":{"start_line":342,"start_character":0,"end_line":343,"end_character":37},"updated":"2026-09-10 08:24:35.000000000","message":"this seems like something that should happen in networks context, so each iteration validate only fwaas stuff and do not waste time on discovery thing.\nPlease extend https://github.com/openstack/rally-openstack/blob/4.1.0/rally_openstack/task/contexts/network/networks.py#L142 with router_port_id or something.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        firewall_group \u003d None"},{"line_number":346,"context_line":"        associated \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"8d969520_f338cc07","line":343,"range":{"start_line":342,"start_character":0,"end_line":343,"end_character":37},"in_reply_to":"aa44ed34_72f2f4e7","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            raise RuntimeError("},{"line_number":340,"context_line":"                \"Network has no router. Ensure context has \""},{"line_number":341,"context_line":"                \"\u0027router: {external: true}\u0027 configured.\")"},{"line_number":342,"context_line":"        port \u003d self._get_router_interface_port_by_ids("},{"line_number":343,"context_line":"            router_id, network[\"id\"])"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        firewall_group \u003d None"},{"line_number":346,"context_line":"        associated \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"645017af_edf52fc9","line":343,"range":{"start_line":342,"start_character":0,"end_line":343,"end_character":37},"in_reply_to":"aa44ed34_72f2f4e7","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":366,"context_line":"            associated \u003d True"},{"line_number":367,"context_line":"            firewall_group \u003d self._disassociate_firewall_group_port("},{"line_number":368,"context_line":"                firewall_group)"},{"line_number":369,"context_line":"        finally:"},{"line_number":370,"context_line":"            if firewall_group and associated:"},{"line_number":371,"context_line":"                if firewall_group[\"firewall_group\"].get(\"ports\"):"},{"line_number":372,"context_line":"                    self._disassociate_firewall_group_port(firewall_group)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"@validation.add(\"required_contexts\", contexts\u003d[\"network\"])"}],"source_content_type":"text/x-python","patch_set":5,"id":"a17fb21d_558f39ff","line":372,"range":{"start_line":369,"start_character":0,"end_line":372,"end_character":74},"updated":"2026-09-10 08:24:35.000000000","message":"so basically it is retry for L367.\n1) if it is needed only for L367, why do we need `associated` variable and  `try` starting so early?\n2) why do we need to retry and why only once? if we still need it, why not just add try..except block for L367?","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":366,"context_line":"            associated \u003d True"},{"line_number":367,"context_line":"            firewall_group \u003d self._disassociate_firewall_group_port("},{"line_number":368,"context_line":"                firewall_group)"},{"line_number":369,"context_line":"        finally:"},{"line_number":370,"context_line":"            if firewall_group and associated:"},{"line_number":371,"context_line":"                if firewall_group[\"firewall_group\"].get(\"ports\"):"},{"line_number":372,"context_line":"                    self._disassociate_firewall_group_port(firewall_group)"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"@validation.add(\"required_contexts\", contexts\u003d[\"network\"])"}],"source_content_type":"text/x-python","patch_set":5,"id":"f1abef84_17a7e696","line":372,"range":{"start_line":369,"start_character":0,"end_line":372,"end_character":74},"in_reply_to":"a17fb21d_558f39ff","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":381,"context_line":"    context\u003d{\"cleanup@openstack\": [\"neutron\"]},"},{"line_number":382,"context_line":"    name\u003d\"NeutronFWaaS.update_policy_on_active_firewall_group\","},{"line_number":383,"context_line":"    platform\u003d\"openstack\")"},{"line_number":384,"context_line":"class UpdatePolicyOnActiveFirewallGroup(utils.NeutronScenario):"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def run(self, firewall_rule_create_args\u003dNone,"},{"line_number":387,"context_line":"            firewall_policy_create_args\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9e2da647_072e1d9a","line":384,"updated":"2026-09-10 08:24:35.000000000","message":"same comments for this scenario","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":381,"context_line":"    context\u003d{\"cleanup@openstack\": [\"neutron\"]},"},{"line_number":382,"context_line":"    name\u003d\"NeutronFWaaS.update_policy_on_active_firewall_group\","},{"line_number":383,"context_line":"    platform\u003d\"openstack\")"},{"line_number":384,"context_line":"class UpdatePolicyOnActiveFirewallGroup(utils.NeutronScenario):"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    def run(self, firewall_rule_create_args\u003dNone,"},{"line_number":387,"context_line":"            firewall_policy_create_args\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9af9e58c_94d7444a","line":384,"in_reply_to":"9e2da647_072e1d9a","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":true,"context_lines":[{"line_number":348,"context_line":"        try:"},{"line_number":349,"context_line":"            firewall_group \u003d self._associate_firewall_group_port("},{"line_number":350,"context_line":"                firewall_group, port)"},{"line_number":351,"context_line":"            firewall_group \u003d self._disassociate_firewall_group_port("},{"line_number":352,"context_line":"                firewall_group)"},{"line_number":353,"context_line":"        finally:"},{"line_number":354,"context_line":"            if firewall_group[\"firewall_group\"].get(\"ports\"):"},{"line_number":355,"context_line":"                self._disassociate_firewall_group_port(firewall_group)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"@validation.add(\"fwaas_network_sizing\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"c152260e_60163c8c","line":355,"range":{"start_line":351,"start_character":1,"end_line":355,"end_character":70},"updated":"2026-10-10 11:05:19.000000000","message":"why `NeutronFWaaS.update_policy_on_active_firewall_group` does not have any retry logic for _disassociate_firewall_group_port and this one has? Do we expect `_disassociate_firewall_group_port` to be \"flacky\", so we need to retry disassociation ?","commit_id":"0eae3e1a3292209c915967cfd9964e9b03dba61f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":true,"context_lines":[{"line_number":413,"context_line":"                \"firewall_policy\"][\"id\"],"},{"line_number":414,"context_line":"            **firewall_group_create_args)"},{"line_number":415,"context_line":""},{"line_number":416,"context_line":"        try:"},{"line_number":417,"context_line":"            firewall_group \u003d self._associate_firewall_group_port("},{"line_number":418,"context_line":"                firewall_group, port)"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"            updated_rule \u003d self._create_firewall_rule("},{"line_number":421,"context_line":"                **firewall_rule_create_args)"},{"line_number":422,"context_line":"            updated_policy \u003d self._create_firewall_policy("},{"line_number":423,"context_line":"                **firewall_policy_create_args)"},{"line_number":424,"context_line":"            self._insert_firewall_rule_in_policy("},{"line_number":425,"context_line":"                updated_policy, updated_rule)"},{"line_number":426,"context_line":"            self._update_firewall_group("},{"line_number":427,"context_line":"                firewall_group,"},{"line_number":428,"context_line":"                ingress_firewall_policy_id\u003dupdated_policy["},{"line_number":429,"context_line":"                    \"firewall_policy\"][\"id\"])"},{"line_number":430,"context_line":"        finally:"},{"line_number":431,"context_line":"            if firewall_group[\"firewall_group\"].get(\"ports\"):"},{"line_number":432,"context_line":"                self._disassociate_firewall_group_port(firewall_group)"}],"source_content_type":"text/x-python","patch_set":7,"id":"0abef9cc_f76df40c","line":432,"range":{"start_line":416,"start_character":0,"end_line":432,"end_character":70},"updated":"2026-10-10 11:05:19.000000000","message":"If I understand the logic correctly, the ports are assigned only on successful execution of `_associate_firewall_group_port` call, meaning that a check for ports are redundant if we passed that line.\n```suggestion\n        firewall_group \u003d self._associate_firewall_group_port(\n            firewall_group, port)\n        try:\n            updated_rule \u003d self._create_firewall_rule(\n                **firewall_rule_create_args)\n            updated_policy \u003d self._create_firewall_policy(\n                **firewall_policy_create_args)\n            self._insert_firewall_rule_in_policy(\n                updated_policy, updated_rule)\n            self._update_firewall_group(\n                firewall_group,\n                ingress_firewall_policy_id\u003dupdated_policy[\n                    \"firewall_policy\"][\"id\"])\n        finally:\n            self._disassociate_firewall_group_port(firewall_group)\n```","commit_id":"0eae3e1a3292209c915967cfd9964e9b03dba61f"}],"rally_openstack/task/scenarios/neutron/utils.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":1067,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    @atomic.action_timer(\"neutron.get_router_interface_port\")"},{"line_number":1070,"context_line":"    def _get_router_interface_port(self, router, network):"},{"line_number":1071,"context_line":"        \"\"\"Return router interface port on the given network."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param router: dict, neutron router"}],"source_content_type":"text/x-python","patch_set":5,"id":"88955ecd_ee4a5c59","line":1070,"updated":"2026-09-10 08:24:35.000000000","message":"why do we need both `_get_router_interface_port_by_ids` and `_get_router_interface_port`","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    @atomic.action_timer(\"neutron.get_router_interface_port\")"},{"line_number":1070,"context_line":"    def _get_router_interface_port(self, router, network):"},{"line_number":1071,"context_line":"        \"\"\"Return router interface port on the given network."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param router: dict, neutron router"}],"source_content_type":"text/x-python","patch_set":5,"id":"2da083f3_685fa305","line":1070,"in_reply_to":"88955ecd_ee4a5c59","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1068,"context_line":""},{"line_number":1069,"context_line":"    @atomic.action_timer(\"neutron.get_router_interface_port\")"},{"line_number":1070,"context_line":"    def _get_router_interface_port(self, router, network):"},{"line_number":1071,"context_line":"        \"\"\"Return router interface port on the given network."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param router: dict, neutron router"}],"source_content_type":"text/x-python","patch_set":5,"id":"6f19f0ca_0917b0b6","line":1070,"in_reply_to":"88955ecd_ee4a5c59","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2e2bd042353e878d67cc6f4a7a986a001ed2d75f","unresolved":true,"context_lines":[{"line_number":1102,"context_line":"        :returns: dict, neutron port wrapped as {\"port\": ...}"},{"line_number":1103,"context_line":"        :raises RuntimeError: if port not found"},{"line_number":1104,"context_line":"        \"\"\""},{"line_number":1105,"context_line":"        ports \u003d self._list_ports_by_device_id(router_id)"},{"line_number":1106,"context_line":"        router_ports \u003d ["},{"line_number":1107,"context_line":"            port for port in ports"},{"line_number":1108,"context_line":"            if port.get(\"network_id\") \u003d\u003d network_id"},{"line_number":1109,"context_line":"        ]"},{"line_number":1110,"context_line":"        for port in router_ports:"},{"line_number":1111,"context_line":"            if port.get(\"device_owner\") \u003d\u003d \"network:router_interface\":"},{"line_number":1112,"context_line":"                return {\"port\": port}"},{"line_number":1113,"context_line":"        if len(router_ports) \u003d\u003d 1:"},{"line_number":1114,"context_line":"            return {\"port\": router_ports[0]}"},{"line_number":1115,"context_line":"        raise RuntimeError("}],"source_content_type":"text/x-python","patch_set":5,"id":"5f245b48_01698980","line":1112,"range":{"start_line":1105,"start_character":0,"end_line":1112,"end_character":37},"updated":"2026-09-10 08:24:35.000000000","message":"Why not doing all the filtering on server side at once? `self.clients(\"neutron\").list_ports(device_id\u003drouter_id, network_id\u003dnetwork_id, device_owner\u003d\"network:router_interface\")`","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"443cf899d62c95814e6f17d14acb684b8d0222e9","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"        :returns: dict, neutron port wrapped as {\"port\": ...}"},{"line_number":1103,"context_line":"        :raises RuntimeError: if port not found"},{"line_number":1104,"context_line":"        \"\"\""},{"line_number":1105,"context_line":"        ports \u003d self._list_ports_by_device_id(router_id)"},{"line_number":1106,"context_line":"        router_ports \u003d ["},{"line_number":1107,"context_line":"            port for port in ports"},{"line_number":1108,"context_line":"            if port.get(\"network_id\") \u003d\u003d network_id"},{"line_number":1109,"context_line":"        ]"},{"line_number":1110,"context_line":"        for port in router_ports:"},{"line_number":1111,"context_line":"            if port.get(\"device_owner\") \u003d\u003d \"network:router_interface\":"},{"line_number":1112,"context_line":"                return {\"port\": port}"},{"line_number":1113,"context_line":"        if len(router_ports) \u003d\u003d 1:"},{"line_number":1114,"context_line":"            return {\"port\": router_ports[0]}"},{"line_number":1115,"context_line":"        raise RuntimeError("}],"source_content_type":"text/x-python","patch_set":5,"id":"a2743d67_3517b1db","line":1112,"range":{"start_line":1105,"start_character":0,"end_line":1112,"end_character":37},"in_reply_to":"5f245b48_01698980","updated":"2026-10-15 03:42:49.000000000","message":"Done","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4a24b3848e7489ad47eeb5ff7c5190d9ecbe51c0","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"        :returns: dict, neutron port wrapped as {\"port\": ...}"},{"line_number":1103,"context_line":"        :raises RuntimeError: if port not found"},{"line_number":1104,"context_line":"        \"\"\""},{"line_number":1105,"context_line":"        ports \u003d self._list_ports_by_device_id(router_id)"},{"line_number":1106,"context_line":"        router_ports \u003d ["},{"line_number":1107,"context_line":"            port for port in ports"},{"line_number":1108,"context_line":"            if port.get(\"network_id\") \u003d\u003d network_id"},{"line_number":1109,"context_line":"        ]"},{"line_number":1110,"context_line":"        for port in router_ports:"},{"line_number":1111,"context_line":"            if port.get(\"device_owner\") \u003d\u003d \"network:router_interface\":"},{"line_number":1112,"context_line":"                return {\"port\": port}"},{"line_number":1113,"context_line":"        if len(router_ports) \u003d\u003d 1:"},{"line_number":1114,"context_line":"            return {\"port\": router_ports[0]}"},{"line_number":1115,"context_line":"        raise RuntimeError("}],"source_content_type":"text/x-python","patch_set":5,"id":"82c11d99_4513d4cf","line":1112,"range":{"start_line":1105,"start_character":0,"end_line":1112,"end_character":37},"in_reply_to":"5f245b48_01698980","updated":"2026-10-10 11:05:19.000000000","message":"Marked as resolved.","commit_id":"c10b323bbd114bcc52e9648d83d5f7c1f8efb9cc"}]}
