)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f06b7fea317b16082f755a300d38b6b916feb144","unresolved":true,"context_lines":[{"line_number":10,"context_line":"introduced in OVN 25.09 [1]:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"1. MirrorAddCommand: accept the lport type."},{"line_number":13,"context_line":"2. LspAttachMirror / LspDetachMirror: fix adding/removing mirrors on an LSP."},{"line_number":14,"context_line":"3. MirrorRuleAddCommand / MirrorRuleDelCommand: create and delete mirror"},{"line_number":15,"context_line":"   rules."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"c4d65bf8_387782e8","line":13,"range":{"start_line":13,"start_character":3,"end_line":13,"end_character":76},"updated":"2026-10-08 12:44:53.000000000","message":"Please limit the line size to 72 chars [1] in order to be formatted properly in gerrit\n\n[1]https://docs.openstack.org/contributors/es_MX/common/git.html#body","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"6519ba3f0b996d2737bff663790a7d09a4e7337b","unresolved":false,"context_lines":[{"line_number":10,"context_line":"introduced in OVN 25.09 [1]:"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"1. MirrorAddCommand: accept the lport type."},{"line_number":13,"context_line":"2. LspAttachMirror / LspDetachMirror: fix adding/removing mirrors on an LSP."},{"line_number":14,"context_line":"3. MirrorRuleAddCommand / MirrorRuleDelCommand: create and delete mirror"},{"line_number":15,"context_line":"   rules."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"6f7e72c5_e02785a8","line":13,"in_reply_to":"c4d65bf8_387782e8","updated":"2026-10-08 14:49:46.000000000","message":"Done, wrapped at 72 columns.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f06b7fea317b16082f755a300d38b6b916feb144","unresolved":true,"context_lines":[{"line_number":14,"context_line":"3. MirrorRuleAddCommand / MirrorRuleDelCommand: create and delete mirror"},{"line_number":15,"context_line":"   rules."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Changes since PS2, following the review:"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* MirrorAddCommand no longer sets ``mirror_rules`` unconditionally, so"},{"line_number":20,"context_line":"  calling ``mirror_add`` with ``may_exist\u003dTrue`` on an existing mirror"},{"line_number":21,"context_line":"  keeps its rules. Rules are managed only through the mirror rule"},{"line_number":22,"context_line":"  commands, mirroring the ovn-nbctl split."},{"line_number":23,"context_line":"* The lport mirror and mirror rule commands check at runtime that the"},{"line_number":24,"context_line":"  connected Northbound schema has ``Mirror.mirror_rules`` and raise"},{"line_number":25,"context_line":"  ``RuntimeError`` otherwise, so the library keeps working with older"},{"line_number":26,"context_line":"  OVN releases; the existing mirror types are unaffected."},{"line_number":27,"context_line":"* ``mirror_rule_del`` accepts the valid priority 0."},{"line_number":28,"context_line":"* Functional tests skip when the schema has no mirror rule support and"},{"line_number":29,"context_line":"  cover the ``may_exist`` and priority 0 cases."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[1] https://github.com/ovn-org/ovn/commit/3dd8f36b85b3e648bc506839aa62e81b21c41e30"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"aa78b9ce_9dc57fcc","line":29,"range":{"start_line":17,"start_character":0,"end_line":29,"end_character":47},"updated":"2026-10-08 12:44:53.000000000","message":"This section is not needed.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"6519ba3f0b996d2737bff663790a7d09a4e7337b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"  OVN releases; the existing mirror types are unaffected."},{"line_number":27,"context_line":"* ``mirror_rule_del`` accepts the valid priority 0."},{"line_number":28,"context_line":"* Functional tests skip when the schema has no mirror rule support and"},{"line_number":29,"context_line":"  cover the ``may_exist`` and priority 0 cases."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[1] https://github.com/ovn-org/ovn/commit/3dd8f36b85b3e648bc506839aa62e81b21c41e30"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5dcb3072_dea77cae","line":29,"in_reply_to":"aa78b9ce_9dc57fcc","updated":"2026-10-08 14:49:46.000000000","message":"Done, the patch set history is gone from the commit message; the runtime schema check and the may_exist behaviour are now described as part of the feature.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38024,"name":"Alexander Gnatyuk","display_name":"Alexander Gnatyuk","email":"agnatyuk@k2.cloud","username":"agnatyuk"},"change_message_id":"19295d1908f6df0408d3f7d8ea7fdc02e434b8e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"55a2673f_91202e04","updated":"2025-08-04 10:41:16.000000000","message":"Hello, gentle ping on this PR 😊","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"00b9c337e61bf02193c49208fbc92b7c210ef033","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"07773e17_60c01a85","updated":"2025-08-04 15:36:10.000000000","message":"Looks great, thanks! Just a tiny nit and a question about inheriting from `AddCommand`.","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"d45f9f47a7846e381283d8075fc063a68ec64542","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"27f0b8eb_96295b10","updated":"2025-08-04 14:54:45.000000000","message":"reading now. sorry about that.","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"3aa8619cf34f4811074c748d3f7261bb5fa7f920","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cf28fea1_fc23cd33","updated":"2025-05-26 09:43:02.000000000","message":"thanks looks really useful","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"6f2d8997c8019decf7a072c3b1b27b7430676924","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"87f26164_d04bde3d","updated":"2026-09-23 02:24:48.000000000","message":"Hi Alexander,\n\nI\u0027m working on a Tap-as-a-Service extension at KT Cloud that exposes the\nOVN lport mirror and Mirror_Rule to Neutron users, and I\u0027d much rather\nbuild it on this change than carry a private copy of these commands in\nTaaS. Since the review has been quiet for a while, I went ahead and\naddressed the open comments on top of your PS2 locally. Before I do\nanything with it I wanted to check with you first.\n\nWhat I changed, briefly:\n\nFor Rodolfo\u0027s and Terry\u0027s point about older OVN releases, the lport mirror\nand the mirror rule commands now check idlutils.table_has_column() for\nMirror.mirror_rules at runtime and raise a RuntimeError with a hint about\nthe required OVN version. The gre/erspan/local paths are untouched, so\nnothing changes for people still on OVN \u003c 25.09.\n\nFor the may_exist question you raised, MirrorAddCommand no longer touches\nmirror_rules at all. Rules are only managed through MirrorRuleAdd/Del,\nwhich is also how ovn-nbctl splits it, so calling mirror_add with\nmay_exist\u003dTrue on an existing mirror keeps its rules. I left the update\nbehaviour of the other columns as it is today, to avoid changing the\nsemantics of a command that has been there for a while, and documented\nthat in the api.py docstring. There is a functional test for the\n\"may_exist keeps the rules\" case, as Rodolfo asked.\n\nTwo smaller things: MirrorRuleDelCommand treated priority 0 as \"not\ngiven\" (if self.priority:), which I changed to \"is not None\" with a test,\nand the functional tests now skip when the schema has no mirror rule\nsupport. The trailing comma and release note whitespace nits are in too.\n\nI\u0027ve been running this against OVN 26.03 (NB schema 7.18.0) from the TaaS\nOVN driver, and mirror_add(type\u003dlport) / mirror_rule_add / mirror_rule_del\nshow up in the NB DB as expected, with the mirrored frames arriving at the\ntarget port.\n\nWould you prefer to pick these up and push the next patch set yourself? If\nyou\u0027re busy, I\u0027m happy to upload it as PS3 with you kept as the author and\na Co-Authored-By line for my part. I\u0027ll give it a couple of weeks before\ndoing that, in case you want to go a different way. Any feedback welcome.\n\nThanks,\nChanyeol","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":38024,"name":"Alexander Gnatyuk","display_name":"Alexander Gnatyuk","email":"agnatyuk@k2.cloud","username":"agnatyuk"},"change_message_id":"963c05d499e46554d2f8e3fad73343516db5485b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"bdebb13b_714a238c","updated":"2025-08-07 10:29:40.000000000","message":"Thanks for the review! I\u0027ve rebased this patch on master.\n\nI have a question about the `may_exist\u003dTrue` behavior. In the MirrorAdd command, if we specify `may_exist\u003dTrue` and such mirror already exists, the command will update row via `set_columns(mirror, **self.columns)`. \nThis patch provides `mirror_rules: []` in Mirror, and if we:\n1. create mirror\n2. create rules\n3. create mirror again with `may_exist\u003dTrue` -- all mirror rules will be deleted (because of `columns[\"mirror_rules\"] \u003d [] + set_columns(row, **columns)`.\n\nPersonally, I wouldn\u0027t use `set_columns` if the mirror exists, but since this code is 2 years old, removing it now is a bad idea, I guess. If you have any thoughts on this, please share.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"17982c3995f45851acdd8138d0682a2b59ab02b0","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3ec83e83_316a8813","in_reply_to":"0e7705c6_e26eb32f","updated":"2025-12-23 20:32:27.000000000","message":"I would generally default to not doing set_columns if may_exist\u003dTrue, but with that said I have reviewed some BGP patches where the author wanted certain Commands to be idempotent and operate kind of as a CREATE OR UPDATE and that is also a valid choice. In that case, I would then only set the columns that were specifically passed and default to the existing values maybe?\n\nWith all of that said, I generally like to think of the ovsdbapp Commands as reference implementations. In general, a lot of the core commands try to do exactly what the ovn-nbctl and ovn-sbctl commands do. So in that case, there would be separate MirrorAdd and MirrorRuleAdd commands--and in that case, what to do with may_exist\u003dTrue becomes more obvious.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"8569c78c3413d0311bd81414d15b6718412dda63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"61b41322_76f4fed6","in_reply_to":"3ec83e83_316a8813","updated":"2026-10-07 10:21:58.000000000","message":"Done in PS3: mirror_rules is no longer set by MirrorAddCommand, so may_exist\u003dTrue keeps existing rules; rules are only managed by MirrorRuleAdd/Del, as in ovn-nbctl. The other columns keep the existing update behaviour; documented in api.py. Functional test test_mirror_add_lport_may_exist_keeps_rules added.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"8569c78c3413d0311bd81414d15b6718412dda63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"5940fcf0_3ce1a194","in_reply_to":"87f26164_d04bde3d","updated":"2026-10-07 10:21:58.000000000","message":"Uploaded PS3 as announced above, after the two weeks passed without a reply. Alexander, you remain the author of the change; feel free to take it over again at any time.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"736fb009deeac1d27e66f8aa9ce7b2c2b5e6c7c8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"0e7705c6_e26eb32f","in_reply_to":"bdebb13b_714a238c","updated":"2025-08-07 12:13:11.000000000","message":"That\u0027s a fair concern. If you call the ``MirrorAdd`` with ``may_exist\u003dTrue``, that will delete all the existing rules. In that case, the command is unexpectedly changing the exiting register.\n\nI would wait for Terry\u0027s feedback on this. IMO, if we don\u0027t explicitly pass any value and the register exists, we should avoid changing this list. This will require a functional test.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"17c48d76d4a75344873e0aad2bbab0d300303b63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4d3ae634_bbf2ee07","updated":"2026-10-08 15:07:15.000000000","message":"Looks ok","commit_id":"fbeb0a5431610e5e1953d98442b305ce5c4677ab"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"56e1be2c30241b7fa6fc64dc9c569f3c295a59a3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"344bb14b_080ba878","updated":"2026-10-13 13:49:22.000000000","message":"Thanks!","commit_id":"fbeb0a5431610e5e1953d98442b305ce5c4677ab"}],"ovsdbapp/schema/ovn_northbound/commands.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"00b9c337e61bf02193c49208fbc92b7c210ef033","unresolved":true,"context_lines":[{"line_number":1246,"context_line":"        mirror.addvalue(\u0027mirror_rules\u0027, rule)"},{"line_number":1247,"context_line":"        self.result \u003d rule.uuid"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    def post_commit(self, txn):"},{"line_number":1250,"context_line":"        real_uuid \u003d txn.get_insert_uuid(self.result)"},{"line_number":1251,"context_line":"        if real_uuid:"},{"line_number":1252,"context_line":"            table \u003d self.api.tables[\u0027Mirror_Rule\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"70ad3034_e55064a5","line":1249,"updated":"2025-08-04 15:36:10.000000000","message":"Is there a reason that this command cannot inherit from `ovsdbapp/backend/ovs_idl/commands/AddCommand` and define `table_name \u003d \"Mirror_Rule\"` to pick this up?","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":38024,"name":"Alexander Gnatyuk","display_name":"Alexander Gnatyuk","email":"agnatyuk@k2.cloud","username":"agnatyuk"},"change_message_id":"963c05d499e46554d2f8e3fad73343516db5485b","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"        mirror.addvalue(\u0027mirror_rules\u0027, rule)"},{"line_number":1247,"context_line":"        self.result \u003d rule.uuid"},{"line_number":1248,"context_line":""},{"line_number":1249,"context_line":"    def post_commit(self, txn):"},{"line_number":1250,"context_line":"        real_uuid \u003d txn.get_insert_uuid(self.result)"},{"line_number":1251,"context_line":"        if real_uuid:"},{"line_number":1252,"context_line":"            table \u003d self.api.tables[\u0027Mirror_Rule\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7aaf2188_d470db2b","line":1249,"in_reply_to":"70ad3034_e55064a5","updated":"2025-08-07 10:29:40.000000000","message":"Thanks! Made it inherit from AddCommand.","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"736fb009deeac1d27e66f8aa9ce7b2c2b5e6c7c8","unresolved":true,"context_lines":[{"line_number":1169,"context_line":"            \u0027sink\u0027: dest,"},{"line_number":1170,"context_line":"            \u0027type\u0027: mirror_type,"},{"line_number":1171,"context_line":"            \u0027index\u0027: index,"},{"line_number":1172,"context_line":"            \u0027mirror_rules\u0027: [],"},{"line_number":1173,"context_line":"            \u0027external_ids\u0027: external_ids or {},"},{"line_number":1174,"context_line":"        }"},{"line_number":1175,"context_line":"        self.may_exist \u003d may_exist"}],"source_content_type":"text/x-python","patch_set":2,"id":"7892a8e3_eb57bdee","line":1172,"range":{"start_line":1172,"start_character":12,"end_line":1172,"end_character":31},"updated":"2025-08-07 12:13:11.000000000","message":"As you mentioned, that was merged recently in OVN. This is not even released. The functional tests work because we, by default, use master.\n\nI tested with a previous version (v24.09.2, because I\u0027m working with it now). The commands fail with this version (snippet: https://paste.opendev.org/show/bWq2Qf9gKwyVHCegqJHb/). You can manually do this locally setting OVN_BRANCH in tox or in the env variables.\n\nWe can\u0027t deliver a command that works only with OVN master.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"8569c78c3413d0311bd81414d15b6718412dda63","unresolved":false,"context_lines":[{"line_number":1169,"context_line":"            \u0027sink\u0027: dest,"},{"line_number":1170,"context_line":"            \u0027type\u0027: mirror_type,"},{"line_number":1171,"context_line":"            \u0027index\u0027: index,"},{"line_number":1172,"context_line":"            \u0027mirror_rules\u0027: [],"},{"line_number":1173,"context_line":"            \u0027external_ids\u0027: external_ids or {},"},{"line_number":1174,"context_line":"        }"},{"line_number":1175,"context_line":"        self.may_exist \u003d may_exist"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f7a4dbf_4083ee64","line":1172,"in_reply_to":"5783608c_5f2a5c30","updated":"2026-10-07 10:21:58.000000000","message":"Done in PS3: lport mirrors and the mirror rule commands check idlutils.table_has_column(idl, \u0027Mirror\u0027, \u0027mirror_rules\u0027) at runtime and raise RuntimeError with a hint about the required OVN version (25.09+); the other mirror types are untouched. The functional tests skip when the schema lacks the column.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"17982c3995f45851acdd8138d0682a2b59ab02b0","unresolved":true,"context_lines":[{"line_number":1169,"context_line":"            \u0027sink\u0027: dest,"},{"line_number":1170,"context_line":"            \u0027type\u0027: mirror_type,"},{"line_number":1171,"context_line":"            \u0027index\u0027: index,"},{"line_number":1172,"context_line":"            \u0027mirror_rules\u0027: [],"},{"line_number":1173,"context_line":"            \u0027external_ids\u0027: external_ids or {},"},{"line_number":1174,"context_line":"        }"},{"line_number":1175,"context_line":"        self.may_exist \u003d may_exist"}],"source_content_type":"text/x-python","patch_set":2,"id":"5783608c_5f2a5c30","line":1172,"range":{"start_line":1172,"start_character":12,"end_line":1172,"end_character":31},"in_reply_to":"7892a8e3_eb57bdee","updated":"2025-12-23 20:32:27.000000000","message":"Agreed. We don\u0027t have a specific version of OVN ovsdbapp requires, but we try to be as backward compatible as possible. There is a `table_has_column()` method that can be used to check if this column is supported at runtime.","commit_id":"dfa5343162ab3446e8471e72f751b9ce71711b3c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f06b7fea317b16082f755a300d38b6b916feb144","unresolved":true,"context_lines":[{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"    def run_idl(self, txn):"},{"line_number":1242,"context_line":"        if (self.mirror_type \u003d\u003d const.MIRROR_TYPE_LPORT and"},{"line_number":1243,"context_line":"                not idlutils.table_has_column(self.api.idl, self.table_name,"},{"line_number":1244,"context_line":"                                              \u0027mirror_rules\u0027)):"},{"line_number":1245,"context_line":"            raise RuntimeError("},{"line_number":1246,"context_line":"                \"Mirror type %s is not supported by the OVN Northbound \""},{"line_number":1247,"context_line":"                \"schema in use (requires OVN \u003e\u003d 25.09)\" %"}],"source_content_type":"text/x-python","patch_set":3,"id":"43316dcb_376a27f5","line":1244,"range":{"start_line":1243,"start_character":17,"end_line":1244,"end_character":61},"updated":"2026-10-08 12:44:53.000000000","message":"This check is `_check_mirror_rules_supported`, it can be used here too.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"6519ba3f0b996d2737bff663790a7d09a4e7337b","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"    def run_idl(self, txn):"},{"line_number":1242,"context_line":"        if (self.mirror_type \u003d\u003d const.MIRROR_TYPE_LPORT and"},{"line_number":1243,"context_line":"                not idlutils.table_has_column(self.api.idl, self.table_name,"},{"line_number":1244,"context_line":"                                              \u0027mirror_rules\u0027)):"},{"line_number":1245,"context_line":"            raise RuntimeError("},{"line_number":1246,"context_line":"                \"Mirror type %s is not supported by the OVN Northbound \""},{"line_number":1247,"context_line":"                \"schema in use (requires OVN \u003e\u003d 25.09)\" %"}],"source_content_type":"text/x-python","patch_set":3,"id":"ee5451bc_02abb8df","line":1244,"in_reply_to":"43316dcb_376a27f5","updated":"2026-10-08 14:49:46.000000000","message":"Done: MirrorAddCommand now calls _check_mirror_rules_supported for the lport type too. The helper moved above the class and its message was generalized to lport mirrors and mirror rules.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f06b7fea317b16082f755a300d38b6b916feb144","unresolved":true,"context_lines":[{"line_number":1305,"context_line":""},{"line_number":1306,"context_line":"    def run_idl(self, txn):"},{"line_number":1307,"context_line":"        _check_mirror_rules_supported(self.api)"},{"line_number":1308,"context_line":"        mirror \u003d self.api.lookup(\u0027Mirror\u0027, self.mirror)"},{"line_number":1309,"context_line":"        if mirror.type !\u003d const.MIRROR_TYPE_LPORT:"},{"line_number":1310,"context_line":"            raise RuntimeError("},{"line_number":1311,"context_line":"                \"Only mirror with type lport support mirror rules\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"c59b3e3c_42a36691","line":1308,"range":{"start_line":1308,"start_character":8,"end_line":1308,"end_character":55},"updated":"2026-10-08 12:44:53.000000000","message":"You should consider the case of not finding this `Mirror`.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"},{"author":{"_account_id":32077,"name":"chanyeol yoon","display_name":"chanyeol","email":"ycy1766@gmail.com","username":"ycy1766","status":"ktcloud cloud engineer "},"change_message_id":"6519ba3f0b996d2737bff663790a7d09a4e7337b","unresolved":false,"context_lines":[{"line_number":1305,"context_line":""},{"line_number":1306,"context_line":"    def run_idl(self, txn):"},{"line_number":1307,"context_line":"        _check_mirror_rules_supported(self.api)"},{"line_number":1308,"context_line":"        mirror \u003d self.api.lookup(\u0027Mirror\u0027, self.mirror)"},{"line_number":1309,"context_line":"        if mirror.type !\u003d const.MIRROR_TYPE_LPORT:"},{"line_number":1310,"context_line":"            raise RuntimeError("},{"line_number":1311,"context_line":"                \"Only mirror with type lport support mirror rules\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"cee78bad_ab2a082f","line":1308,"in_reply_to":"c59b3e3c_42a36691","updated":"2026-10-08 14:49:46.000000000","message":"Done: MirrorRuleAddCommand raises RuntimeError(\"Mirror \u003cname\u003e does not exist\") when the parent mirror is missing, and MirrorRuleDelCommand does the same unless if_exists\u003dTrue, following the other commands. While at it, LspAttachMirror/LspDetachMirror now look up the LSP and the Mirror separately so the error names the missing one. Functional tests added for these cases.","commit_id":"bc73998750949d459edcf266f1fb7bbf074a48a5"}],"ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"00b9c337e61bf02193c49208fbc92b7c210ef033","unresolved":true,"context_lines":[{"line_number":2968,"context_line":"        mirror \u003d self.api.mirror_add(utils.get_rand_name(),"},{"line_number":2969,"context_line":"                                     const.MIRROR_TYPE_LPORT, 0, \u0027both\u0027,"},{"line_number":2970,"context_line":"                                     self.port_uuid).execute(check_error\u003dTrue)"},{"line_number":2971,"context_line":"        rule1 \u003d self._mirror_rule_add(mirror,)"},{"line_number":2972,"context_line":"        rule2 \u003d self._mirror_rule_add(mirror, match\u003d\u0027ip4\u0027)"},{"line_number":2973,"context_line":"        rule3 \u003d self._mirror_rule_add(mirror, priority\u003d2)"},{"line_number":2974,"context_line":"        for rule in [rule1, rule2, rule3]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"cd91d145_032b53a1","line":2971,"range":{"start_line":2971,"start_character":44,"end_line":2971,"end_character":45},"updated":"2025-08-04 15:36:10.000000000","message":"nit: trailing comma","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"00b9c337e61bf02193c49208fbc92b7c210ef033","unresolved":true,"context_lines":[{"line_number":2968,"context_line":"        mirror \u003d self.api.mirror_add(utils.get_rand_name(),"},{"line_number":2969,"context_line":"                                     const.MIRROR_TYPE_LPORT, 0, \u0027both\u0027,"},{"line_number":2970,"context_line":"                                     self.port_uuid).execute(check_error\u003dTrue)"},{"line_number":2971,"context_line":"        rule1 \u003d self._mirror_rule_add(mirror,)"},{"line_number":2972,"context_line":"        rule2 \u003d self._mirror_rule_add(mirror, match\u003d\u0027ip4\u0027)"},{"line_number":2973,"context_line":"        rule3 \u003d self._mirror_rule_add(mirror, priority\u003d2)"},{"line_number":2974,"context_line":"        for rule in [rule1, rule2, rule3]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ca54735_e8984c3b","line":2971,"range":{"start_line":2971,"start_character":44,"end_line":2971,"end_character":45},"updated":"2025-08-04 15:36:10.000000000","message":"trailing comma","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":38024,"name":"Alexander Gnatyuk","display_name":"Alexander Gnatyuk","email":"agnatyuk@k2.cloud","username":"agnatyuk"},"change_message_id":"963c05d499e46554d2f8e3fad73343516db5485b","unresolved":false,"context_lines":[{"line_number":2968,"context_line":"        mirror \u003d self.api.mirror_add(utils.get_rand_name(),"},{"line_number":2969,"context_line":"                                     const.MIRROR_TYPE_LPORT, 0, \u0027both\u0027,"},{"line_number":2970,"context_line":"                                     self.port_uuid).execute(check_error\u003dTrue)"},{"line_number":2971,"context_line":"        rule1 \u003d self._mirror_rule_add(mirror,)"},{"line_number":2972,"context_line":"        rule2 \u003d self._mirror_rule_add(mirror, match\u003d\u0027ip4\u0027)"},{"line_number":2973,"context_line":"        rule3 \u003d self._mirror_rule_add(mirror, priority\u003d2)"},{"line_number":2974,"context_line":"        for rule in [rule1, rule2, rule3]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dc867753_4ca91f37","line":2971,"range":{"start_line":2971,"start_character":44,"end_line":2971,"end_character":45},"in_reply_to":"1ca54735_e8984c3b","updated":"2025-08-07 10:29:40.000000000","message":"Done","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3c141189eaca9f46a1031242b9fc82b1094115c0","unresolved":false,"context_lines":[{"line_number":2968,"context_line":"        mirror \u003d self.api.mirror_add(utils.get_rand_name(),"},{"line_number":2969,"context_line":"                                     const.MIRROR_TYPE_LPORT, 0, \u0027both\u0027,"},{"line_number":2970,"context_line":"                                     self.port_uuid).execute(check_error\u003dTrue)"},{"line_number":2971,"context_line":"        rule1 \u003d self._mirror_rule_add(mirror,)"},{"line_number":2972,"context_line":"        rule2 \u003d self._mirror_rule_add(mirror, match\u003d\u0027ip4\u0027)"},{"line_number":2973,"context_line":"        rule3 \u003d self._mirror_rule_add(mirror, priority\u003d2)"},{"line_number":2974,"context_line":"        for rule in [rule1, rule2, rule3]:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fe475a0c_6816e8e3","line":2971,"range":{"start_line":2971,"start_character":44,"end_line":2971,"end_character":45},"in_reply_to":"cd91d145_032b53a1","updated":"2025-08-04 15:36:50.000000000","message":"Done","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"}],"releasenotes/notes/ovn-mirror-rules-support-56a36a90c1fcaab3.yaml":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"3aa8619cf34f4811074c748d3f7261bb5fa7f920","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Support mirror rules and new mirror type \u0027lport\u0027. "},{"line_number":5,"context_line":"    It was added in https://github.com/ovn-org/ovn/commit/3dd8f36b85b3e648bc506839aa62e81b21c41e30"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"482afe8c_0f0d316d","line":4,"range":{"start_line":4,"start_character":53,"end_line":4,"end_character":54},"updated":"2025-05-26 09:43:02.000000000","message":"nit: please remove the useless whitespace","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"},{"author":{"_account_id":38024,"name":"Alexander Gnatyuk","display_name":"Alexander Gnatyuk","email":"agnatyuk@k2.cloud","username":"agnatyuk"},"change_message_id":"963c05d499e46554d2f8e3fad73343516db5485b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Support mirror rules and new mirror type \u0027lport\u0027. "},{"line_number":5,"context_line":"    It was added in https://github.com/ovn-org/ovn/commit/3dd8f36b85b3e648bc506839aa62e81b21c41e30"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"a52735c1_8d7392da","line":4,"range":{"start_line":4,"start_character":53,"end_line":4,"end_character":54},"in_reply_to":"482afe8c_0f0d316d","updated":"2025-08-07 10:29:40.000000000","message":"Done","commit_id":"bf52b1d7f9ab32660fdf66fed660afae8efcc6f2"}]}
