)]}'
{"ovsdbapp/schema/ovn_northbound/commands.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"90d585893d2b4bb8a2643da95d42fa6ad3af0d3c","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        qoses_to_del \u003d []"},{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_c6740e6b","line":327,"range":{"start_line":327,"start_character":22,"end_line":327,"end_character":29},"updated":"2020-05-18 09:17:57.000000000","message":"If qos has no external_ids filled, it returns an empty list or an empty map?","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        qoses_to_del \u003d []"},{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_35c40ef5","line":327,"range":{"start_line":327,"start_character":22,"end_line":327,"end_character":29},"in_reply_to":"ff570b3c_c6740e6b","updated":"2020-05-18 13:25:02.000000000","message":"We have, by default, a dict. I\u0027ll remove the default value (same in L325)","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3a8e269a04f2a155e83266896b20591e0e2b2316","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_c738a1a1","line":328,"range":{"start_line":328,"start_character":15,"end_line":328,"end_character":43},"updated":"2020-05-15 20:15:28.000000000","message":"If the ext_id_key is missing, should this be skipped as opposed to throwing an exception?","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_00170647","line":328,"range":{"start_line":328,"start_character":15,"end_line":328,"end_character":43},"in_reply_to":"ff570b3c_66cee2b4","updated":"2020-05-18 13:25:02.000000000","message":"In next PS this search is more generic. If the external_ids are not present or the values don\u0027t match with the required ones, we just skip this register. By default we don\u0027t want to throw an exception.","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0ef879959c1869ae2ff6572e0574529aba7657ec","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_e91ac8c9","line":328,"range":{"start_line":328,"start_character":15,"end_line":328,"end_character":43},"in_reply_to":"ff570b3c_c738a1a1","updated":"2020-05-18 07:47:07.000000000","message":"Hmm, that shouldn\u0027t be possible that this key is not set if the QoS rule is valid one used for FIP. So I think we should be fine.","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"90d585893d2b4bb8a2643da95d42fa6ad3af0d3c","unresolved":false,"context_lines":[{"line_number":325,"context_line":"        qoses \u003d getattr(lswitch, \u0027qos_rules\u0027, [])"},{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_66cee2b4","line":328,"range":{"start_line":328,"start_character":15,"end_line":328,"end_character":43},"in_reply_to":"ff570b3c_e91ac8c9","updated":"2020-05-18 09:17:57.000000000","message":"I agree with Terry, we shouldn\u0027t assume bugless software :)","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"90d585893d2b4bb8a2643da95d42fa6ad3af0d3c","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_462f5e3e","line":329,"updated":"2020-05-18 09:17:57.000000000","message":"I think we should be able to do a list comprehension here, no?\n\n qoses_to_del \u003d [qos for qos in qoses\n                 if qos.external_ids.get(self.ext_id_key) \u003d\u003d self.fip_id]","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        for qos in qoses:"},{"line_number":327,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027, {})"},{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_b5749ed0","line":329,"in_reply_to":"ff570b3c_462f5e3e","updated":"2020-05-18 13:25:02.000000000","message":"I changed this search in next PS","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3a8e269a04f2a155e83266896b20591e0e2b2316","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"class LspAddCommand(cmd.AddCommand):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_674f1534","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":46},"updated":"2020-05-15 20:15:28.000000000","message":"Is there a reason not to just do these two lines at @L329 instead of going through a separate loop? If there is an exception or something, the transaction should be discarded.","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"class LspAddCommand(cmd.AddCommand):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_60008202","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":46},"in_reply_to":"ff570b3c_291160ad","updated":"2020-05-18 13:25:02.000000000","message":"Yes, I don\u0027t want to modify \"lswitch.qos_rules\" list while iterating over it. That\u0027s why I save the qos values to delete and the I remove them from lswitch.qos_rules (and delete the registers themselves)","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ba4dee24c8e499ba1044abf80c632587923f7db4","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"class LspAddCommand(cmd.AddCommand):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_10d91556","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":46},"in_reply_to":"ff570b3c_60008202","updated":"2020-05-18 15:29:47.000000000","message":"When you do things like lswitch.delvalue, you aren\u0027t actually modifying the lswitch as visible from anywhere else outside the transaction. Its really just building the list of operations that run when the transaction completes.","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0ef879959c1869ae2ff6572e0574529aba7657ec","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            if ext_ids.get(self.ext_id_key) \u003d\u003d self.fip_id:"},{"line_number":329,"context_line":"                qoses_to_del.append(qos)"},{"line_number":330,"context_line":"        for qos in qoses_to_del:"},{"line_number":331,"context_line":"            qos.delete()"},{"line_number":332,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"class LspAddCommand(cmd.AddCommand):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_291160ad","line":332,"range":{"start_line":331,"start_character":0,"end_line":332,"end_character":46},"in_reply_to":"ff570b3c_674f1534","updated":"2020-05-18 07:47:07.000000000","message":"++","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"36f0aa1a91c02fec79337dc58b0eacb74a183d6e","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":307,"context_line":"    def __init__(self, api, lswitch, if_exists\u003dFalse, **external_ids):"},{"line_number":308,"context_line":"        if not external_ids:"},{"line_number":309,"context_line":"            raise TypeError(\u0027Must specify at least one external ID key name \u0027"},{"line_number":310,"context_line":"                            \u0027and required value\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_c8f7d058","line":307,"range":{"start_line":307,"start_character":54,"end_line":307,"end_character":68},"updated":"2020-05-19 22:04:26.000000000","message":"I think this will be limited in use since it is fairly common to have hyphenated external_id key names, which won\u0027t work as argument names. We get away with it for doing **columns in places just because column names are defined in the rfc as:\n\n   \u003cid\u003e\n      A JSON string matching [a-zA-Z_][a-zA-Z0-9_]*. \u003cid\u003es that begin\n      with _ are reserved to the implementation and MUST NOT be used by\n      the user.\n\nso are guaranteed to be suitable argument names.","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e6ce69afe589d4c23c2fe0a6168fce7e6a02ca28","unresolved":false,"context_lines":[{"line_number":304,"context_line":""},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":307,"context_line":"    def __init__(self, api, lswitch, if_exists\u003dFalse, **external_ids):"},{"line_number":308,"context_line":"        if not external_ids:"},{"line_number":309,"context_line":"            raise TypeError(\u0027Must specify at least one external ID key name \u0027"},{"line_number":310,"context_line":"                            \u0027and required value\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_0ae9b2b5","line":307,"range":{"start_line":307,"start_character":54,"end_line":307,"end_character":68},"in_reply_to":"ff570b3c_c8f7d058","updated":"2020-05-20 10:36:15.000000000","message":"ups, now I realize that: something like \"what-a-name\" won\u0027t work.\n\nOk, because I want to make this as generic as possible and I want to add the possibility of using more than one single external_id, I\u0027ll add two lists: one for the keys and the other one for the values.","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"36f0aa1a91c02fec79337dc58b0eacb74a183d6e","unresolved":false,"context_lines":[{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        qoses_to_del \u003d []"},{"line_number":327,"context_line":"        external_ids_set \u003d set(self.external_ids.items())"},{"line_number":328,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":329,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":330,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":331,"context_line":"                qoses_to_del.append(qos)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_283acc97","line":328,"updated":"2020-05-19 22:04:26.000000000","message":"There\u0027s no reason not to use lswitch.qos_rules and qos.external_ids--especially w/o passing a default to getattr (but that isn\u0027t required since qos_rules and external_ids will always return the correct type, even if unset--it\u0027s really just the \u0027old\u0027 arg in UPDATE events where fields will possibly be missing)","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e6ce69afe589d4c23c2fe0a6168fce7e6a02ca28","unresolved":false,"context_lines":[{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        qoses_to_del \u003d []"},{"line_number":327,"context_line":"        external_ids_set \u003d set(self.external_ids.items())"},{"line_number":328,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":329,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":330,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":331,"context_line":"                qoses_to_del.append(qos)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_ea30bea1","line":328,"in_reply_to":"ff570b3c_283acc97","updated":"2020-05-20 10:36:15.000000000","message":"Understood! Good to learn this.","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"36f0aa1a91c02fec79337dc58b0eacb74a183d6e","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":329,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":330,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":331,"context_line":"                qoses_to_del.append(qos)"},{"line_number":332,"context_line":"        for qos in qoses_to_del:"},{"line_number":333,"context_line":"            qos.delete()"},{"line_number":334,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_a8589c87","line":331,"updated":"2020-05-19 22:04:26.000000000","message":"This qoses_to_del, then looping again shouldn\u0027t be necessary. You aren\u0027t actually modifying anything you are looping over when you call delvalue(): https://github.com/openvswitch/ovs/blob/8508a57228560e154963c542823d36d8098e6610/python/ovs/db/idl.py#L1108\n\nIt\u0027s just building up a list of mutations to transmit to the ovsdb-server.","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e6ce69afe589d4c23c2fe0a6168fce7e6a02ca28","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":329,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":330,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":331,"context_line":"                qoses_to_del.append(qos)"},{"line_number":332,"context_line":"        for qos in qoses_to_del:"},{"line_number":333,"context_line":"            qos.delete()"},{"line_number":334,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_2a5916fd","line":331,"in_reply_to":"ff570b3c_a8589c87","updated":"2020-05-20 10:36:15.000000000","message":"Ahhh I get it. Perfect then!","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":308,"context_line":"    def __init__(self, api, lswitch, ext_ids_keys, ext_ids_values,"},{"line_number":309,"context_line":"                 if_exists\u003dFalse):"},{"line_number":310,"context_line":"        if not (isinstance(ext_ids_keys, list) and"},{"line_number":311,"context_line":"                isinstance(ext_ids_values, list)):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_60e11f2b","line":308,"range":{"start_line":308,"start_character":36,"end_line":308,"end_character":65},"updated":"2020-06-09 19:19:54.000000000","message":"why wouldn\u0027t we just pass in a dictionary here instead of two lists? seems overly complicated to me.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":308,"context_line":"    def __init__(self, api, lswitch, ext_ids_keys, ext_ids_values,"},{"line_number":309,"context_line":"                 if_exists\u003dFalse):"},{"line_number":310,"context_line":"        if not (isinstance(ext_ids_keys, list) and"},{"line_number":311,"context_line":"                isinstance(ext_ids_values, list)):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_b899a77a","line":308,"range":{"start_line":308,"start_character":36,"end_line":308,"end_character":65},"in_reply_to":"ff570b3c_60e11f2b","updated":"2020-06-10 11:25:44.000000000","message":"Yeah, I don\u0027t know why I implemented this way...","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":307,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":308,"context_line":"    def __init__(self, api, lswitch, ext_ids_keys, ext_ids_values,"},{"line_number":309,"context_line":"                 if_exists\u003dFalse):"},{"line_number":310,"context_line":"        if not (isinstance(ext_ids_keys, list) and"},{"line_number":311,"context_line":"                isinstance(ext_ids_values, list)):"},{"line_number":312,"context_line":"            raise TypeError(\u0027\"ext_ids_keys\" and \"ext_ids_values\" must be \u0027"},{"line_number":313,"context_line":"                            \u0027lists\u0027)"},{"line_number":314,"context_line":"        if (not ext_ids_keys or not ext_ids_values or"},{"line_number":315,"context_line":"                len(ext_ids_keys) !\u003d len(ext_ids_values)):"},{"line_number":316,"context_line":"            raise TypeError(\u0027Must specify at least one external ID key name \u0027"},{"line_number":317,"context_line":"                            \u0027and required value and the number of keys must \u0027"},{"line_number":318,"context_line":"                            \u0027be the same as the number of expected values\u0027)"},{"line_number":319,"context_line":"        super(QoSDelExtIdCommand, self).__init__(api)"},{"line_number":320,"context_line":"        self.lswitch \u003d lswitch"},{"line_number":321,"context_line":"        self.ext_ids_keys \u003d ext_ids_keys"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_60c47f60","line":318,"range":{"start_line":310,"start_character":0,"end_line":318,"end_character":75},"updated":"2020-06-09 19:19:54.000000000","message":"Then we can get rid of all of this type checking stuff.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":307,"context_line":"class QoSDelExtIdCommand(cmd.BaseCommand):"},{"line_number":308,"context_line":"    def __init__(self, api, lswitch, ext_ids_keys, ext_ids_values,"},{"line_number":309,"context_line":"                 if_exists\u003dFalse):"},{"line_number":310,"context_line":"        if not (isinstance(ext_ids_keys, list) and"},{"line_number":311,"context_line":"                isinstance(ext_ids_values, list)):"},{"line_number":312,"context_line":"            raise TypeError(\u0027\"ext_ids_keys\" and \"ext_ids_values\" must be \u0027"},{"line_number":313,"context_line":"                            \u0027lists\u0027)"},{"line_number":314,"context_line":"        if (not ext_ids_keys or not ext_ids_values or"},{"line_number":315,"context_line":"                len(ext_ids_keys) !\u003d len(ext_ids_values)):"},{"line_number":316,"context_line":"            raise TypeError(\u0027Must specify at least one external ID key name \u0027"},{"line_number":317,"context_line":"                            \u0027and required value and the number of keys must \u0027"},{"line_number":318,"context_line":"                            \u0027be the same as the number of expected values\u0027)"},{"line_number":319,"context_line":"        super(QoSDelExtIdCommand, self).__init__(api)"},{"line_number":320,"context_line":"        self.lswitch \u003d lswitch"},{"line_number":321,"context_line":"        self.ext_ids_keys \u003d ext_ids_keys"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_5897ab3b","line":318,"range":{"start_line":310,"start_character":0,"end_line":318,"end_character":75},"in_reply_to":"ff570b3c_60c47f60","updated":"2020-06-10 11:25:44.000000000","message":"Sure","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            raise RuntimeError(msg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        qoses_to_del \u003d []"},{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_209d6757","line":337,"range":{"start_line":336,"start_character":8,"end_line":337,"end_character":74},"updated":"2020-06-09 19:19:54.000000000","message":"unnecessary with passing in a dict. just use items() which has set operations.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":333,"context_line":"            raise RuntimeError(msg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"        qoses_to_del \u003d []"},{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_7839cf3d","line":337,"range":{"start_line":336,"start_character":8,"end_line":337,"end_character":74},"in_reply_to":"ff570b3c_209d6757","updated":"2020-06-10 11:25:44.000000000","message":"Done","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        qoses_to_del \u003d []"},{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_a03977a4","line":338,"range":{"start_line":338,"start_character":19,"end_line":338,"end_character":48},"updated":"2020-06-09 19:19:54.000000000","message":"as per previous review, no reason to use getattr here instead of the more normal and readable lswitch.qos_rules","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        qoses_to_del \u003d []"},{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_d8f1fb97","line":338,"range":{"start_line":338,"start_character":19,"end_line":338,"end_character":48},"in_reply_to":"ff570b3c_a03977a4","updated":"2020-06-10 11:25:44.000000000","message":"You are right, sorry","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_00a9438f","line":339,"range":{"start_line":339,"start_character":12,"end_line":339,"end_character":50},"updated":"2020-06-09 19:19:54.000000000","message":"or here","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        external_ids_set \u003d set(itertools.zip_longest(self.ext_ids_keys,"},{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_b8eec7b1","line":339,"range":{"start_line":339,"start_character":12,"end_line":339,"end_character":50},"in_reply_to":"ff570b3c_00a9438f","updated":"2020-06-10 11:25:44.000000000","message":"Done","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"},{"line_number":343,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_201c4712","line":340,"range":{"start_line":340,"start_character":41,"end_line":340,"end_character":60},"updated":"2020-06-09 19:19:54.000000000","message":"items() already has set-like operations in py3.\n\nIf we just pass in the dictionary for the external_ids in the beginning, you can just do self.external_ids.items() \u003c\u003d ext_ids.items().","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":337,"context_line":"                                                     self.ext_ids_values))"},{"line_number":338,"context_line":"        for qos in getattr(lswitch, \u0027qos_rules\u0027):"},{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"},{"line_number":343,"context_line":"            qos.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_78838faa","line":340,"range":{"start_line":340,"start_character":41,"end_line":340,"end_character":60},"in_reply_to":"ff570b3c_201c4712","updated":"2020-06-10 11:25:44.000000000","message":"I didn\u0027t know that. I tested this in py2 and py3 and it\u0027s working. There is no py version limitation in openstack/requirements for this library and should be used with both versions in stable releases.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"987060d6ce5466a87dd9faac526c7bf3d792a7f2","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"},{"line_number":343,"context_line":"            qos.delete()"},{"line_number":344,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_c0b90bed","line":342,"range":{"start_line":342,"start_character":8,"end_line":342,"end_character":31},"updated":"2020-06-09 19:19:54.000000000","message":"As per previous review, just get rid of the qoses_to_del and do your operations in the main loop since they are just building a transaction, not modifying.\n\nEssentially, just passing in a dict instead of separate lists allows the Command to be as simple as:\n\n    class QoSDelExtIdCommand(cmd.BaseCommand):\n\tdef __init__(self, api, lswitch, external_ids, if_exists\u003dFalse):\n\t    super(QoSDelExtIdCommand, self).__init__(api)\n\t    self.lswitch \u003d lswitch\n\t    self.external_ids \u003d external_ids\n\t    self.if_exists \u003d if_exists\n\n\tdef run_idl(self, txn):\n\t    try:\n\t\tlswitch \u003d idlutils.row_by_value(self.api.idl, \u0027Logical_Switch\u0027,\n\t\t\t\t\t\t\u0027name\u0027, self.lswitch)\n\t    except idlutils.RowNotFound:\n\t\tif self.if_exists:\n\t\t    return\n\t\tmsg \u003d \u0027Logical Switch %s does not exist\u0027 % self.lswitch\n\t\traise RuntimeError(msg)\n\n\t    for qos in lswitch.qos_rules:\n\t\tif self.external_ids.items() \u003c\u003d qos.external_ids.items():\n\t\t    lswitch.delvalue(\u0027qos_rules\u0027, qos)\n\t\t    qos.delete()\n\n\nI played around with changing the impl_idl definition and the tests and the to just take a dict and the above appears to work.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4af414fb1c061f5705592d01041952b0a12ba6d1","unresolved":false,"context_lines":[{"line_number":339,"context_line":"            ext_ids \u003d getattr(qos, \u0027external_ids\u0027)"},{"line_number":340,"context_line":"            if external_ids_set.issubset(set(ext_ids.items())):"},{"line_number":341,"context_line":"                qoses_to_del.append(qos)"},{"line_number":342,"context_line":"        for qos in qoses_to_del:"},{"line_number":343,"context_line":"            qos.delete()"},{"line_number":344,"context_line":"            lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":345,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff570b3c_98af832a","line":342,"range":{"start_line":342,"start_character":8,"end_line":342,"end_character":31},"in_reply_to":"ff570b3c_c0b90bed","updated":"2020-06-10 11:25:44.000000000","message":"You are right, I\u0027ll remember this for the next time.","commit_id":"b56e65b8aa82107d2b4482db19a6b733529cd21f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"41095d4d2b364a0e7cd115954f453e75db6663e2","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            raise RuntimeError(msg)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for qos in lswitch.qos_rules:"},{"line_number":324,"context_line":"            if self.external_ids.items() \u003c\u003d qos.external_ids.items():"},{"line_number":325,"context_line":"                lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":326,"context_line":"                qos.delete()"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_d41398b7","line":324,"range":{"start_line":324,"start_character":15,"end_line":324,"end_character":68},"updated":"2020-06-16 10:15:22.000000000","message":"It seems this is not tested and always False:\n\n In [1]: a \u003d {1: 2, 3: 4}\n\n In [2]: b \u003d {5: 6}\n\n In [3]: c \u003d {7: 8, 9: 10, 11: 12}\n\n In [4]: a.keys()\n Out[4]: dict_keys([1, 3])\n\n In [5]: a.keys() \u003c b.keys()\n Out[5]: False\n\n In [6]: a.keys() \u003c c.keys()\n Out[6]: False\n\n In [7]: a.keys() \u003c\u003d c.keys()\n Out[7]: False\n\n In [8]: a.keys() \u003e c.keys()\n Out[8]: False","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5217827b04bffb7f9bb734c838a2395e7f599c89","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            raise RuntimeError(msg)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for qos in lswitch.qos_rules:"},{"line_number":324,"context_line":"            if self.external_ids.items() \u003c\u003d qos.external_ids.items():"},{"line_number":325,"context_line":"                lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":326,"context_line":"                qos.delete()"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_514cafc6","line":324,"in_reply_to":"bf51134e_3eb10a91","updated":"2020-06-16 18:56:57.000000000","message":"Actually, the FTs implemented are testing this, with different key/values in the QoS rules external_ids and the requested key/values","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"16adb018f4b927dd1d94718e884f268465c7efc7","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            raise RuntimeError(msg)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for qos in lswitch.qos_rules:"},{"line_number":324,"context_line":"            if self.external_ids.items() \u003c\u003d qos.external_ids.items():"},{"line_number":325,"context_line":"                lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":326,"context_line":"                qos.delete()"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_3eb10a91","line":324,"range":{"start_line":324,"start_character":15,"end_line":324,"end_character":68},"in_reply_to":"bf51134e_d41398b7","updated":"2020-06-16 18:02:59.000000000","message":"Hi Jakub. With the dictionaries you used those operations will be always false.\n\nBut if you use a dictionary and a subset of it, you can check that works. For example:\n  ext_ids \u003d {1:2, 3:4}\n  requested_ext_ids \u003d {3:4}\n  requested_ext_ids.items() \u003c\u003d ext_ids.items()\n  \u003e\u003e True\n\nI\u0027ll add some tests to check that.","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4cfeab7eaa9ccee0e7af188971f07a32eb9fc109","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            raise RuntimeError(msg)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for qos in lswitch.qos_rules:"},{"line_number":324,"context_line":"            if self.external_ids.items() \u003c\u003d qos.external_ids.items():"},{"line_number":325,"context_line":"                lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":326,"context_line":"                qos.delete()"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_beef761c","line":324,"updated":"2020-06-22 12:16:30.000000000","message":"Should we treat external_ids \u003d {} as non-matching?","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9f0088e7b0d58e90176c7bb3dbc06b85b55216a5","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            raise RuntimeError(msg)"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for qos in lswitch.qos_rules:"},{"line_number":324,"context_line":"            if self.external_ids.items() \u003c\u003d qos.external_ids.items():"},{"line_number":325,"context_line":"                lswitch.delvalue(\u0027qos_rules\u0027, qos)"},{"line_number":326,"context_line":"                qos.delete()"},{"line_number":327,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_6320a249","line":324,"in_reply_to":"bf51134e_beef761c","updated":"2020-06-22 16:32:39.000000000","message":"We talked in IRC and we agreed in raising an exception when external_ids\u003d{}. This is dangerous because you will match everything; that means you\u0027ll delete all QoS (something not expected when calling this method).","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"}],"ovsdbapp/tests/functional/schema/ovn_northbound/test_impl_idl.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                                   dscp\u003d11, external_ids\u003dext_ids_2)"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def test_qos_delete_floatingip_rules(self):"},{"line_number":330,"context_line":"       self._create_fip_qoses()"},{"line_number":331,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value1\u0027,"},{"line_number":332,"context_line":"                                            \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":333,"context_line":"       qos_rules \u003d self.api.qos_list("}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_681d480e","line":330,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    def test_qos_delete_floatingip_rules(self):"},{"line_number":330,"context_line":"       self._create_fip_qoses()"},{"line_number":331,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value1\u0027,"},{"line_number":332,"context_line":"                                            \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":333,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":334,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_c81c5414","line":331,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":330,"context_line":"       self._create_fip_qoses()"},{"line_number":331,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value1\u0027,"},{"line_number":332,"context_line":"                                            \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":333,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":334,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"       self.assertEqual(1, len(qos_rules))"},{"line_number":336,"context_line":"       self.assertIn(self.qos_2, qos_rules)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_a81760ed","line":333,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                                            \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":333,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":334,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"       self.assertEqual(1, len(qos_rules))"},{"line_number":336,"context_line":"       self.assertIn(self.qos_2, qos_rules)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value3\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_08d48c1f","line":335,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":333,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":334,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"       self.assertEqual(1, len(qos_rules))"},{"line_number":336,"context_line":"       self.assertIn(self.qos_2, qos_rules)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value3\u0027,"},{"line_number":339,"context_line":"                                            \u0027key3\u0027).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_e8d67827","line":336,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":335,"context_line":"       self.assertEqual(1, len(qos_rules))"},{"line_number":336,"context_line":"       self.assertIn(self.qos_2, qos_rules)"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value3\u0027,"},{"line_number":339,"context_line":"                                            \u0027key3\u0027).execute(check_error\u003dTrue)"},{"line_number":340,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":341,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_48de843f","line":338,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"       self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value3\u0027,"},{"line_number":339,"context_line":"                                            \u0027key3\u0027).execute(check_error\u003dTrue)"},{"line_number":340,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":341,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":342,"context_line":"       self.assertEqual(0, len(qos_rules))"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_28e190ff","line":340,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c08df8ea744da92b3dd10c1fd3018cceff39474","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                                            \u0027key3\u0027).execute(check_error\u003dTrue)"},{"line_number":340,"context_line":"       qos_rules \u003d self.api.qos_list("},{"line_number":341,"context_line":"           self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":342,"context_line":"       self.assertEqual(0, len(qos_rules))"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"    def test_qos_delete_floatingip_rules_no_key_no_value(self):"},{"line_number":345,"context_line":"        self._create_fip_qoses()"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff570b3c_88e7fc12","line":342,"updated":"2020-05-14 12:12:52.000000000","message":"pep8: E111 indentation is not a multiple of four","commit_id":"9b8655a43d7d0af69d55834df7e0da20720962de"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3a8e269a04f2a155e83266896b20591e0e2b2316","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":350,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value_z\u0027,"},{"line_number":353,"context_line":"                                             \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":354,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":355,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_27207d48","line":352,"updated":"2020-05-15 20:15:28.000000000","message":"Is there a situation where we would want to know that, even though the switch existed, there were no rules matching the key? If so, should if_exist apply to that? (I have no idea, and will defer to you)","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":349,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":350,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        self.api.qos_delete_floatingip_rules(self.switch.name, \u0027value_z\u0027,"},{"line_number":353,"context_line":"                                             \u0027key1\u0027).execute(check_error\u003dTrue)"},{"line_number":354,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":355,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_d58952ca","line":352,"in_reply_to":"ff570b3c_27207d48","updated":"2020-05-18 13:25:02.000000000","message":"In the new PS this is more generic. If we don\u0027t match the external_ids, we just skip those QoS","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"3a8e269a04f2a155e83266896b20591e0e2b2316","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":355,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":356,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":360,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_6716f5f3","line":357,"updated":"2020-05-15 20:15:28.000000000","message":"Would be good to have a test that exercises if_exist","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2ce263f9de12ecbe47e74849ec7c78bd4f766254","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":355,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":356,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":360,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff570b3c_75a16646","line":357,"in_reply_to":"ff570b3c_6716f5f3","updated":"2020-05-18 13:25:02.000000000","message":"Done","commit_id":"2ad39b2974f3a70316736e58c95a3bc0fc46cc3e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"49a3d1e16e1516d30b07f0d67870bc05de9f14f8","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.table \u003d self.api.tables[\u0027Logical_Switch\u0027]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _ls_add(self, *args, **kwargs):"},{"line_number":39,"context_line":"        fix \u003d self.useFixture(ovnnb_fixtures.LogicalSwitchFixture(self.api, *args,"},{"line_number":40,"context_line":"                                                                  **kwargs))"},{"line_number":41,"context_line":"        self.assertIn(fix.obj.uuid, self.table.rows)"},{"line_number":42,"context_line":"        return fix.obj"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_46b8f3e3","line":39,"updated":"2020-05-18 16:37:41.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"49a3d1e16e1516d30b07f0d67870bc05de9f14f8","unresolved":false,"context_lines":[{"line_number":937,"context_line":"class TestLogicalRouterPortOps(OvnNorthboundTest):"},{"line_number":938,"context_line":"    def setUp(self):"},{"line_number":939,"context_line":"        super(TestLogicalRouterPortOps, self).setUp()"},{"line_number":940,"context_line":"        self.lr \u003d self.useFixture(ovnnb_fixtures.LogicalRouterFixture(self.api)).obj"},{"line_number":941,"context_line":""},{"line_number":942,"context_line":"    def _lrp_add(self, port, mac\u003d\u0027de:ad:be:ef:4d:ad\u0027,"},{"line_number":943,"context_line":"                 networks\u003dNone, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_a6d0ef20","line":940,"updated":"2020-05-18 16:37:41.000000000","message":"pep8: E501 line too long (84 \u003e 79 characters)","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"49a3d1e16e1516d30b07f0d67870bc05de9f14f8","unresolved":false,"context_lines":[{"line_number":991,"context_line":"    def test_lrp_add_may_exist_different_router(self):"},{"line_number":992,"context_line":"        name \u003d utils.get_rand_device_name()"},{"line_number":993,"context_line":"        args \u003d (name, \u0027de:ad:be:ef:4d:ad\u0027, [\u0027192.0.2.0/24\u0027])"},{"line_number":994,"context_line":"        lr2 \u003d self.useFixture(ovnnb_fixtures.LogicalRouterFixture(self.api)).obj"},{"line_number":995,"context_line":"        self._lrp_add(*args)"},{"line_number":996,"context_line":"        cmd \u003d self.api.lrp_add(lr2.uuid, *args, may_exist\u003dTrue)"},{"line_number":997,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ff570b3c_86cdeb86","line":994,"updated":"2020-05-18 16:37:41.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"e9f7f3ee240d256818b4fac20b8cd80f62250c52"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a89e5a31e5d65f97a87e51c55b9e768fd5d364bb","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                                 {\u0027key1\u0027: \u0027value1\u0027}).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":336,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":337,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":338,"context_line":"        self.assertIn(self.qos_2, qos_rules)"},{"line_number":339,"context_line":"        self.assertIn(self.qos_3, qos_rules)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        self.api.qos_del_ext_ids("},{"line_number":342,"context_line":"            self.switch.name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_c302a7b4","line":339,"range":{"start_line":337,"start_character":0,"end_line":339,"end_character":44},"updated":"2020-06-17 12:49:35.000000000","message":"nit:\n\n self.assertCountEqual([self.qos_2, self.qos_3], qos_rules)","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7800e17f409bd80eb762ef3ace472d9d086247c7","unresolved":false,"context_lines":[{"line_number":334,"context_line":"                                 {\u0027key1\u0027: \u0027value1\u0027}).execute(check_error\u003dTrue)"},{"line_number":335,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":336,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":337,"context_line":"        self.assertEqual(2, len(qos_rules))"},{"line_number":338,"context_line":"        self.assertIn(self.qos_2, qos_rules)"},{"line_number":339,"context_line":"        self.assertIn(self.qos_3, qos_rules)"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        self.api.qos_del_ext_ids("},{"line_number":342,"context_line":"            self.switch.name,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_b5c6b048","line":339,"range":{"start_line":337,"start_character":0,"end_line":339,"end_character":44},"in_reply_to":"bf51134e_c302a7b4","updated":"2020-06-18 09:32:35.000000000","message":"I didn\u0027t know about this method (new in py3).","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"657996fe4a3bd9bb7df2fde2329b1277b3e2acee","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":368,"context_line":"        self.assertEqual(3, len(qos_rules))"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def test_qos_delete_external_ids_id_exists_false(self):"},{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_83cb8f51","line":370,"range":{"start_line":370,"start_character":38,"end_line":370,"end_character":39},"updated":"2020-06-17 12:51:04.000000000","message":"f","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7800e17f409bd80eb762ef3ace472d9d086247c7","unresolved":false,"context_lines":[{"line_number":367,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":368,"context_line":"        self.assertEqual(3, len(qos_rules))"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"    def test_qos_delete_external_ids_id_exists_false(self):"},{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_f5c0282d","line":370,"range":{"start_line":370,"start_character":38,"end_line":370,"end_character":39},"in_reply_to":"bf51134e_83cb8f51","updated":"2020-06-18 09:32:35.000000000","message":"Done","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a89e5a31e5d65f97a87e51c55b9e768fd5d364bb","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":377,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_e3936b4e","line":374,"updated":"2020-06-17 12:49:35.000000000","message":"I\u0027d add a test where we pass an empty dict, checking it removes all 3 qos_rules","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7800e17f409bd80eb762ef3ace472d9d086247c7","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":377,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_55c75413","line":374,"in_reply_to":"bf51134e_c3c5873e","updated":"2020-06-18 09:32:35.000000000","message":"Done","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"657996fe4a3bd9bb7df2fde2329b1277b3e2acee","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":377,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_c3c5873e","line":374,"in_reply_to":"bf51134e_e3936b4e","updated":"2020-06-17 12:51:04.000000000","message":"Also test on non-existing LS with if_exists\u003dTrue","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7800e17f409bd80eb762ef3ace472d9d086247c7","unresolved":false,"context_lines":[{"line_number":371,"context_line":"        cmd \u003d self.api.qos_del_ext_ids(\u0027wrong_ls_name\u0027,"},{"line_number":372,"context_line":"                                       {\u0027key1\u0027: \u0027value1\u0027}, if_exists\u003dFalse)"},{"line_number":373,"context_line":"        self.assertRaises(RuntimeError, cmd.execute, check_error\u003dTrue)"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"class TestLspOps(OvnNorthboundTest):"},{"line_number":377,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bf51134e_d53ec427","line":374,"in_reply_to":"bf51134e_e3936b4e","updated":"2020-06-18 09:32:35.000000000","message":"Nice test!\n\nThis is a dangerous but valid option. You can delete all qoses.","commit_id":"6d3274a07977e680943f440bcce9d9ab96fe7b6a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"442f37825348791f5cb6c39f192f114eba08c29e","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            {\u0027key3\u0027: \u0027value3\u0027, \u0027key4\u0027: \u0027value4\u0027}).execute(check_error\u003dTrue)"},{"line_number":342,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":343,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":344,"context_line":"        self.assertEqual(1, len(qos_rules))"},{"line_number":345,"context_line":"        self.assertIn(self.qos_3, qos_rules)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def test_qos_delete_external_ids_wrong_keys_or_values(self):"},{"line_number":348,"context_line":"        self._create_fip_qoses()"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_d8c55b90","line":345,"range":{"start_line":344,"start_character":0,"end_line":345,"end_character":44},"updated":"2020-06-18 09:59:30.000000000","message":"you could have used the assertCountEqual everywhere :)","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9f0088e7b0d58e90176c7bb3dbc06b85b55216a5","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            {\u0027key3\u0027: \u0027value3\u0027, \u0027key4\u0027: \u0027value4\u0027}).execute(check_error\u003dTrue)"},{"line_number":342,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":343,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":344,"context_line":"        self.assertEqual(1, len(qos_rules))"},{"line_number":345,"context_line":"        self.assertIn(self.qos_3, qos_rules)"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"    def test_qos_delete_external_ids_wrong_keys_or_values(self):"},{"line_number":348,"context_line":"        self._create_fip_qoses()"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_c319ae22","line":345,"range":{"start_line":344,"start_character":0,"end_line":345,"end_character":44},"in_reply_to":"bf51134e_d8c55b90","updated":"2020-06-22 16:32:39.000000000","message":"Done","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4cfeab7eaa9ccee0e7af188971f07a32eb9fc109","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            self.switch.name, {}).execute(check_error\u003dTrue)"},{"line_number":372,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":373,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":374,"context_line":"        self.assertEqual(0, len(qos_rules))"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def test_qos_delete_external_ids_if_exists(self):"},{"line_number":377,"context_line":"        self._create_fip_qoses()"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_5e99fac1","line":374,"updated":"2020-06-22 12:16:30.000000000","message":"While I realize that an empty set is a subset of every set, is the behavior we really want \"delete all if nothing is passed\" or would it be better to treat it as non-matching? It seems unlikely that we\u0027d want to delete all qos rules for all tenants if we somehow accidentally passed an empty dict.","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9f0088e7b0d58e90176c7bb3dbc06b85b55216a5","unresolved":false,"context_lines":[{"line_number":371,"context_line":"            self.switch.name, {}).execute(check_error\u003dTrue)"},{"line_number":372,"context_line":"        qos_rules \u003d self.api.qos_list("},{"line_number":373,"context_line":"            self.switch.uuid).execute(check_error\u003dTrue)"},{"line_number":374,"context_line":"        self.assertEqual(0, len(qos_rules))"},{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    def test_qos_delete_external_ids_if_exists(self):"},{"line_number":377,"context_line":"        self._create_fip_qoses()"}],"source_content_type":"text/x-python","patch_set":10,"id":"bf51134e_23e06afa","line":374,"in_reply_to":"bf51134e_5e99fac1","updated":"2020-06-22 16:32:39.000000000","message":"(commented in main method).","commit_id":"12aa519ce475c6bfa6ba48e2a4b4ee7c3af751c7"}]}
