)]}'
{".zuul.d/zuul.yaml":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":100,"context_line":"              - rally_openstack/task/scenarios/neutron/taas.py"},{"line_number":101,"context_line":"              - rally_openstack/task/scenarios/neutron/utils.py"},{"line_number":102,"context_line":"              - tests/ci/playbooks"},{"line_number":103,"context_line":"            voting: false"},{"line_number":104,"context_line":"        - rally-task-neutron-trunk:"},{"line_number":105,"context_line":"            irrelevant-files: *trivial-files"},{"line_number":106,"context_line":"            files:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"282a5a2e_3c04a470","line":103,"updated":"2026-10-10 14:33:10.000000000","message":"let\u0027s make it voting. non-voting jobs can easily break without any notice from Rally team (like barbican job - one scenario seems completely broken for a while)","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":100,"context_line":"              - rally_openstack/task/scenarios/neutron/taas.py"},{"line_number":101,"context_line":"              - rally_openstack/task/scenarios/neutron/utils.py"},{"line_number":102,"context_line":"              - tests/ci/playbooks"},{"line_number":103,"context_line":"            voting: false"},{"line_number":104,"context_line":"        - rally-task-neutron-trunk:"},{"line_number":105,"context_line":"            irrelevant-files: *trivial-files"},{"line_number":106,"context_line":"            files:"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"8c2f3052_f65fa911","line":103,"in_reply_to":"282a5a2e_3c04a470","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"}],"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"25ac358e2b1afdf965f3b7968fffbb3c688531ff","unresolved":true,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2f11d4cf7a0429f58eab96df67b28b6b737966ff"},{"line_number":17,"context_line":"Signed-off-by: janeesh23 \u003cjaneesh23reddy@gmail.com\u003e"},{"line_number":18,"context_line":"Co-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"67661880_f10c094e","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":14},"updated":"2026-09-16 14:50:59.000000000","message":"AI can\u0027t author a commit. Only humans can do. Please use Assisted-By or Generated-By instead.\n\nhttps://openinfra.org/legal/ai-policy","commit_id":"48f2f247a5bbdc2f852344de14f93c45da2c2db3"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2f11d4cf7a0429f58eab96df67b28b6b737966ff"},{"line_number":17,"context_line":"Signed-off-by: janeesh23 \u003cjaneesh23reddy@gmail.com\u003e"},{"line_number":18,"context_line":"Co-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"021ea0b0_1b489aeb","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":14},"in_reply_to":"67661880_f10c094e","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"48f2f247a5bbdc2f852344de14f93c45da2c2db3"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38840,"name":"Sai Janeesh Reddy Goureddy","display_name":"janeesh","email":"sgouredd@redhat.com","username":"janeesh4"},"change_message_id":"11498f702fa2578d10f8718af4cea4975d1a7cbd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5ad5f0ca_c63b88cc","updated":"2026-09-03 06:26:20.000000000","message":"Working on the TaaS CI failure.","commit_id":"ec3dd3c08487af8adca541ef1fbcd58db6153047"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"9d7b9d53_4cfc605d","updated":"2026-10-21 19:24:05.000000000","message":"thank you","commit_id":"afba54b9393f0af9647d35837aa465de70083b39"}],"pyproject.toml":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":true,"context_lines":[{"line_number":606,"context_line":"module \u003d \"rally_openstack.task.scenarios.neutron.fwaas\""},{"line_number":607,"context_line":"disable_error_code \u003d [\"no-untyped-def\"]"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"[[tool.mypy.overrides]]"},{"line_number":610,"context_line":"module \u003d \"rally_openstack.task.scenarios.neutron.taas\""},{"line_number":611,"context_line":"disable_error_code \u003d [\"no-untyped-def\"]"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"[[tool.mypy.overrides]]"},{"line_number":614,"context_line":"module \u003d \"rally_openstack.task.scenarios.neutron.loadbalancer_v1\""}],"source_content_type":"text/x-toml","patch_set":19,"id":"9ddc0982_cd0b550d","line":611,"range":{"start_line":609,"start_character":0,"end_line":611,"end_character":39},"updated":"2026-10-21 19:24:05.000000000","message":"please remove this, you already covered this module with type hints","commit_id":"afba54b9393f0af9647d35837aa465de70083b39"}],"rally_openstack/common/clients/neutron.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        name: str | None \u003d None,"},{"line_number":136,"context_line":"        **kwargs: t.Any,"},{"line_number":137,"context_line":"    ) -\u003e Port:"},{"line_number":138,"context_line":"        kwargs[\"name\"] \u003d name or self.generate_random_name()"},{"line_number":139,"context_line":"        return self._network.create_port(network_id\u003dnetwork_id, **kwargs)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @atomic.action_timer(\"neutron.list_ports\")"},{"line_number":142,"context_line":"    def list_ports(self, **filters: t.Any) -\u003e list[Port]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"0c858d1f_8147638c","line":139,"range":{"start_line":138,"start_character":0,"end_line":139,"end_character":73},"updated":"2026-09-10 09:11:29.000000000","message":"nit: the following style does not mutate the dict\n```suggestion\n        return self._network.create_port(\n            network_id\u003dnetwork_id,\n            name\u003dname or self.generate_random_name(),\n            **kwargs\n        )\n```","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        name: str | None \u003d None,"},{"line_number":136,"context_line":"        **kwargs: t.Any,"},{"line_number":137,"context_line":"    ) -\u003e Port:"},{"line_number":138,"context_line":"        kwargs[\"name\"] \u003d name or self.generate_random_name()"},{"line_number":139,"context_line":"        return self._network.create_port(network_id\u003dnetwork_id, **kwargs)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @atomic.action_timer(\"neutron.list_ports\")"},{"line_number":142,"context_line":"    def list_ports(self, **filters: t.Any) -\u003e list[Port]:"}],"source_content_type":"text/x-python","patch_set":10,"id":"67665ce1_669bff9f","line":139,"range":{"start_line":138,"start_character":0,"end_line":139,"end_character":73},"in_reply_to":"0c858d1f_8147638c","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":156,"context_line":"        port_id: str,"},{"line_number":157,"context_line":"        directions: dict[str, int],"},{"line_number":158,"context_line":"        remote_ip: str,"},{"line_number":159,"context_line":"        mirror_type: str \u003d \"gre\","},{"line_number":160,"context_line":"        name: str | None \u003d None,"},{"line_number":161,"context_line":"        description: str | None \u003d None,"},{"line_number":162,"context_line":"    ) -\u003e TapMirror:"}],"source_content_type":"text/x-python","patch_set":10,"id":"104a081a_94aa2eea","line":159,"updated":"2026-09-10 09:11:29.000000000","message":"this should move to an enum - TapMirrorType (or something) \u0027erspanv1\u0027/\u0027gre\u0027","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        port_id: str,"},{"line_number":157,"context_line":"        directions: dict[str, int],"},{"line_number":158,"context_line":"        remote_ip: str,"},{"line_number":159,"context_line":"        mirror_type: str \u003d \"gre\","},{"line_number":160,"context_line":"        name: str | None \u003d None,"},{"line_number":161,"context_line":"        description: str | None \u003d None,"},{"line_number":162,"context_line":"    ) -\u003e TapMirror:"}],"source_content_type":"text/x-python","patch_set":10,"id":"25c5a90c_f44f22f8","line":159,"in_reply_to":"104a081a_94aa2eea","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":179,"context_line":"    def get_tap_mirror(self, tap_mirror_id: str) -\u003e TapMirror:"},{"line_number":180,"context_line":"        return self._network.get_tap_mirror(tap_mirror_id)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    @atomic.action_timer(\"neutron.update_tap_mirror\")"},{"line_number":183,"context_line":"    def update_tap_mirror("},{"line_number":184,"context_line":"        self,"},{"line_number":185,"context_line":"        tap_mirror_id: str,"},{"line_number":186,"context_line":"        **kwargs: t.Any,"},{"line_number":187,"context_line":"    ) -\u003e TapMirror:"},{"line_number":188,"context_line":"        update_args: dict[str, t.Any] \u003d {}"},{"line_number":189,"context_line":"        if \"name\" not in kwargs:"},{"line_number":190,"context_line":"            update_args[\"name\"] \u003d self.generate_random_name()"},{"line_number":191,"context_line":"        update_args.update(kwargs)"},{"line_number":192,"context_line":"        return self._network.update_tap_mirror(tap_mirror_id, **update_args)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @atomic.action_timer(\"neutron.delete_tap_mirror\")"},{"line_number":195,"context_line":"    def delete_tap_mirror(self, tap_mirror_id: str) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7fcd8d3d_3daa7d29","line":192,"range":{"start_line":182,"start_character":0,"end_line":192,"end_character":76},"updated":"2026-09-10 09:11:29.000000000","message":"1) let\u0027s keep client implementation as simple as possible. I mean it is fine to generate name during create operations, but update operation should perform only what the caller expected.\n2) based on neutron api spec (https://docs.openstack.org/api-ref/network/v2/index.html#update-tap-mirror  ) there are only two properties allowed to be modified name and description.\n\nExample of implementation\n\n```suggestion\n    @atomic.action_timer(\"neutron.update_tap_mirror\")\n    def update_tap_mirror(\n        self,\n        tap_mirror_id: str,\n        name: str | None \u003d None,\n        description: str | None \u003d None\n    ) -\u003e TapMirror:\n        update_args: dict[str, t.Any] \u003d {}\n        if not name and description is None:\n            raise ValueError()\n        if name:\n            updated_args[\"name\"] \u003d name\n        if description:\n            updated_args[\"description\"] \u003d description\n        return self._network.update_tap_mirror(tap_mirror_id, **update_args)\n```","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":179,"context_line":"    def get_tap_mirror(self, tap_mirror_id: str) -\u003e TapMirror:"},{"line_number":180,"context_line":"        return self._network.get_tap_mirror(tap_mirror_id)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    @atomic.action_timer(\"neutron.update_tap_mirror\")"},{"line_number":183,"context_line":"    def update_tap_mirror("},{"line_number":184,"context_line":"        self,"},{"line_number":185,"context_line":"        tap_mirror_id: str,"},{"line_number":186,"context_line":"        **kwargs: t.Any,"},{"line_number":187,"context_line":"    ) -\u003e TapMirror:"},{"line_number":188,"context_line":"        update_args: dict[str, t.Any] \u003d {}"},{"line_number":189,"context_line":"        if \"name\" not in kwargs:"},{"line_number":190,"context_line":"            update_args[\"name\"] \u003d self.generate_random_name()"},{"line_number":191,"context_line":"        update_args.update(kwargs)"},{"line_number":192,"context_line":"        return self._network.update_tap_mirror(tap_mirror_id, **update_args)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    @atomic.action_timer(\"neutron.delete_tap_mirror\")"},{"line_number":195,"context_line":"    def delete_tap_mirror(self, tap_mirror_id: str) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5618ffe6_2fe3b069","line":192,"range":{"start_line":182,"start_character":0,"end_line":192,"end_character":76},"in_reply_to":"7fcd8d3d_3daa7d29","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"}],"rally_openstack/common/validators.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":656,"context_line":"                    f\"expects \u0027{self.context_config}\u0027\")"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"@validation.configure(name\u003d\"taas_port_sizing\", platform\u003d\"openstack\")"},{"line_number":660,"context_line":"class TaaSPortSizingValidator(validation.Validator):"},{"line_number":661,"context_line":"    \"\"\"Validate that ports_per_tenant is sufficient for concurrency."},{"line_number":662,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"f29af59b_dba6af70","line":659,"updated":"2026-10-10 14:33:10.000000000","message":"please make this validator generic.","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"}],"rally_openstack/task/cleanup/resources.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":432,"context_line":"    def list(self):"},{"line_number":433,"context_line":"        if not self._neutron.supports_extension(\"tap-mirror\", silent\u003dTrue):"},{"line_number":434,"context_line":"            return []"},{"line_number":435,"context_line":"        return ["},{"line_number":436,"context_line":"            mirror for mirror in self._neutron_client().list_tap_mirrors()"},{"line_number":437,"context_line":"            if mirror.project_id \u003d\u003d self.tenant_uuid"},{"line_number":438,"context_line":"        ]"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def delete(self):"},{"line_number":441,"context_line":"        self._neutron_client().delete_tap_mirror(self.id())"}],"source_content_type":"text/x-python","patch_set":10,"id":"6d52a8bb_7ad2d826","line":438,"range":{"start_line":435,"start_character":0,"end_line":438,"end_character":9},"updated":"2026-09-10 09:11:29.000000000","message":"project is a server side filter - https://docs.openstack.org/api-ref/network/v2/index.html#list-tap-mirrors . no need for client side filtering, if you pass the correct args to sdk","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def list(self):"},{"line_number":433,"context_line":"        if not self._neutron.supports_extension(\"tap-mirror\", silent\u003dTrue):"},{"line_number":434,"context_line":"            return []"},{"line_number":435,"context_line":"        return ["},{"line_number":436,"context_line":"            mirror for mirror in self._neutron_client().list_tap_mirrors()"},{"line_number":437,"context_line":"            if mirror.project_id \u003d\u003d self.tenant_uuid"},{"line_number":438,"context_line":"        ]"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"    def delete(self):"},{"line_number":441,"context_line":"        self._neutron_client().delete_tap_mirror(self.id())"}],"source_content_type":"text/x-python","patch_set":10,"id":"fb985bff_0ee79250","line":438,"range":{"start_line":435,"start_character":0,"end_line":438,"end_character":9},"in_reply_to":"6d52a8bb_7ad2d826","updated":"2026-10-10 14:33:10.000000000","message":"Marked as resolved.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"}],"rally_openstack/task/contexts/neutron/ports.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":37,"context_line":"        \"type\": \"object\","},{"line_number":38,"context_line":"        \"$schema\": consts.JSON_SCHEMA,"},{"line_number":39,"context_line":"        \"properties\": {"},{"line_number":40,"context_line":"            \"ports_per_tenant\": {"},{"line_number":41,"context_line":"                \"type\": \"integer\","},{"line_number":42,"context_line":"                \"minimum\": 1,"},{"line_number":43,"context_line":"            },"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fef2793_d50f49de","line":40,"updated":"2026-10-10 14:33:10.000000000","message":"I know that it is a bit inconsistent with other contexts, but can you call this `ports_per_project`, so we need to deprecate/rename fewer places","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \"type\": \"object\","},{"line_number":38,"context_line":"        \"$schema\": consts.JSON_SCHEMA,"},{"line_number":39,"context_line":"        \"properties\": {"},{"line_number":40,"context_line":"            \"ports_per_tenant\": {"},{"line_number":41,"context_line":"                \"type\": \"integer\","},{"line_number":42,"context_line":"                \"minimum\": 1,"},{"line_number":43,"context_line":"            },"}],"source_content_type":"text/x-python","patch_set":17,"id":"c46426bc_b54ef2b8","line":40,"in_reply_to":"9fef2793_d50f49de","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":61,"context_line":"                    \"No networks found for tenant %(tenant)s; \""},{"line_number":62,"context_line":"                    \"ports context created an empty port pool. \""},{"line_number":63,"context_line":"                    \"Ensure network@openstack context is configured.\","},{"line_number":64,"context_line":"                    {\"tenant\": tenant_id})"},{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            client \u003d neutron.NeutronService("}],"source_content_type":"text/x-python","patch_set":17,"id":"a5960e8f_60788861","line":64,"updated":"2026-10-10 14:33:10.000000000","message":"do not pass args into logging method - https://github.com/openstack/rally/blob/5.1.1/rally/common/logging.py#L93-L97\n\nAlso, I think failing the context is much better/visible","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                    \"No networks found for tenant %(tenant)s; \""},{"line_number":62,"context_line":"                    \"ports context created an empty port pool. \""},{"line_number":63,"context_line":"                    \"Ensure network@openstack context is configured.\","},{"line_number":64,"context_line":"                    {\"tenant\": tenant_id})"},{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            client \u003d neutron.NeutronService("}],"source_content_type":"text/x-python","patch_set":17,"id":"311e6765_bf9a70c5","line":64,"in_reply_to":"a5960e8f_60788861","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            client \u003d neutron.NeutronService("},{"line_number":68,"context_line":"                user[\"credential\"].clients(),"},{"line_number":69,"context_line":"                name_generator\u003dself.generate_random_name,"},{"line_number":70,"context_line":"                atomic_inst\u003dself.atomic_actions(),"},{"line_number":71,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":17,"id":"4a4c470d_2bd0e47b","line":68,"updated":"2026-10-10 14:33:10.000000000","message":"this would produce a warning https://github.com/openstack/rally-openstack/blob/master/rally_openstack/common/credential.py#L156-L163","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                continue"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"            client \u003d neutron.NeutronService("},{"line_number":68,"context_line":"                user[\"credential\"].clients(),"},{"line_number":69,"context_line":"                name_generator\u003dself.generate_random_name,"},{"line_number":70,"context_line":"                atomic_inst\u003dself.atomic_actions(),"},{"line_number":71,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":17,"id":"1b309f9a_b0dc2834","line":68,"in_reply_to":"4a4c470d_2bd0e47b","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"}],"rally_openstack/task/scenarios/neutron/taas.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TapMirrorCreateArgs(te.TypedDict, total\u003dFalse):"},{"line_number":29,"context_line":"    name: str"},{"line_number":30,"context_line":"    description: str"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3d0c37c7_a609ddb1","line":29,"updated":"2026-09-10 09:11:29.000000000","message":"we should never allow the user to speciufy name for resource. it breaks the cleanup mechanism as rally would not able to filter resources created by itself.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class TapMirrorCreateArgs(te.TypedDict, total\u003dFalse):"},{"line_number":29,"context_line":"    name: str"},{"line_number":30,"context_line":"    description: str"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"b3ce4c9f_48570ff1","line":29,"in_reply_to":"3d0c37c7_a609ddb1","updated":"2026-10-10 14:33:10.000000000","message":"Marked as resolved.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class TapMirrorUpdateArgs(te.TypedDict, total\u003dFalse):"},{"line_number":34,"context_line":"    name: str"},{"line_number":35,"context_line":"    description: str"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"71091103_84230ea0","line":34,"updated":"2026-09-10 09:11:29.000000000","message":"same here","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4e03a8eacf47fb63f80bd2e6eaf38bf77f83fd02","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class TapMirrorUpdateArgs(te.TypedDict, total\u003dFalse):"},{"line_number":34,"context_line":"    name: str"},{"line_number":35,"context_line":"    description: str"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"76adbd64_7348f573","line":34,"in_reply_to":"71091103_84230ea0","updated":"2026-10-21 19:24:05.000000000","message":"Done","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":65,"context_line":"        mirror_type \u003d self._mirror_type(mirror_type)"},{"line_number":66,"context_line":"        directions \u003d self._allocate_directions(mirror_directions, mirror_type)"},{"line_number":67,"context_line":"        neutron_client \u003d self._clients.neutron"},{"line_number":68,"context_line":"        network \u003d neutron_client.create_network()"},{"line_number":69,"context_line":"        port \u003d neutron_client.create_port(network_id\u003dnetwork.id)"},{"line_number":70,"context_line":"        neutron_client.create_tap_mirror("},{"line_number":71,"context_line":"            port_id\u003dport.id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"bd684b6e_f18538a3","line":68,"updated":"2026-09-10 09:11:29.000000000","message":"should we just required netwroks context to be specified?\nalso, it would be nice to list","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        mirror_type \u003d self._mirror_type(mirror_type)"},{"line_number":66,"context_line":"        directions \u003d self._allocate_directions(mirror_directions, mirror_type)"},{"line_number":67,"context_line":"        neutron_client \u003d self._clients.neutron"},{"line_number":68,"context_line":"        network \u003d neutron_client.create_network()"},{"line_number":69,"context_line":"        port \u003d neutron_client.create_port(network_id\u003dnetwork.id)"},{"line_number":70,"context_line":"        neutron_client.create_tap_mirror("},{"line_number":71,"context_line":"            port_id\u003dport.id,"}],"source_content_type":"text/x-python","patch_set":10,"id":"cbe7ac1f_e43558ea","line":68,"in_reply_to":"bd684b6e_f18538a3","updated":"2026-10-10 14:33:10.000000000","message":"Marked as resolved.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"}],"rally_openstack/task/scenarios/neutron/utils.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"4d5f2d4a214733d7a7718e8fbddb7da94f6df77a","unresolved":true,"context_lines":[{"line_number":1070,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"class MirrorType(str, enum.Enum):"},{"line_number":1074,"context_line":"    GRE \u003d \"gre\""},{"line_number":1075,"context_line":"    ERSPANV1 \u003d \"erspanv1\""},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"MirrorDirection \u003d t.Literal[\"IN\", \"OUT\"]"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"def _tunnel_id_max(mirror_type: MirrorType) -\u003e int:"}],"source_content_type":"text/x-python","patch_set":10,"id":"97f92c85_d3a33785","line":1078,"range":{"start_line":1073,"start_character":0,"end_line":1078,"end_character":40},"updated":"2026-09-10 09:11:29.000000000","message":"ok, let\u0027s move it to the client module.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":false,"context_lines":[{"line_number":1070,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"class MirrorType(str, enum.Enum):"},{"line_number":1074,"context_line":"    GRE \u003d \"gre\""},{"line_number":1075,"context_line":"    ERSPANV1 \u003d \"erspanv1\""},{"line_number":1076,"context_line":""},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"MirrorDirection \u003d t.Literal[\"IN\", \"OUT\"]"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"def _tunnel_id_max(mirror_type: MirrorType) -\u003e int:"}],"source_content_type":"text/x-python","patch_set":10,"id":"d35e6393_8833ace5","line":1078,"range":{"start_line":1073,"start_character":0,"end_line":1078,"end_character":40},"in_reply_to":"97f92c85_d3a33785","updated":"2026-10-10 14:33:10.000000000","message":"Marked as resolved.","commit_id":"07c171a4f6c332666980fef0f8f05de02ee0c5ed"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b30efd97b1716318f42d40838eee13650f4b2439","unresolved":true,"context_lines":[{"line_number":1068,"context_line":"        :param firewall_group: dict, neutron firewall_group"},{"line_number":1069,"context_line":"        \"\"\""},{"line_number":1070,"context_line":"        self.clients(\"neutron\").delete_fwaas_firewall_group("},{"line_number":1071,"context_line":"            firewall_group[\"firewall_group\"][\"id\"])"},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":""},{"line_number":1074,"context_line":"def _tunnel_id_max(mirror_type: MirrorType) -\u003e int:"},{"line_number":1075,"context_line":"    if mirror_type \u003d\u003d MirrorType.ERSPANV1:"},{"line_number":1076,"context_line":"        return 1023"},{"line_number":1077,"context_line":"    return 16777215"},{"line_number":1078,"context_line":""},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"def _allocate_tunnel_id("},{"line_number":1081,"context_line":"    project_id: str,"},{"line_number":1082,"context_line":"    owner_id: str,"},{"line_number":1083,"context_line":"    iteration: int,"},{"line_number":1084,"context_line":"    direction: str,"},{"line_number":1085,"context_line":"    mirror_type: MirrorType,"},{"line_number":1086,"context_line":") -\u003e int:"},{"line_number":1087,"context_line":"    max_id \u003d _tunnel_id_max(mirror_type)"},{"line_number":1088,"context_line":"    seed \u003d f\"{project_id}:{owner_id}:{iteration}:{direction}\""},{"line_number":1089,"context_line":"    digest \u003d hashlib.sha256(seed.encode()).hexdigest()"},{"line_number":1090,"context_line":"    return int(digest, 16) % max_id + 1"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"class TaaSScenario(NeutronScenario):"},{"line_number":1094,"context_line":"    \"\"\"Base class for TaaS (Tap-as-a-Service) scenarios.\"\"\""},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    def _mirror_type(self, mirror_type: MirrorType | str) -\u003e MirrorType:"},{"line_number":1097,"context_line":"        if isinstance(mirror_type, str):"},{"line_number":1098,"context_line":"            return MirrorType(mirror_type)"},{"line_number":1099,"context_line":"        return mirror_type"},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    def _allocate_directions("},{"line_number":1102,"context_line":"        self,"},{"line_number":1103,"context_line":"        mirror_directions: t.Sequence[MirrorDirection],"},{"line_number":1104,"context_line":"        mirror_type: MirrorType,"},{"line_number":1105,"context_line":"    ) -\u003e dict[str, int]:"},{"line_number":1106,"context_line":"        \"\"\"Map mirror direction names to unique tunnel IDs.\"\"\""},{"line_number":1107,"context_line":"        project_id \u003d self.context[\"tenant\"][\"id\"]"},{"line_number":1108,"context_line":"        owner_id \u003d self.context[\"owner_id\"]"},{"line_number":1109,"context_line":"        iteration \u003d self.context[\"iteration\"]"},{"line_number":1110,"context_line":"        return {"},{"line_number":1111,"context_line":"            direction: _allocate_tunnel_id("},{"line_number":1112,"context_line":"                project_id, owner_id, iteration, direction, mirror_type)"},{"line_number":1113,"context_line":"            for direction in mirror_directions"},{"line_number":1114,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":17,"id":"73f25f42_9cc3ff0f","line":1114,"range":{"start_line":1071,"start_character":0,"end_line":1114,"end_character":9},"updated":"2026-10-10 14:33:10.000000000","message":"If you do not plan to add more to this, it can move closer to taas scenarios, i.e., to taas.py","commit_id":"e4f8cdf50a6247f282935cca57aca68c2bec852b"}]}
