)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c9e9a726d3c403bade4999ea7e7aa94b9c69cd0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2884add5_65d8b143","updated":"2021-11-18 18:12:56.000000000","message":"Looks pretty good, just a couple of small concerns (feel free to ignore the nit, it\u0027s just personal preference).","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e28bca18d0ae6947a5855f5a4a5d543128445b99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"639307bb_9e2372f7","updated":"2021-11-21 18:46:39.000000000","message":"Looks good to me. Thanks for the great patches!","commit_id":"641b6b857e29868ed25c02df554816e164bfaa53"},{"author":{"_account_id":33871,"name":"Anton Vazhnetsov","display_name":"Anton Vazhnetsov","email":"dragen15051@gmail.com","username":"0x5b"},"change_message_id":"31ab8f2e4500a75a4021e7bbe2ef9cfbcd90715d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"666bfe24_a5ffef19","in_reply_to":"639307bb_9e2372f7","updated":"2021-11-22 09:36:26.000000000","message":"Thanks for the review!","commit_id":"641b6b857e29868ed25c02df554816e164bfaa53"}],"ovsdbapp/schema/ovn_northbound/commands.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c9e9a726d3c403bade4999ea7e7aa94b9c69cd0c","unresolved":true,"context_lines":[{"line_number":217,"context_line":"class AddressSetAddCommand(cmd.AddCommand):"},{"line_number":218,"context_line":"    table_name \u003d \u0027Address_Set\u0027"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def __init__(self, api, name, addresses\u003dNone, may_exist\u003dFalse):"},{"line_number":221,"context_line":"        super().__init__(api)"},{"line_number":222,"context_line":"        self.name \u003d name"},{"line_number":223,"context_line":"        self.addresses \u003d [str(netaddr.IPAddress(address))"}],"source_content_type":"text/x-python","patch_set":1,"id":"8822ff52_169fdb80","line":220,"range":{"start_line":220,"start_character":44,"end_line":220,"end_character":48},"updated":"2021-11-18 18:12:56.000000000","message":"nit: It would be safe to default addresses\u003d(), since a tuple is immutable to avoid having to do addresses or [].","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ebf498360bfd5c5629b1427d5bbc3724422263e7","unresolved":false,"context_lines":[{"line_number":217,"context_line":"class AddressSetAddCommand(cmd.AddCommand):"},{"line_number":218,"context_line":"    table_name \u003d \u0027Address_Set\u0027"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def __init__(self, api, name, addresses\u003dNone, may_exist\u003dFalse):"},{"line_number":221,"context_line":"        super().__init__(api)"},{"line_number":222,"context_line":"        self.name \u003d name"},{"line_number":223,"context_line":"        self.addresses \u003d [str(netaddr.IPAddress(address))"}],"source_content_type":"text/x-python","patch_set":1,"id":"45e451f2_390709fc","line":220,"range":{"start_line":220,"start_character":44,"end_line":220,"end_character":48},"in_reply_to":"8822ff52_169fdb80","updated":"2021-12-02 18:33:31.000000000","message":"Done","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c9e9a726d3c403bade4999ea7e7aa94b9c69cd0c","unresolved":true,"context_lines":[{"line_number":276,"context_line":"    def __init__(self, api, address_set, addresses):"},{"line_number":277,"context_line":"        super().__init__(api)"},{"line_number":278,"context_line":"        self.address_set \u003d address_set"},{"line_number":279,"context_line":"        if not isinstance(addresses, list):"},{"line_number":280,"context_line":"            addresses \u003d [addresses]"},{"line_number":281,"context_line":"        self.addresses \u003d [str(netaddr.IPAddress(address))"},{"line_number":282,"context_line":"                          for address in addresses]"}],"source_content_type":"text/x-python","patch_set":1,"id":"8296e8f1_8c60235a","line":279,"range":{"start_line":279,"start_character":37,"end_line":279,"end_character":41},"updated":"2021-11-18 18:12:56.000000000","message":"In the case that maybe someone passed a tuple, we\u0027d end up with a list containing a tuple. I find python\u0027s lack of built-in \"it\u0027s an iterable, but it\u0027s not a string or bytes\" irritating, but maybe something like:\n\n if not(isinstance(collections.abc.Iterable) and not isinstance((str, bytes)):\n\nis what we need here? (which would make a good utils function). Or maybe just:\n\n if isinstance(addresses, (str, bytes)): addresses \u003d [addresses]?\n\nThoughts?","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ebf498360bfd5c5629b1427d5bbc3724422263e7","unresolved":false,"context_lines":[{"line_number":276,"context_line":"    def __init__(self, api, address_set, addresses):"},{"line_number":277,"context_line":"        super().__init__(api)"},{"line_number":278,"context_line":"        self.address_set \u003d address_set"},{"line_number":279,"context_line":"        if not isinstance(addresses, list):"},{"line_number":280,"context_line":"            addresses \u003d [addresses]"},{"line_number":281,"context_line":"        self.addresses \u003d [str(netaddr.IPAddress(address))"},{"line_number":282,"context_line":"                          for address in addresses]"}],"source_content_type":"text/x-python","patch_set":1,"id":"f14d602b_9523594f","line":279,"range":{"start_line":279,"start_character":37,"end_line":279,"end_character":41},"in_reply_to":"8296e8f1_8c60235a","updated":"2021-12-02 18:33:31.000000000","message":"Done","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c9e9a726d3c403bade4999ea7e7aa94b9c69cd0c","unresolved":true,"context_lines":[{"line_number":285,"context_line":"class AddressSetAddAddressesCommand(AddressSetUpdateAddressesCommand):"},{"line_number":286,"context_line":"    def run_idl(self, txn):"},{"line_number":287,"context_line":"        address_set \u003d self.api.lookup(self.table_name, self.address_set)"},{"line_number":288,"context_line":"        address_set.addresses \u003d list("},{"line_number":289,"context_line":"            set(address_set.addresses).union(self.addresses))"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ae2e1210_48fde1ad","line":288,"updated":"2021-11-18 18:12:56.000000000","message":"Instead of completely overwriting the list with the existing + appended values, I think you should be able to use Row.addvalue() to just send the mutations. Otherwise, this would need a Row.verify() call to ensure that the value hadn\u0027t been changed on the db before our \"append\" might actually overwrite existing data.","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ebf498360bfd5c5629b1427d5bbc3724422263e7","unresolved":false,"context_lines":[{"line_number":285,"context_line":"class AddressSetAddAddressesCommand(AddressSetUpdateAddressesCommand):"},{"line_number":286,"context_line":"    def run_idl(self, txn):"},{"line_number":287,"context_line":"        address_set \u003d self.api.lookup(self.table_name, self.address_set)"},{"line_number":288,"context_line":"        address_set.addresses \u003d list("},{"line_number":289,"context_line":"            set(address_set.addresses).union(self.addresses))"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"41ab0c5c_bee5a73d","line":288,"in_reply_to":"ae2e1210_48fde1ad","updated":"2021-12-02 18:33:31.000000000","message":"Done","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"c9e9a726d3c403bade4999ea7e7aa94b9c69cd0c","unresolved":true,"context_lines":[{"line_number":292,"context_line":"class AddressSetRemoveAddressCommand(AddressSetUpdateAddressesCommand):"},{"line_number":293,"context_line":"    def run_idl(self, txn):"},{"line_number":294,"context_line":"        address_set \u003d self.api.lookup(self.table_name, self.address_set)"},{"line_number":295,"context_line":"        address_set.addresses \u003d list("},{"line_number":296,"context_line":"            set(address_set.addresses).difference(self.addresses))"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"6ad44362_ea42a04c","line":295,"updated":"2021-11-18 18:12:56.000000000","message":"Similarly, Row.delvalue()","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"ebf498360bfd5c5629b1427d5bbc3724422263e7","unresolved":false,"context_lines":[{"line_number":292,"context_line":"class AddressSetRemoveAddressCommand(AddressSetUpdateAddressesCommand):"},{"line_number":293,"context_line":"    def run_idl(self, txn):"},{"line_number":294,"context_line":"        address_set \u003d self.api.lookup(self.table_name, self.address_set)"},{"line_number":295,"context_line":"        address_set.addresses \u003d list("},{"line_number":296,"context_line":"            set(address_set.addresses).difference(self.addresses))"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"da2f7d56_62358dff","line":295,"in_reply_to":"6ad44362_ea42a04c","updated":"2021-12-02 18:33:31.000000000","message":"Done","commit_id":"ced6f54cdecc26d2fa579af07fd99069c9b0e40d"}]}
