)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"1c022d98_8f18015e","updated":"2023-10-04 17:14:05.000000000","message":"Thanks for the patch! It looks really good. I went through and asked a lot of questions and pointed out some really nit-picky things just because I\u0027m trying to compile some good documentation on some ovsdbapp best practices and I can come back and reference some recent reviews to help compile that. I also wanted to document some of my process for adding new code and matching it up against the ctl commands, etc. So don\u0027t let the number of comments scare you. :) Most don\u0027t absolutely require any change. The -1 is mostly for needing to change the `uuid` arguments to `record` or something similar, some doc changes, and some other very minor things.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dac3bacc84c5df21e80b97d9484323775e6f7d31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c7a36c17_3a7085d1","updated":"2023-10-20 21:26:37.000000000","message":"some small issues, but otherwise looks good to me. thanks!","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d6f87437_2438b5f5","updated":"2023-11-16 17:56:11.000000000","message":"Thanks!","commit_id":"02a7b2b7a881e89ee2c1327ba2330f055e0ea4b3"}],"ovsdbapp/schema/ovn_northbound/api.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"f2abfe42_8cccc65f","line":1487,"range":{"start_line":1487,"start_character":45,"end_line":1487,"end_character":49},"updated":"2023-10-04 17:14:05.000000000","message":"(probably no action required)\n\nJust a question: what\u0027s our policy on shadowing built-in function names as arguments? `type()` isn\u0027t one I\u0027d ever really worry about (it\u0027s not like we\u0027re going to use it in the method), but just thought I\u0027d ask in case it broke some rule somewhere. I guess the same question goes for `filter`.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"138888a2_763ab322","line":1487,"range":{"start_line":1487,"start_character":51,"end_line":1487,"end_character":56},"updated":"2023-10-04 17:14:05.000000000","message":"(probably no action required)\n\nWith the above said, it may be difficult to match the api exactly. The manual shows `index` as optional (it can be omitted in the case that `type\u003dlocal`), and looking at the nbctl code, the value is used uninitialized in this case, which would make the value zero.\n\nWe could give `index` a default value of `0` and then do some checking for valid values in `MirrorAddCommand`, which would make us differ in the argument order from `ovn-nbctl`. Or just leave this as required and make people enter \"index\u003d0\" if they pass type\u003dlocal? I\u0027m assuming OVN will just ignore the value if `type` is `local`? I\u0027m leaning towards leaving handling of this as-is, but just thought I\u0027d ask you since you\u0027ve actually used this/thought about it. 😊","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"e1b4e0c9_183b2fab","line":1487,"range":{"start_line":1487,"start_character":39,"end_line":1487,"end_character":43},"updated":"2023-10-04 17:14:05.000000000","message":"`ovn-nbctl` manpage lists the format of the command as:\n\n`mirror-add name type [index] filter dest`\n\nwith `dest` of the format `{IP | MIRROR-ID}`. Do we need to support dest/the sink column as a `mirror-id` (the documentation below lists just an IP). It\u0027s just a string column, so nothing needs to be changed in the code, probably just a doc issue below.\n\nNormally for API methods that have a direct equivalent in one of the ctl utilities, we try to match the order of the arguments as exactly as possible to make it easy to use.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"2ad0b433_489dec70","line":1487,"range":{"start_line":1487,"start_character":51,"end_line":1487,"end_character":56},"in_reply_to":"138888a2_763ab322","updated":"2023-10-10 12:25:02.000000000","message":"thanks, I have seen that ovn added local as mirror target, and now as I checked it they added both as direction, so I have to check it, and perhaps better to use that option for OVN at least (though that is different what is in the spec)","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"73c0979b_766dd1a8","line":1487,"range":{"start_line":1487,"start_character":51,"end_line":1487,"end_character":56},"in_reply_to":"2ad0b433_489dec70","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"88b70e16_8d57eea1","line":1487,"range":{"start_line":1487,"start_character":39,"end_line":1487,"end_character":43},"in_reply_to":"737f9e04_6ceecaeb","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"aa66d681_18bba10e","line":1487,"range":{"start_line":1487,"start_character":45,"end_line":1487,"end_character":49},"in_reply_to":"abfc0720_e075f3bf","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"737f9e04_6ceecaeb","line":1487,"range":{"start_line":1487,"start_character":39,"end_line":1487,"end_character":43},"in_reply_to":"e1b4e0c9_183b2fab","updated":"2023-10-10 12:25:02.000000000","message":"thanks, I followed the param names in ovn-nb.ovsschema (https://github.com/ovn-org/ovn/blob/main/ovn-nb.ovsschema#L312-L329 ) but logical to follow the \"human interface\"","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1484,"context_line":"        \"\"\"Delete a Mirror\"\"\""},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    @abc.abstractmethod"},{"line_number":1487,"context_line":"    def mirror_add(self, name, filter, sink, type, index, external_ids\u003dNone,"},{"line_number":1488,"context_line":"                   may_exist\u003dFalse):"},{"line_number":1489,"context_line":"        \"\"\"Create a Mirror entry"},{"line_number":1490,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"abfc0720_e075f3bf","line":1487,"range":{"start_line":1487,"start_character":45,"end_line":1487,"end_character":49},"in_reply_to":"f2abfe42_8cccc65f","updated":"2023-10-10 12:25:02.000000000","message":"yes, it could be for example mirror_type, and destination_filter or similar to be on the safe side","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1497,"context_line":"        :type sink:     str"},{"line_number":1498,"context_line":"        :param type:    The type of the mirroring can be gre or erspan."},{"line_number":1499,"context_line":"        :type type:     str"},{"line_number":1500,"context_line":"        :param index:   The index....."},{"line_number":1501,"context_line":"        :type index:    int"},{"line_number":1502,"context_line":"        :param external_ids: Values to be added as external_id pairs."},{"line_number":1503,"context_line":"        :type external_ids:  Optional[Dict[str,str]]"}],"source_content_type":"text/x-python","patch_set":8,"id":"98f49da3_e022d639","line":1500,"range":{"start_line":1500,"start_character":33,"end_line":1500,"end_character":38},"updated":"2023-10-04 17:14:05.000000000","message":"extra characters","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":false,"context_lines":[{"line_number":1497,"context_line":"        :type sink:     str"},{"line_number":1498,"context_line":"        :param type:    The type of the mirroring can be gre or erspan."},{"line_number":1499,"context_line":"        :type type:     str"},{"line_number":1500,"context_line":"        :param index:   The index....."},{"line_number":1501,"context_line":"        :type index:    int"},{"line_number":1502,"context_line":"        :param external_ids: Values to be added as external_id pairs."},{"line_number":1503,"context_line":"        :type external_ids:  Optional[Dict[str,str]]"}],"source_content_type":"text/x-python","patch_set":8,"id":"e00fe5e2_fe68b04f","line":1500,"range":{"start_line":1500,"start_character":33,"end_line":1500,"end_character":38},"in_reply_to":"98f49da3_e022d639","updated":"2023-10-10 12:25:02.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"}],"ovsdbapp/schema/ovn_northbound/commands.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"    table \u003d \u0027BFD\u0027"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"class MirrorFindCommand(cmd.DbFindCommand):"},{"line_number":1141,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def __init__(self, api, name):"}],"source_content_type":"text/x-python","patch_set":8,"id":"83144cf4_fac77dd3","line":1140,"updated":"2023-10-04 17:14:05.000000000","message":"(no action needed) Just an FYI (since this kind of Command is very common in the codebase), this could also be done in the `impl_idl.py` `mirror_find()` by just returning the `DbFindCommand` with these values.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"    table \u003d \u0027BFD\u0027"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"class MirrorFindCommand(cmd.DbFindCommand):"},{"line_number":1141,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def __init__(self, api, name):"}],"source_content_type":"text/x-python","patch_set":8,"id":"777f3673_4095966b","line":1140,"in_reply_to":"83144cf4_fac77dd3","updated":"2023-10-10 12:25:02.000000000","message":"Good idea I removed the MirrorFindCommand and just return with cmd.DbFindCommand","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"                 external_ids\u003dNone, may_exist\u003dFalse):"},{"line_number":1158,"context_line":"        self.name \u003d name"},{"line_number":1159,"context_line":"        self.filter \u003d filter"},{"line_number":1160,"context_line":"        self.sink \u003d sink"},{"line_number":1161,"context_line":"        self.type \u003d type"},{"line_number":1162,"context_line":"        self.index \u003d index"},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"1dd04ced_50893429","line":1160,"updated":"2023-10-04 17:14:05.000000000","message":"We could do some checking/normalization of the IP address if `type !\u003d \"local\"` with `netaddr.IPAddress` like some of the other commands here do/`ovn-nbctl` does. Not required, but might be nice. (I *really* hate OVN\u0027s use of string fields for generic data.)","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1157,"context_line":"                 external_ids\u003dNone, may_exist\u003dFalse):"},{"line_number":1158,"context_line":"        self.name \u003d name"},{"line_number":1159,"context_line":"        self.filter \u003d filter"},{"line_number":1160,"context_line":"        self.sink \u003d sink"},{"line_number":1161,"context_line":"        self.type \u003d type"},{"line_number":1162,"context_line":"        self.index \u003d index"},{"line_number":1163,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"c70c90a6_60bcff7a","line":1160,"in_reply_to":"1dd04ced_50893429","updated":"2023-10-10 12:25:02.000000000","message":"good idea. I started this work when local was not in OVN, but anyway the ip normalization is a good idea","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1174,"context_line":"        self.may_exist \u003d may_exist"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    def run_idl(self, txn):"},{"line_number":1177,"context_line":"        cmd \u003d MirrorFindCommand(self.api, self.name)"},{"line_number":1178,"context_line":"        cmd.run_idl(txn)"},{"line_number":1179,"context_line":"        mirror_result \u003d cmd.result"},{"line_number":1180,"context_line":"        if mirror_result:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bb1919dd_9af307ec","line":1177,"updated":"2023-10-04 17:14:05.000000000","message":"this can just be:\n\n`mirror_result \u003d self.api.lookup(\u0027Mirror\u0027, self.name)`\n\nand both since `name` is indexed, there\u0027s no chance of duplicates or `lookup()` returning multiple values, which will simplify the code below. It does allows one to lookup by UUID as well, which OVN is not at all consistent on allowing (unlike OVS which always did), but it\u0027s pretty standard practice to use this in ovsdbapp apis.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        self.may_exist \u003d may_exist"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    def run_idl(self, txn):"},{"line_number":1177,"context_line":"        cmd \u003d MirrorFindCommand(self.api, self.name)"},{"line_number":1178,"context_line":"        cmd.run_idl(txn)"},{"line_number":1179,"context_line":"        mirror_result \u003d cmd.result"},{"line_number":1180,"context_line":"        if mirror_result:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fe0efd34_1619c4ad","line":1177,"in_reply_to":"bb1919dd_9af307ec","updated":"2023-10-10 12:25:02.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1215,"context_line":"class MirrorDelCommand(cmd.DbDestroyCommand):"},{"line_number":1216,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"    def __init__(self, api, uuid):"},{"line_number":1219,"context_line":"        super().__init__(api, self.table, uuid)"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"2ac27149_bb58d560","line":1218,"range":{"start_line":1218,"start_character":28,"end_line":1218,"end_character":32},"updated":"2023-10-04 17:14:05.000000000","message":"This should be something like `record` as `lookup()` is used to find the object, and it will look up by either uuid or indexed column (e.g. `name`). `ovn-nbctl` documents it as `name` . It also silently fails to delete the record when you use the uuid, which seems silly.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":false,"context_lines":[{"line_number":1215,"context_line":"class MirrorDelCommand(cmd.DbDestroyCommand):"},{"line_number":1216,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1217,"context_line":""},{"line_number":1218,"context_line":"    def __init__(self, api, uuid):"},{"line_number":1219,"context_line":"        super().__init__(api, self.table, uuid)"},{"line_number":1220,"context_line":""},{"line_number":1221,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9bf8760a_53546a62","line":1218,"range":{"start_line":1218,"start_character":28,"end_line":1218,"end_character":32},"in_reply_to":"2ac27149_bb58d560","updated":"2023-10-10 12:25:02.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"class LspAttachMirror(cmd.BaseCommand):"},{"line_number":1227,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1228,"context_line":"        super().__init__(api)"},{"line_number":1229,"context_line":"        self.port \u003d port"},{"line_number":1230,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"2e93f3cd_9cd172f1","line":1227,"updated":"2023-10-04 17:14:05.000000000","message":"(action not necessarily required)\n\nIt is undocumented, but `ovn-nbctl lsp-attach-mirror` actually accepts --may-exist (weirdly, `mirror-add` doesn\u0027t, but it\u0027s still useful) and fails on trying to add an existing rule otherwise.\n\nI leave it up to you if you want to add it since a) it isn\u0027t documented and b) it\u0027s a set-type column. ovsdb-server will ignore duplicates. It\u0027s really only useful if for some reason we wanted to fail if --may-exist wasn\u0027t passed, and I don\u0027t really think anyone would want to do that.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"class LspAttachMirror(cmd.BaseCommand):"},{"line_number":1227,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1228,"context_line":"        super().__init__(api)"},{"line_number":1229,"context_line":"        self.port \u003d port"},{"line_number":1230,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"c99a2d1b_56186bfc","line":1227,"in_reply_to":"204e2b9c_cf9f8f78","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1224,"context_line":""},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"class LspAttachMirror(cmd.BaseCommand):"},{"line_number":1227,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1228,"context_line":"        super().__init__(api)"},{"line_number":1229,"context_line":"        self.port \u003d port"},{"line_number":1230,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"204e2b9c_cf9f8f78","line":1227,"in_reply_to":"2e93f3cd_9cd172f1","updated":"2023-10-10 12:25:02.000000000","message":"Thanks, I added the may_exist","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"class LspDetachMirror(cmd.BaseCommand):"},{"line_number":1238,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1239,"context_line":"        super().__init__(api)"},{"line_number":1240,"context_line":"        self.port \u003d port"},{"line_number":1241,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"828c98e5_d8d796e7","line":1238,"updated":"2023-10-04 17:14:05.000000000","message":"(action not necessarily required)\n\nOddly and completely inconsistently, `ovn-nbctl lsp-detach-mirror` doesn\u0027t accept \u0027--if-exists` and it actually seems like it might be useful to not throw an error if two workers tried to delete the same mirror and you really only care that the mirror doesn\u0027t exist. I leave it up to you whether you think it is useful.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"class LspDetachMirror(cmd.BaseCommand):"},{"line_number":1238,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1239,"context_line":"        super().__init__(api)"},{"line_number":1240,"context_line":"        self.port \u003d port"},{"line_number":1241,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"bba7da9b_137f22a8","line":1238,"in_reply_to":"828c98e5_d8d796e7","updated":"2023-10-10 12:25:02.000000000","message":"I added the if_exist, I am not sure if it is really necessary, as lsp.delValue silently solves it.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"class LspDetachMirror(cmd.BaseCommand):"},{"line_number":1238,"context_line":"    def __init__(self, api, port, mirror):"},{"line_number":1239,"context_line":"        super().__init__(api)"},{"line_number":1240,"context_line":"        self.port \u003d port"},{"line_number":1241,"context_line":"        self.mirror \u003d mirror"}],"source_content_type":"text/x-python","patch_set":8,"id":"2b638f07_c906dc32","line":1238,"in_reply_to":"bba7da9b_137f22a8","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dac3bacc84c5df21e80b97d9484323775e6f7d31","unresolved":true,"context_lines":[{"line_number":1137,"context_line":"    table \u003d \u0027BFD\u0027"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"class MirrorFindCommand(cmd.DbFindCommand):"},{"line_number":1141,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def __init__(self, api, name):"}],"source_content_type":"text/x-python","patch_set":10,"id":"82eee294_23c7c900","line":1140,"updated":"2023-10-20 21:26:37.000000000","message":"leftover MirrorFindCommand","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1137,"context_line":"    table \u003d \u0027BFD\u0027"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"class MirrorFindCommand(cmd.DbFindCommand):"},{"line_number":1141,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def __init__(self, api, name):"}],"source_content_type":"text/x-python","patch_set":10,"id":"0d5c9900_2f9607e9","line":1140,"in_reply_to":"28194d01_2d2d9572","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"34940d2b9c2517847b5d7747926ddc7a539a62d8","unresolved":true,"context_lines":[{"line_number":1137,"context_line":"    table \u003d \u0027BFD\u0027"},{"line_number":1138,"context_line":""},{"line_number":1139,"context_line":""},{"line_number":1140,"context_line":"class MirrorFindCommand(cmd.DbFindCommand):"},{"line_number":1141,"context_line":"    table \u003d \u0027Mirror\u0027"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def __init__(self, api, name):"}],"source_content_type":"text/x-python","patch_set":10,"id":"28194d01_2d2d9572","line":1140,"in_reply_to":"82eee294_23c7c900","updated":"2023-10-31 15:27:18.000000000","message":"uhhh, thanks","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dac3bacc84c5df21e80b97d9484323775e6f7d31","unresolved":true,"context_lines":[{"line_number":1223,"context_line":"    def run_idl(self, txn):"},{"line_number":1224,"context_line":"        try:"},{"line_number":1225,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1226,"context_line":"            if lsp.mirror_rules and not self.may_exist:"},{"line_number":1227,"context_line":"                msg \u003d \"A Mirror Rule is already set on LSP %s\" % self.port"},{"line_number":1228,"context_line":"                raise RuntimeError(msg)"},{"line_number":1229,"context_line":"            lsp.addvalue(\u0027mirror_rules\u0027, self.mirror)"}],"source_content_type":"text/x-python","patch_set":10,"id":"85b4453b_9da670d1","line":1226,"updated":"2023-10-20 21:26:37.000000000","message":"`not self.may_exist` in this implementation requires mirror_rules to be empty to be able to add a rule. What it should be doing is failing if the mirror we are adding already exists. So `mirror \u003d lookup(\"Mirror\", self.mirror` and `if mirror in lsp.mirror_rules` etc.\n\nIt also requires the mirror argument to be a uuid or row, and the docs mention \u0027name\u0027. The above recommendation using `lookup()` will fix that too.","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1223,"context_line":"    def run_idl(self, txn):"},{"line_number":1224,"context_line":"        try:"},{"line_number":1225,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1226,"context_line":"            if lsp.mirror_rules and not self.may_exist:"},{"line_number":1227,"context_line":"                msg \u003d \"A Mirror Rule is already set on LSP %s\" % self.port"},{"line_number":1228,"context_line":"                raise RuntimeError(msg)"},{"line_number":1229,"context_line":"            lsp.addvalue(\u0027mirror_rules\u0027, self.mirror)"}],"source_content_type":"text/x-python","patch_set":10,"id":"273f230f_643256df","line":1226,"in_reply_to":"2728b65d_f8fc855b","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"34940d2b9c2517847b5d7747926ddc7a539a62d8","unresolved":true,"context_lines":[{"line_number":1223,"context_line":"    def run_idl(self, txn):"},{"line_number":1224,"context_line":"        try:"},{"line_number":1225,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1226,"context_line":"            if lsp.mirror_rules and not self.may_exist:"},{"line_number":1227,"context_line":"                msg \u003d \"A Mirror Rule is already set on LSP %s\" % self.port"},{"line_number":1228,"context_line":"                raise RuntimeError(msg)"},{"line_number":1229,"context_line":"            lsp.addvalue(\u0027mirror_rules\u0027, self.mirror)"}],"source_content_type":"text/x-python","patch_set":10,"id":"2728b65d_f8fc855b","line":1226,"in_reply_to":"85b4453b_9da670d1","updated":"2023-10-31 15:27:18.000000000","message":"thanks, done","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dac3bacc84c5df21e80b97d9484323775e6f7d31","unresolved":true,"context_lines":[{"line_number":1243,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1244,"context_line":"            rule_exists \u003d False"},{"line_number":1245,"context_line":"            for rule in lsp.mirror_rules:"},{"line_number":1246,"context_line":"                if self.mirror \u003d\u003d rule.uuid:"},{"line_number":1247,"context_line":"                    rule_exists \u003d True"},{"line_number":1248,"context_line":"            if not rule_exists and not self.if_exist:"},{"line_number":1249,"context_line":"                msg \u003d \"Mirror Rule %s doesn\u0027t exist on LSP %s\" % (self.mirror,"}],"source_content_type":"text/x-python","patch_set":10,"id":"8592fa7c_119a64e2","line":1246,"updated":"2023-10-20 21:26:37.000000000","message":"self.mirror is defined in the docs as \"the name of the mirror\". If that were the case, this would fail. Often it\u0027s name or uuid, in which case you could do something like:\n\n```\nmirror \u003d self.lookup(\"Mirror\", self.mirror)\n...\nif mirror in lsp.mirror_rules and not self.if_exist:\n```\nI think, because RowViews should be comparable to Rows (but verify that I\u0027m right there).","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"34940d2b9c2517847b5d7747926ddc7a539a62d8","unresolved":true,"context_lines":[{"line_number":1243,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1244,"context_line":"            rule_exists \u003d False"},{"line_number":1245,"context_line":"            for rule in lsp.mirror_rules:"},{"line_number":1246,"context_line":"                if self.mirror \u003d\u003d rule.uuid:"},{"line_number":1247,"context_line":"                    rule_exists \u003d True"},{"line_number":1248,"context_line":"            if not rule_exists and not self.if_exist:"},{"line_number":1249,"context_line":"                msg \u003d \"Mirror Rule %s doesn\u0027t exist on LSP %s\" % (self.mirror,"}],"source_content_type":"text/x-python","patch_set":10,"id":"c0398c35_eda5468e","line":1246,"in_reply_to":"8592fa7c_119a64e2","updated":"2023-10-31 15:27:18.000000000","message":"thanks, done","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4e690b795881d6cdbdf032ca8a3f02f97eb39e88","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"            lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.port)"},{"line_number":1244,"context_line":"            rule_exists \u003d False"},{"line_number":1245,"context_line":"            for rule in lsp.mirror_rules:"},{"line_number":1246,"context_line":"                if self.mirror \u003d\u003d rule.uuid:"},{"line_number":1247,"context_line":"                    rule_exists \u003d True"},{"line_number":1248,"context_line":"            if not rule_exists and not self.if_exist:"},{"line_number":1249,"context_line":"                msg \u003d \"Mirror Rule %s doesn\u0027t exist on LSP %s\" % (self.mirror,"}],"source_content_type":"text/x-python","patch_set":10,"id":"e245b894_77ff14ab","line":1246,"in_reply_to":"c0398c35_eda5468e","updated":"2023-11-16 17:56:11.000000000","message":"Done","commit_id":"225505202c77cfa9973442a078e3abdd7e95c8ef"}],"ovsdbapp/schema/ovn_northbound/impl_idl.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":433,"context_line":"    def bfd_get(self, uuid):"},{"line_number":434,"context_line":"        return cmd.BFDGetCommand(self, uuid)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def mirror_get(self, uuid):"},{"line_number":437,"context_line":"        return cmd.MirrorGetCommand(self, uuid)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def mirror_find(self, name):"},{"line_number":440,"context_line":"        return cmd.MirrorFindCommand(self, name\u003dname)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def mirror_del(self, uuid):"},{"line_number":443,"context_line":"        return cmd.MirrorDelCommand(self, uuid)"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5bd29ded_3f6fa21a","line":441,"range":{"start_line":436,"start_character":0,"end_line":441,"end_character":0},"updated":"2023-10-04 17:14:05.000000000","message":"Since `mirror_get()` calls `lookup()` it really looks up by name or uuid. And since `name` is an indexed column, this means `mirror_get()` and `mirror_find()` are really the same thing (though returning different types, `DbFindCommand(...,row\u003dTrue) and grabbing the first and only element would make it the same type). I\u0027d probably just drop mirror_find altogether.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0ddaf57a44609eda1668409b32f2a0cf6ca2c279","unresolved":true,"context_lines":[{"line_number":433,"context_line":"    def bfd_get(self, uuid):"},{"line_number":434,"context_line":"        return cmd.BFDGetCommand(self, uuid)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def mirror_get(self, uuid):"},{"line_number":437,"context_line":"        return cmd.MirrorGetCommand(self, uuid)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def mirror_find(self, name):"},{"line_number":440,"context_line":"        return cmd.MirrorFindCommand(self, name\u003dname)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def mirror_del(self, uuid):"},{"line_number":443,"context_line":"        return cmd.MirrorDelCommand(self, uuid)"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"77774b8a_be94139c","line":441,"range":{"start_line":436,"start_character":0,"end_line":441,"end_character":0},"in_reply_to":"5bd29ded_3f6fa21a","updated":"2023-10-10 12:25:02.000000000","message":"seems logical to remove the find command, and use get isntead","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"dac3bacc84c5df21e80b97d9484323775e6f7d31","unresolved":false,"context_lines":[{"line_number":433,"context_line":"    def bfd_get(self, uuid):"},{"line_number":434,"context_line":"        return cmd.BFDGetCommand(self, uuid)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def mirror_get(self, uuid):"},{"line_number":437,"context_line":"        return cmd.MirrorGetCommand(self, uuid)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def mirror_find(self, name):"},{"line_number":440,"context_line":"        return cmd.MirrorFindCommand(self, name\u003dname)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def mirror_del(self, uuid):"},{"line_number":443,"context_line":"        return cmd.MirrorDelCommand(self, uuid)"},{"line_number":444,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"e929f06e_0b181e10","line":441,"range":{"start_line":436,"start_character":0,"end_line":441,"end_character":0},"in_reply_to":"77774b8a_be94139c","updated":"2023-10-20 21:26:37.000000000","message":"Done","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"}],"ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"379bf7234f240abf3132dc5ff25901e0afae19c8","unresolved":true,"context_lines":[{"line_number":2631,"context_line":"        mir_rule \u003d self.api.lookup(\u0027Mirror\u0027, port.mirror_rules[0].uuid)"},{"line_number":2632,"context_line":"        self.assertEqual(mirror.uuid, mir_rule.uuid)"},{"line_number":2633,"context_line":""},{"line_number":2634,"context_line":"        self.api.lsp_detach_mirror("},{"line_number":2635,"context_line":"            self.port_uuid, mirror.uuid).execute(check_error\u003dTrue)"},{"line_number":2636,"context_line":"        port \u003d self.api.lsp_get(self.port_uuid).execute(check_error\u003dTrue)"},{"line_number":2637,"context_line":""},{"line_number":2638,"context_line":"        self.assertEqual(0, len(port.mirror_rules))"}],"source_content_type":"text/x-python","patch_set":4,"id":"15358c95_0f81a959","line":2638,"range":{"start_line":2634,"start_character":0,"end_line":2638,"end_character":51},"updated":"2023-08-04 15:18:01.000000000","message":"I am still missing here something, but let\u0027s have it for next week.....","commit_id":"97cdd77f06ef95ea94213b4a2d59d4c3f078b33d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"8aedc26b439d6be17518c00e4e4af6e2dcd191e0","unresolved":true,"context_lines":[{"line_number":2591,"context_line":"    def test_mirror_del(self):"},{"line_number":2592,"context_line":"        name \u003d utils.get_rand_name()"},{"line_number":2593,"context_line":"        mirror1 \u003d self._mirror_add(name\u003dname, sink\u003d\u002710.14.1.0\u0027)"},{"line_number":2594,"context_line":"        self.assertIn(mirror1.uuid, self.table.rows)"},{"line_number":2595,"context_line":"        self.api.mirror_del(mirror1.uuid).execute(check_error\u003dTrue)"},{"line_number":2596,"context_line":"        self.assertNotIn(mirror1.uuid, self.table.rows)"},{"line_number":2597,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"b220d519_44222331","line":2594,"updated":"2023-10-04 17:14:05.000000000","message":"(action not required) If I had been smarter 9 years ago, we wouldn\u0027t actually access the underlying `table.rows` outside of schema Command objects, so code could be re-used with other backends (granted, we don\u0027t have any others anymore, so it\u0027s just a theoretical issue). Instead, we\u0027d use the actual api commands and do something like `self.assertIn(mirror1, self.api.mirror_list().execute())` and ensure that actually worked with correct types, etc.","commit_id":"32245c5527fa7439b260c73ceb65acdff801f2f6"}]}
