)]}'
{"networking_ovn/cmd/rebalance_gw_chassis.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                # lazy loading with IndexError(\u0027list index out of range\u0027,)"},{"line_number":45,"context_line":"                # Find out how to prevent that."},{"line_number":46,"context_line":"                chassis_name \u003d port.chassis[0].name"},{"line_number":47,"context_line":"            if chassis and not chassis \u003d\u003d chassis_name:"},{"line_number":48,"context_line":"                continue"},{"line_number":49,"context_line":"            provnet \u003d self.get_provider_net_name(port.logical_port)"},{"line_number":50,"context_line":"            cr_lrp_data \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_182de342","line":47,"range":{"start_line":47,"start_character":27,"end_line":47,"end_character":54},"updated":"2019-06-04 15:21:53.000000000","message":"chassis !\u003d chassis_name","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                # lazy loading with IndexError(\u0027list index out of range\u0027,)"},{"line_number":45,"context_line":"                # Find out how to prevent that."},{"line_number":46,"context_line":"                chassis_name \u003d port.chassis[0].name"},{"line_number":47,"context_line":"            if chassis and not chassis \u003d\u003d chassis_name:"},{"line_number":48,"context_line":"                continue"},{"line_number":49,"context_line":"            provnet \u003d self.get_provider_net_name(port.logical_port)"},{"line_number":50,"context_line":"            cr_lrp_data \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_23418a3a","line":47,"range":{"start_line":47,"start_character":27,"end_line":47,"end_character":54},"in_reply_to":"9fb8cfa7_182de342","updated":"2019-06-05 13:25:57.000000000","message":"done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            if chassis and not chassis \u003d\u003d chassis_name:"},{"line_number":48,"context_line":"                continue"},{"line_number":49,"context_line":"            provnet \u003d self.get_provider_net_name(port.logical_port)"},{"line_number":50,"context_line":"            cr_lrp_data \u003d {"},{"line_number":51,"context_line":"                \u0027uuid\u0027: port.uuid,"},{"line_number":52,"context_line":"                \u0027name\u0027: port.logical_port,"},{"line_number":53,"context_line":"                \u0027chassis_name\u0027: chassis_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_b84a9724","line":50,"range":{"start_line":50,"start_character":12,"end_line":50,"end_character":23},"updated":"2019-06-04 15:21:53.000000000","message":"Would be good to replace this with a named tuple to have a strict definition of the used structure.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            if chassis and not chassis \u003d\u003d chassis_name:"},{"line_number":48,"context_line":"                continue"},{"line_number":49,"context_line":"            provnet \u003d self.get_provider_net_name(port.logical_port)"},{"line_number":50,"context_line":"            cr_lrp_data \u003d {"},{"line_number":51,"context_line":"                \u0027uuid\u0027: port.uuid,"},{"line_number":52,"context_line":"                \u0027name\u0027: port.logical_port,"},{"line_number":53,"context_line":"                \u0027chassis_name\u0027: chassis_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_fe4305ae","line":50,"range":{"start_line":50,"start_character":12,"end_line":50,"end_character":23},"in_reply_to":"9fb8cfa7_b84a9724","updated":"2019-06-05 13:25:57.000000000","message":"Done :)","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            chassis_gw_ports[port.logical_port] \u003d cr_lrp_data"},{"line_number":58,"context_line":"        return chassis_gw_ports"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_chassis_with_master_ports(self, provnet\u003dNone, chassis\u003dNone):"},{"line_number":61,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_15a4ce56","line":60,"range":{"start_line":60,"start_character":51,"end_line":60,"end_character":56},"updated":"2019-06-04 15:21:53.000000000","message":"It looks like this is always used","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            chassis_gw_ports[port.logical_port] \u003d cr_lrp_data"},{"line_number":58,"context_line":"        return chassis_gw_ports"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_chassis_with_master_ports(self, provnet\u003dNone, chassis\u003dNone):"},{"line_number":61,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c3798e93","line":60,"range":{"start_line":60,"start_character":51,"end_line":60,"end_character":56},"in_reply_to":"9fb8cfa7_15a4ce56","updated":"2019-06-05 13:25:57.000000000","message":"yes, you\u0027re right, I removed the default value","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def get_chassis_with_master_ports(self, provnet\u003dNone, chassis\u003dNone):"},{"line_number":61,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"},{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_98ff93a9","line":63,"range":{"start_line":63,"start_character":18,"end_line":63,"end_character":29},"updated":"2019-06-04 15:21:53.000000000","message":"cr_lrp_data ?","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def get_chassis_with_master_ports(self, provnet\u003dNone, chassis\u003dNone):"},{"line_number":61,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"},{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_1e6a99b2","line":63,"range":{"start_line":63,"start_character":18,"end_line":63,"end_character":29},"in_reply_to":"9fb8cfa7_98ff93a9","updated":"2019-06-05 13:25:57.000000000","message":"renamed to cl_lrp","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"},{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"},{"line_number":67,"context_line":"            chassis_name \u003d cl_lrp_data.get(\u0027chassis_name\u0027)"},{"line_number":68,"context_line":"            # Filter out unwanted chassis"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d8f50bcd","line":65,"range":{"start_line":65,"start_character":53,"end_line":65,"end_character":58},"updated":"2019-06-04 15:21:53.000000000","message":"Provnet is always there so you can use cr_lrp_data[\u0027provnet\u0027]","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        found_chassis \u003d {}"},{"line_number":63,"context_line":"        for port, cl_lrp_data in master_ports.items():"},{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"},{"line_number":67,"context_line":"            chassis_name \u003d cl_lrp_data.get(\u0027chassis_name\u0027)"},{"line_number":68,"context_line":"            # Filter out unwanted chassis"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_2398aabe","line":65,"range":{"start_line":65,"start_character":53,"end_line":65,"end_character":58},"in_reply_to":"9fb8cfa7_d8f50bcd","updated":"2019-06-05 13:25:57.000000000","message":"done, thx","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"},{"line_number":67,"context_line":"            chassis_name \u003d cl_lrp_data.get(\u0027chassis_name\u0027)"},{"line_number":68,"context_line":"            # Filter out unwanted chassis"},{"line_number":69,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":70,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_382ea743","line":67,"range":{"start_line":67,"start_character":38,"end_line":67,"end_character":43},"updated":"2019-06-04 15:21:53.000000000","message":"ditto","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            # Filter out unwanted provnets"},{"line_number":65,"context_line":"            if provnet and provnet not in cl_lrp_data.get(\u0027provnet\u0027):"},{"line_number":66,"context_line":"                continue"},{"line_number":67,"context_line":"            chassis_name \u003d cl_lrp_data.get(\u0027chassis_name\u0027)"},{"line_number":68,"context_line":"            # Filter out unwanted chassis"},{"line_number":69,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":70,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_43935ea4","line":67,"range":{"start_line":67,"start_character":38,"end_line":67,"end_character":43},"in_reply_to":"9fb8cfa7_382ea743","updated":"2019-06-05 13:25:57.000000000","message":"done, thx","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            try:"},{"line_number":72,"context_line":"                cr_lrps_count \u003d ("},{"line_number":73,"context_line":"                    found_chassis.get(chassis_name)[\u0027cr_lrps_count\u0027] + 1)"},{"line_number":74,"context_line":"            except Exception:"},{"line_number":75,"context_line":"                cr_lrps_count \u003d 1"},{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                cr_lrps \u003d found_chassis.get(chassis_name)[\u0027cr_lrps\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f80ecfe3","line":74,"range":{"start_line":74,"start_character":19,"end_line":74,"end_character":28},"updated":"2019-06-04 15:21:53.000000000","message":"Perhaps remove the get in the line above and catch only KeyError here","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            try:"},{"line_number":72,"context_line":"                cr_lrps_count \u003d ("},{"line_number":73,"context_line":"                    found_chassis.get(chassis_name)[\u0027cr_lrps_count\u0027] + 1)"},{"line_number":74,"context_line":"            except Exception:"},{"line_number":75,"context_line":"                cr_lrps_count \u003d 1"},{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                cr_lrps \u003d found_chassis.get(chassis_name)[\u0027cr_lrps\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_e391329b","line":74,"range":{"start_line":74,"start_character":19,"end_line":74,"end_character":28},"in_reply_to":"9fb8cfa7_f80ecfe3","updated":"2019-06-05 13:25:57.000000000","message":"done, thx","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                cr_lrps \u003d found_chassis.get(chassis_name)[\u0027cr_lrps\u0027]"},{"line_number":78,"context_line":"                cr_lrps.append(cl_lrp_data)"},{"line_number":79,"context_line":"            except Exception:"},{"line_number":80,"context_line":"                cr_lrps \u003d [cl_lrp_data]"},{"line_number":81,"context_line":"            found_chassis.update({"},{"line_number":82,"context_line":"                chassis_name: {"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d8cc2b8b","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":28},"updated":"2019-06-04 15:21:53.000000000","message":"ditto","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            try:"},{"line_number":77,"context_line":"                cr_lrps \u003d found_chassis.get(chassis_name)[\u0027cr_lrps\u0027]"},{"line_number":78,"context_line":"                cr_lrps.append(cl_lrp_data)"},{"line_number":79,"context_line":"            except Exception:"},{"line_number":80,"context_line":"                cr_lrps \u003d [cl_lrp_data]"},{"line_number":81,"context_line":"            found_chassis.update({"},{"line_number":82,"context_line":"                chassis_name: {"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_038d667a","line":79,"range":{"start_line":79,"start_character":19,"end_line":79,"end_character":28},"in_reply_to":"9fb8cfa7_d8cc2b8b","updated":"2019-06-05 13:25:57.000000000","message":"done, thx","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def get_provider_net_name(self, cr_lrp):"},{"line_number":90,"context_line":"        # cr-lrp -\u003e lrp -\u003e lp -\u003e datapath_binding -\u003e providernet"},{"line_number":91,"context_line":"        lp_name \u003d re.sub(\u0027cr-lrp-\u0027, \u0027\u0027, cr_lrp)"},{"line_number":92,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":93,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":94,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_35beb265","line":91,"range":{"start_line":91,"start_character":18,"end_line":91,"end_character":47},"updated":"2019-06-04 15:21:53.000000000","message":"Can you use\n\n cr_lrp.replace(\u0027cr-lrp-\u0027, \u0027\u0027)\n\nas you actually don\u0027t use any regular expression.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def get_provider_net_name(self, cr_lrp):"},{"line_number":90,"context_line":"        # cr-lrp -\u003e lrp -\u003e lp -\u003e datapath_binding -\u003e providernet"},{"line_number":91,"context_line":"        lp_name \u003d re.sub(\u0027cr-lrp-\u0027, \u0027\u0027, cr_lrp)"},{"line_number":92,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":93,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":94,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_63f3020c","line":91,"range":{"start_line":91,"start_character":18,"end_line":91,"end_character":47},"in_reply_to":"9fb8cfa7_35beb265","updated":"2019-06-05 13:25:57.000000000","message":"yes, your right, done!","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            except KeyError:"},{"line_number":115,"context_line":"                # chassis has no cr_lrp bound"},{"line_number":116,"context_line":"                cr_lrp_count \u003d 0"},{"line_number":117,"context_line":"            candidates.append((candidate[0],"},{"line_number":118,"context_line":"                               candidate[1],"},{"line_number":119,"context_line":"                               cr_lrp_count))"},{"line_number":120,"context_line":"        return candidates"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_587efbe4","line":119,"range":{"start_line":117,"start_character":30,"end_line":119,"end_character":44},"updated":"2019-06-04 15:21:53.000000000","message":"A named tuple would make it more readable on L181","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"4cce787896875acdb4a8a0bc9320e54d78cc5104","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            except KeyError:"},{"line_number":115,"context_line":"                # chassis has no cr_lrp bound"},{"line_number":116,"context_line":"                cr_lrp_count \u003d 0"},{"line_number":117,"context_line":"            candidates.append((candidate[0],"},{"line_number":118,"context_line":"                               candidate[1],"},{"line_number":119,"context_line":"                               cr_lrp_count))"},{"line_number":120,"context_line":"        return candidates"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_64a54804","line":119,"range":{"start_line":117,"start_character":30,"end_line":119,"end_character":44},"in_reply_to":"9fb8cfa7_587efbe4","updated":"2019-06-05 14:20:16.000000000","message":"done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"},{"line_number":123,"context_line":"        found_chassis \u003d set()"},{"line_number":124,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":125,"context_line":"        for k, v in chassis_provnet_mappings.items():"},{"line_number":126,"context_line":"            if provnet in v:"},{"line_number":127,"context_line":"                found_chassis.add(k)"},{"line_number":128,"context_line":"        return found_chassis"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":131,"context_line":"        gw_ports \u003d self.get_all_master_ports()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d8d98b83","line":128,"range":{"start_line":125,"start_character":0,"end_line":128,"end_character":28},"updated":"2019-06-04 15:21:53.000000000","message":"found_chassis \u003d {chassis for chassis, networks in chassis_provnet_mappings.items() if provnet in networks}","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"},{"line_number":123,"context_line":"        found_chassis \u003d set()"},{"line_number":124,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":125,"context_line":"        for k, v in chassis_provnet_mappings.items():"},{"line_number":126,"context_line":"            if provnet in v:"},{"line_number":127,"context_line":"                found_chassis.add(k)"},{"line_number":128,"context_line":"        return found_chassis"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":131,"context_line":"        gw_ports \u003d self.get_all_master_ports()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_034b26b0","line":128,"range":{"start_line":125,"start_character":0,"end_line":128,"end_character":28},"in_reply_to":"9fb8cfa7_d8d98b83","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"723192557fca2f65c7a623f03b8c73d76e69128d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":131,"context_line":"        gw_ports \u003d self.get_all_master_ports()"},{"line_number":132,"context_line":"        found \u003d {}"},{"line_number":133,"context_line":"        for k, v in gw_ports.items():"},{"line_number":134,"context_line":"            if v.get(\u0027provnet\u0027) \u003d\u003d provnet:"},{"line_number":135,"context_line":"                found[k] \u003d v"},{"line_number":136,"context_line":"        return found"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f55b3a84","line":133,"updated":"2019-06-04 14:42:22.000000000","message":"I wish I could do list comprehension here.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":131,"context_line":"        gw_ports \u003d self.get_all_master_ports()"},{"line_number":132,"context_line":"        found \u003d {}"},{"line_number":133,"context_line":"        for k, v in gw_ports.items():"},{"line_number":134,"context_line":"            if v.get(\u0027provnet\u0027) \u003d\u003d provnet:"},{"line_number":135,"context_line":"                found[k] \u003d v"},{"line_number":136,"context_line":"        return found"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_3e0e7d32","line":133,"in_reply_to":"9fb8cfa7_b897f790","updated":"2019-06-05 13:25:57.000000000","message":"Done, thanks!","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":130,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":131,"context_line":"        gw_ports \u003d self.get_all_master_ports()"},{"line_number":132,"context_line":"        found \u003d {}"},{"line_number":133,"context_line":"        for k, v in gw_ports.items():"},{"line_number":134,"context_line":"            if v.get(\u0027provnet\u0027) \u003d\u003d provnet:"},{"line_number":135,"context_line":"                found[k] \u003d v"},{"line_number":136,"context_line":"        return found"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_b897f790","line":133,"in_reply_to":"9fb8cfa7_f55b3a84","updated":"2019-06-04 15:21:53.000000000","message":"you can do dict-comprehension:\n\n ports \u003d {port: cr_lrp for port, cr_lrp in gw_ports.items() if cr_lrp.get(\u0027provnet\u0027) \u003d\u003d provnet}","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        chassis_num \u003d len(self.get_all_chassis_with_provnet(provnet))"},{"line_number":140,"context_line":"        master_gw_num \u003d len(self.get_master_ports_with_provnet(provnet))"},{"line_number":141,"context_line":"        try:"},{"line_number":142,"context_line":"            return int(round(master_gw_num / chassis_num))"},{"line_number":143,"context_line":"        except Exception:"},{"line_number":144,"context_line":"            return 0"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_b8ae17e5","line":142,"range":{"start_line":142,"start_character":19,"end_line":142,"end_character":23},"updated":"2019-06-04 15:21:53.000000000","message":"You don\u0027t need this, round with a single parameter returns int","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"333d77e0a5422a53580293850ed3821ab50a7960","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        chassis_num \u003d len(self.get_all_chassis_with_provnet(provnet))"},{"line_number":140,"context_line":"        master_gw_num \u003d len(self.get_master_ports_with_provnet(provnet))"},{"line_number":141,"context_line":"        try:"},{"line_number":142,"context_line":"            return int(round(master_gw_num / chassis_num))"},{"line_number":143,"context_line":"        except Exception:"},{"line_number":144,"context_line":"            return 0"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_6db99ae7","line":142,"range":{"start_line":142,"start_character":19,"end_line":142,"end_character":23},"in_reply_to":"9fb8cfa7_63ab0289","updated":"2019-06-06 09:26:38.000000000","message":"Ah, you\u0027re right. Python 2 changes type to float despite in Python 2 the result of division is int: master_gw_num is int, chassis_num is int and int / int \u003d\u003d int. But the result from round() is float so you need the int there for python 2 compatibility.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        chassis_num \u003d len(self.get_all_chassis_with_provnet(provnet))"},{"line_number":140,"context_line":"        master_gw_num \u003d len(self.get_master_ports_with_provnet(provnet))"},{"line_number":141,"context_line":"        try:"},{"line_number":142,"context_line":"            return int(round(master_gw_num / chassis_num))"},{"line_number":143,"context_line":"        except Exception:"},{"line_number":144,"context_line":"            return 0"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_63ab0289","line":142,"range":{"start_line":142,"start_character":19,"end_line":142,"end_character":23},"in_reply_to":"9fb8cfa7_b8ae17e5","updated":"2019-06-05 13:25:57.000000000","message":"Hmm ok, For python2 it returns float with zero at the end so thats ok, changed","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def get_all_provnets(self):"},{"line_number":147,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":148,"context_line":"        provnets \u003d set([provnet"},{"line_number":149,"context_line":"                        for provnets in chassis_provnet_mappings.values()"},{"line_number":150,"context_line":"                        for provnet in provnets])"},{"line_number":151,"context_line":"        return provnets"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_189e4356","line":148,"range":{"start_line":148,"start_character":19,"end_line":148,"end_character":24},"updated":"2019-06-04 15:21:53.000000000","message":"{","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def get_all_provnets(self):"},{"line_number":147,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":148,"context_line":"        provnets \u003d set([provnet"},{"line_number":149,"context_line":"                        for provnets in chassis_provnet_mappings.values()"},{"line_number":150,"context_line":"                        for provnet in provnets])"},{"line_number":151,"context_line":"        return provnets"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_23dbcaed","line":148,"range":{"start_line":148,"start_character":19,"end_line":148,"end_character":24},"in_reply_to":"9fb8cfa7_189e4356","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":148,"context_line":"        provnets \u003d set([provnet"},{"line_number":149,"context_line":"                        for provnets in chassis_provnet_mappings.values()"},{"line_number":150,"context_line":"                        for provnet in provnets])"},{"line_number":151,"context_line":"        return provnets"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_78ac1f8c","line":150,"range":{"start_line":150,"start_character":47,"end_line":150,"end_character":49},"updated":"2019-06-04 15:21:53.000000000","message":"}","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":148,"context_line":"        provnets \u003d set([provnet"},{"line_number":149,"context_line":"                        for provnets in chassis_provnet_mappings.values()"},{"line_number":150,"context_line":"                        for provnet in provnets])"},{"line_number":151,"context_line":"        return provnets"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_1e13795e","line":150,"range":{"start_line":150,"start_character":47,"end_line":150,"end_character":49},"in_reply_to":"9fb8cfa7_78ac1f8c","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"},{"line_number":154,"context_line":"                             max_per_chassis):"},{"line_number":155,"context_line":"        if not chassis_to_rebalance:"},{"line_number":156,"context_line":"            return"},{"line_number":157,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":158,"context_line":"            for cr_lrp in data.get(\u0027cr_lrps\u0027):"},{"line_number":159,"context_line":"                if cr_lrp.get(\u0027provnet\u0027) !\u003d provnet:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_580b5b8d","line":156,"range":{"start_line":155,"start_character":0,"end_line":156,"end_character":18},"updated":"2019-06-04 15:21:53.000000000","message":"you don\u0027t need this, if it\u0027s an empty dict, it won\u0027t iterate on L157","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"},{"line_number":154,"context_line":"                             max_per_chassis):"},{"line_number":155,"context_line":"        if not chassis_to_rebalance:"},{"line_number":156,"context_line":"            return"},{"line_number":157,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":158,"context_line":"            for cr_lrp in data.get(\u0027cr_lrps\u0027):"},{"line_number":159,"context_line":"                if cr_lrp.get(\u0027provnet\u0027) !\u003d provnet:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a3957ae6","line":156,"range":{"start_line":155,"start_character":0,"end_line":156,"end_character":18},"in_reply_to":"9fb8cfa7_580b5b8d","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        if not chassis_to_rebalance:"},{"line_number":156,"context_line":"            return"},{"line_number":157,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":158,"context_line":"            for cr_lrp in data.get(\u0027cr_lrps\u0027):"},{"line_number":159,"context_line":"                if cr_lrp.get(\u0027provnet\u0027) !\u003d provnet:"},{"line_number":160,"context_line":"                    # gateway not related to balanced provnet"},{"line_number":161,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_98f0f392","line":158,"range":{"start_line":158,"start_character":15,"end_line":158,"end_character":45},"updated":"2019-06-04 15:21:53.000000000","message":"You\u0027d get an exception if data.get() returns None","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"4cce787896875acdb4a8a0bc9320e54d78cc5104","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        if not chassis_to_rebalance:"},{"line_number":156,"context_line":"            return"},{"line_number":157,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":158,"context_line":"            for cr_lrp in data.get(\u0027cr_lrps\u0027):"},{"line_number":159,"context_line":"                if cr_lrp.get(\u0027provnet\u0027) !\u003d provnet:"},{"line_number":160,"context_line":"                    # gateway not related to balanced provnet"},{"line_number":161,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_04c1ec2e","line":158,"range":{"start_line":158,"start_character":15,"end_line":158,"end_character":45},"in_reply_to":"9fb8cfa7_98f0f392","updated":"2019-06-05 14:20:16.000000000","message":"This should not happen because chassis without cr_lrps should be rebalanced, but anyway I added one if before it.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                actual_gateways \u003d self.get_chassis_with_master_ports("},{"line_number":166,"context_line":"                    provnet\u003dprovnet,"},{"line_number":167,"context_line":"                    chassis\u003dchassis)"},{"line_number":168,"context_line":"                count \u003d actual_gateways.get(chassis)[\u0027cr_lrps_count\u0027]"},{"line_number":169,"context_line":"                if count \u003c\u003d max_per_chassis:"},{"line_number":170,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced\", chassis)"},{"line_number":171,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_381467a0","line":168,"range":{"start_line":168,"start_character":40,"end_line":168,"end_character":52},"updated":"2019-06-04 15:21:53.000000000","message":"You\u0027d get an AttributeError if get() returns None","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"4cce787896875acdb4a8a0bc9320e54d78cc5104","unresolved":false,"context_lines":[{"line_number":165,"context_line":"                actual_gateways \u003d self.get_chassis_with_master_ports("},{"line_number":166,"context_line":"                    provnet\u003dprovnet,"},{"line_number":167,"context_line":"                    chassis\u003dchassis)"},{"line_number":168,"context_line":"                count \u003d actual_gateways.get(chassis)[\u0027cr_lrps_count\u0027]"},{"line_number":169,"context_line":"                if count \u003c\u003d max_per_chassis:"},{"line_number":170,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced\", chassis)"},{"line_number":171,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_24faf074","line":168,"range":{"start_line":168,"start_character":40,"end_line":168,"end_character":52},"in_reply_to":"9fb8cfa7_381467a0","updated":"2019-06-05 14:20:16.000000000","message":"Fixed, thanks!","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced\", chassis)"},{"line_number":171,"context_line":"                    break"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"                lrp \u003d re.sub(\u0027cr-\u0027, \u0027\u0027, cr_lrp.get(\u0027name\u0027))"},{"line_number":174,"context_line":"                candidates \u003d self.get_candidates_for_lrp(lrp, provnet)"},{"line_number":175,"context_line":"                if len(candidates) \u003c 2:"},{"line_number":176,"context_line":"                    LOG.warning(\"Can\u0027t rebalance %s due to lack of \""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_78217ffb","line":173,"range":{"start_line":173,"start_character":22,"end_line":173,"end_character":28},"updated":"2019-06-04 15:21:53.000000000","message":"cr_lrp[\u0027name\u0027].replace()","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced\", chassis)"},{"line_number":171,"context_line":"                    break"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"                lrp \u003d re.sub(\u0027cr-\u0027, \u0027\u0027, cr_lrp.get(\u0027name\u0027))"},{"line_number":174,"context_line":"                candidates \u003d self.get_candidates_for_lrp(lrp, provnet)"},{"line_number":175,"context_line":"                if len(candidates) \u003c 2:"},{"line_number":176,"context_line":"                    LOG.warning(\"Can\u0027t rebalance %s due to lack of \""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_e39292f6","line":173,"range":{"start_line":173,"start_character":22,"end_line":173,"end_character":28},"in_reply_to":"9fb8cfa7_78217ffb","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                can_names \u003d [can[0] for can in candidates]"},{"line_number":183,"context_line":"                # Move actual chassis to the end of the list"},{"line_number":184,"context_line":"                can_names.append(can_names.pop(can_names.index(chassis)))"},{"line_number":185,"context_line":"                with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":186,"context_line":"                    txn.add(self._nb_idl.update_lrouter_port("},{"line_number":187,"context_line":"                        lrp, gateway_chassis\u003dcan_names))"},{"line_number":188,"context_line":"                LOG.info(\"Gateway chassis for LRP: %(lrp)s has been modified. \""},{"line_number":189,"context_line":"                         \"Actual priority list: %(candidates)s\","},{"line_number":190,"context_line":"                         {\u0027lrp\u0027: lrp, \u0027candidates\u0027: can_names})"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f85b2f84","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":56},"updated":"2019-06-04 15:21:53.000000000","message":"Why can\u0027t we use execute() here when we insert a single command to the transaction?","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"4cce787896875acdb4a8a0bc9320e54d78cc5104","unresolved":false,"context_lines":[{"line_number":182,"context_line":"                can_names \u003d [can[0] for can in candidates]"},{"line_number":183,"context_line":"                # Move actual chassis to the end of the list"},{"line_number":184,"context_line":"                can_names.append(can_names.pop(can_names.index(chassis)))"},{"line_number":185,"context_line":"                with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":186,"context_line":"                    txn.add(self._nb_idl.update_lrouter_port("},{"line_number":187,"context_line":"                        lrp, gateway_chassis\u003dcan_names))"},{"line_number":188,"context_line":"                LOG.info(\"Gateway chassis for LRP: %(lrp)s has been modified. \""},{"line_number":189,"context_line":"                         \"Actual priority list: %(candidates)s\","},{"line_number":190,"context_line":"                         {\u0027lrp\u0027: lrp, \u0027candidates\u0027: can_names})"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_e4f058cc","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":56},"in_reply_to":"9fb8cfa7_f85b2f84","updated":"2019-06-05 14:20:16.000000000","message":"You\u0027re right. This context manager is not needed.","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e1127ba8ece02fa2b06ae9bce84d79112ccf8f2c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        }"},{"line_number":220,"context_line":"                    })"},{"line_number":221,"context_line":"                    LOG.info(\"AVG gateways per chassis in provider network: \""},{"line_number":222,"context_line":"                             \"%(provnet)s is %(avg)s. Chassis %(chassis)s \""},{"line_number":223,"context_line":"                             \"has %(count)s gateways in this provider \""},{"line_number":224,"context_line":"                             \"network and needs to be rebalanced.\","},{"line_number":225,"context_line":"                             {\u0027provnet\u0027: provnet,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_9847934c","line":222,"range":{"start_line":222,"start_character":51,"end_line":222,"end_character":52},"updated":"2019-06-04 15:21:53.000000000","message":"d","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"17ce6b30fb376dcba4694b290c951fa42505fabe","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                        }"},{"line_number":220,"context_line":"                    })"},{"line_number":221,"context_line":"                    LOG.info(\"AVG gateways per chassis in provider network: \""},{"line_number":222,"context_line":"                             \"%(provnet)s is %(avg)s. Chassis %(chassis)s \""},{"line_number":223,"context_line":"                             \"has %(count)s gateways in this provider \""},{"line_number":224,"context_line":"                             \"network and needs to be rebalanced.\","},{"line_number":225,"context_line":"                             {\u0027provnet\u0027: provnet,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a3f01a69","line":222,"range":{"start_line":222,"start_character":51,"end_line":222,"end_character":52},"in_reply_to":"9fb8cfa7_9847934c","updated":"2019-06-05 13:25:57.000000000","message":"Done","commit_id":"d65c8bfce812a9a1a7495a571f8f12034556d424"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"754f90719150f97b11bad0200dd7f768237cb115","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_all_master_ports(self, chassis\u003dNone):"},{"line_number":39,"context_line":"        chassis_gw_ports \u003d {}"},{"line_number":40,"context_line":"        cr_ports \u003d self._sb_idl.db_find_rows("},{"line_number":41,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":42,"context_line":"            (\u0027type\u0027, \u0027\u003d\u0027, \u0027chassisredirect\u0027)).execute(check_error\u003dTrue)"},{"line_number":43,"context_line":"        for port in cr_ports:"},{"line_number":44,"context_line":"            try:"},{"line_number":45,"context_line":"                chassis_name \u003d port.chassis[0].name"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_bee6d643","line":42,"range":{"start_line":40,"start_character":1,"end_line":42,"end_character":71},"updated":"2019-06-06 11:56:14.000000000","message":"Need to rewrite this. Its kind complicated to test it with functional tests. I\u0027ll base on LRPs data from NB db instead.","commit_id":"d5c18aa0953253fc3ad0ffbd562399ca398c37fb"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"10f83d8114bb5b2ab2d490cab2dee5204f5fc403","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                continue"},{"line_number":49,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            provnet \u003d self.get_provider_net_name(port.name)"},{"line_number":52,"context_line":"            lrp_data \u003d LRP(port.uuid, port.name,"},{"line_number":53,"context_line":"                           chassis_name, provnet)"},{"line_number":54,"context_line":"            # Construct chassis_name -\u003e master bind dict"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_6b70aea6","line":51,"range":{"start_line":51,"start_character":11,"end_line":51,"end_character":59},"updated":"2019-07-09 11:14:01.000000000","message":"Needs try-except block","commit_id":"969321f0cb0259db7917ef21f82d5b99d35e9dfa"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"10f83d8114bb5b2ab2d490cab2dee5204f5fc403","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def get_provider_net_name(self, lrp):"},{"line_number":88,"context_line":"        # lrp -\u003e lp -\u003e datapath_binding -\u003e LS-\u003e providernet"},{"line_number":89,"context_line":"        lp_name \u003d lrp.replace(\u0027lrp-\u0027, \u0027\u0027)"},{"line_number":90,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":91,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":92,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"},{"line_number":93,"context_line":"        datapath \u003d self._sb_idl.db_find_rows("}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_6b22eea6","line":90,"updated":"2019-07-09 11:14:01.000000000","message":"FIX: what if no lp found?","commit_id":"969321f0cb0259db7917ef21f82d5b99d35e9dfa"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"10f83d8114bb5b2ab2d490cab2dee5204f5fc403","unresolved":false,"context_lines":[{"line_number":92,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"},{"line_number":93,"context_line":"        datapath \u003d self._sb_idl.db_find_rows("},{"line_number":94,"context_line":"            \u0027Datapath_Binding\u0027,"},{"line_number":95,"context_line":"            (\u0027uuid\u0027, \u0027\u003d\u0027, lp[0].datapath.uuid)).execute(check_error\u003dTrue)"},{"line_number":96,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":97,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":98,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_2b3cf6c6","line":95,"range":{"start_line":95,"start_character":26,"end_line":95,"end_character":31},"updated":"2019-07-09 11:14:01.000000000","message":"this is potential IndexError generator","commit_id":"969321f0cb0259db7917ef21f82d5b99d35e9dfa"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"10f83d8114bb5b2ab2d490cab2dee5204f5fc403","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        datapath \u003d self._sb_idl.db_find_rows("},{"line_number":94,"context_line":"            \u0027Datapath_Binding\u0027,"},{"line_number":95,"context_line":"            (\u0027uuid\u0027, \u0027\u003d\u0027, lp[0].datapath.uuid)).execute(check_error\u003dTrue)"},{"line_number":96,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":97,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":98,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":99,"context_line":"            \u0027Logical_Switch_Port\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_0b31faec","line":96,"range":{"start_line":96,"start_character":30,"end_line":96,"end_character":33},"updated":"2019-07-09 11:14:01.000000000","message":"ditto","commit_id":"969321f0cb0259db7917ef21f82d5b99d35e9dfa"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"10f83d8114bb5b2ab2d490cab2dee5204f5fc403","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":99,"context_line":"            \u0027Logical_Switch_Port\u0027,"},{"line_number":100,"context_line":"            (\u0027name\u0027, \u0027\u003d\u0027, provnet_lsp_name)).execute(check_error\u003dTrue)"},{"line_number":101,"context_line":"        return provnet_lsp[0].options[\u0027network_name\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def get_candidates_for_lrp(self, lrp, provnet):"},{"line_number":104,"context_line":"        # Get candidates with priority"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_4b3cd2be","line":101,"range":{"start_line":101,"start_character":26,"end_line":101,"end_character":29},"updated":"2019-07-09 11:14:01.000000000","message":"ditto","commit_id":"969321f0cb0259db7917ef21f82d5b99d35e9dfa"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            try:"},{"line_number":52,"context_line":"                provnet \u003d self.get_provider_net_name(port.name)"},{"line_number":53,"context_line":"            except Exception:"},{"line_number":54,"context_line":"                provnet \u003d None"},{"line_number":55,"context_line":"            lrp_data \u003d LRP(port.uuid, port.name,"},{"line_number":56,"context_line":"                           chassis_name, provnet)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_a020c349","line":53,"updated":"2019-07-12 13:13:50.000000000","message":"Shall we log en error here? Or is it for some specific case. Because in case we lose connection to OVSDB, we won\u0027t know what happened as there will be RuntimeError caught and swallowed.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                continue"},{"line_number":51,"context_line":"            try:"},{"line_number":52,"context_line":"                provnet \u003d self.get_provider_net_name(port.name)"},{"line_number":53,"context_line":"            except Exception:"},{"line_number":54,"context_line":"                provnet \u003d None"},{"line_number":55,"context_line":"            lrp_data \u003d LRP(port.uuid, port.name,"},{"line_number":56,"context_line":"                           chassis_name, provnet)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_ba8f7dcb","line":53,"in_reply_to":"7faddb67_a020c349","updated":"2019-07-15 13:02:31.000000000","message":"Ah, yeah, This silent-catch is not the best idea.\nLemme add some logging here... Done :)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    try:"},{"line_number":280,"context_line":"        conn \u003d impl_idl_ovn.get_connection(impl_idl_ovn.OvsdbNbOvnIdl)"},{"line_number":281,"context_line":"        ovn_nb_api \u003d impl_idl_ovn.OvsdbNbOvnIdl(conn)"},{"line_number":282,"context_line":"    except RuntimeError:"},{"line_number":283,"context_line":"        LOG.error(\u0027Invalid ovn_nb_connection parameter provided.\u0027)"},{"line_number":284,"context_line":"        return"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    try:"},{"line_number":287,"context_line":"        sb_conn \u003d impl_idl_ovn.get_connection(impl_idl_ovn.OvsdbSbOvnIdl)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_fe829eff","line":284,"range":{"start_line":282,"start_character":0,"end_line":284,"end_character":14},"updated":"2019-07-17 14:03:17.000000000","message":"I don\u0027t think we should return None here if we can\u0027t connect to the database as it\u0027s later passed to the ChassisRebalancer and it will cause AttributeErrors whenever trying to talk to the DB.\n\nI think better is to let it bubble up to the main() function and exit if we can\u0027t connect, as there is no point in running the script when we don\u0027t have connection to the database.","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":279,"context_line":"    try:"},{"line_number":280,"context_line":"        conn \u003d impl_idl_ovn.get_connection(impl_idl_ovn.OvsdbNbOvnIdl)"},{"line_number":281,"context_line":"        ovn_nb_api \u003d impl_idl_ovn.OvsdbNbOvnIdl(conn)"},{"line_number":282,"context_line":"    except RuntimeError:"},{"line_number":283,"context_line":"        LOG.error(\u0027Invalid ovn_nb_connection parameter provided.\u0027)"},{"line_number":284,"context_line":"        return"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    try:"},{"line_number":287,"context_line":"        sb_conn \u003d impl_idl_ovn.get_connection(impl_idl_ovn.OvsdbSbOvnIdl)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_27349792","line":284,"range":{"start_line":282,"start_character":0,"end_line":284,"end_character":14},"in_reply_to":"7faddb67_fe829eff","updated":"2019-07-18 12:14:30.000000000","message":"You\u0027re right. It makes no sense to continue in that case. I\u0027m dropping those try-except blocks.","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"d61a857272768fae9a8d55398f6598845cc01351","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def get_chassis_with_master_ports(self, provnet, chassis\u003dNone):"},{"line_number":65,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":66,"context_line":"        found_chassis \u003d {}"},{"line_number":67,"context_line":"        for port, cl_lrp in master_ports.items():"},{"line_number":68,"context_line":"            # Filter out unwanted provnets"},{"line_number":69,"context_line":"            if provnet !\u003d cl_lrp.provnet:"},{"line_number":70,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_34b65540","line":67,"range":{"start_line":67,"start_character":18,"end_line":67,"end_character":24},"updated":"2019-09-24 11:09:42.000000000","message":"TODO(mjozefcz): fix this stupid human error in next PS :)","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":64,"context_line":"    def get_chassis_with_master_ports(self, provnet, chassis\u003dNone):"},{"line_number":65,"context_line":"        master_ports \u003d self.get_all_master_ports()"},{"line_number":66,"context_line":"        found_chassis \u003d {}"},{"line_number":67,"context_line":"        for port, cl_lrp in master_ports.items():"},{"line_number":68,"context_line":"            # Filter out unwanted provnets"},{"line_number":69,"context_line":"            if provnet !\u003d cl_lrp.provnet:"},{"line_number":70,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_0d1dd961","line":67,"range":{"start_line":67,"start_character":18,"end_line":67,"end_character":24},"in_reply_to":"3fa7e38b_34b65540","updated":"2019-11-26 15:26:40.000000000","message":"Done.","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            # Filter out unwanted chassis"},{"line_number":73,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                cr_lrps_count \u003d ("},{"line_number":77,"context_line":"                    found_chassis[chassis_name][\u0027cr_lrps_count\u0027] + 1)"},{"line_number":78,"context_line":"            except KeyError:"},{"line_number":79,"context_line":"                cr_lrps_count \u003d 1"},{"line_number":80,"context_line":"            try:"},{"line_number":81,"context_line":"                cr_lrps \u003d found_chassis[chassis_name][\u0027cr_lrps\u0027]"},{"line_number":82,"context_line":"                cr_lrps.append(cl_lrp)"},{"line_number":83,"context_line":"            except KeyError:"},{"line_number":84,"context_line":"                cr_lrps \u003d [cl_lrp]"},{"line_number":85,"context_line":"            found_chassis.update({"},{"line_number":86,"context_line":"                chassis_name: {"},{"line_number":87,"context_line":"                    \u0027cr_lrps_count\u0027: cr_lrps_count,"},{"line_number":88,"context_line":"                    \u0027cr_lrps\u0027: cr_lrps"},{"line_number":89,"context_line":"                }"},{"line_number":90,"context_line":"            })"},{"line_number":91,"context_line":"        return found_chassis"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_d4434112","line":90,"range":{"start_line":75,"start_character":0,"end_line":90,"end_character":14},"updated":"2019-09-24 11:41:08.000000000","message":"Can we just do:\n\n found_chassis \u003d collections.defaultdict(lambda: {\u0027cr_lrps_count\u0027: 0, \u0027cr_lrps\u0027: []})\n for ...\n     ...\n     found_chassis[chassis_name][\u0027cr_lrps_count\u0027] +\u003d 1\n     found_chassis[chassis_name][\u0027cr_lrps\u0027].append(cl_lrp)\n\nalso isn\u0027t cr_lrps_count redundant to cr_lrps? len(cr_lrps) \u003d\u003d cr_lrps_count, no?","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            # Filter out unwanted chassis"},{"line_number":73,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                cr_lrps_count \u003d ("},{"line_number":77,"context_line":"                    found_chassis[chassis_name][\u0027cr_lrps_count\u0027] + 1)"},{"line_number":78,"context_line":"            except KeyError:"},{"line_number":79,"context_line":"                cr_lrps_count \u003d 1"},{"line_number":80,"context_line":"            try:"},{"line_number":81,"context_line":"                cr_lrps \u003d found_chassis[chassis_name][\u0027cr_lrps\u0027]"},{"line_number":82,"context_line":"                cr_lrps.append(cl_lrp)"},{"line_number":83,"context_line":"            except KeyError:"},{"line_number":84,"context_line":"                cr_lrps \u003d [cl_lrp]"},{"line_number":85,"context_line":"            found_chassis.update({"},{"line_number":86,"context_line":"                chassis_name: {"},{"line_number":87,"context_line":"                    \u0027cr_lrps_count\u0027: cr_lrps_count,"},{"line_number":88,"context_line":"                    \u0027cr_lrps\u0027: cr_lrps"},{"line_number":89,"context_line":"                }"},{"line_number":90,"context_line":"            })"},{"line_number":91,"context_line":"        return found_chassis"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_6df00d68","line":90,"range":{"start_line":75,"start_character":0,"end_line":90,"end_character":14},"in_reply_to":"3fa7e38b_748a8dbf","updated":"2019-11-26 15:26:40.000000000","message":"done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a5a04090a24a64e9481fa4c91d9f3ca0441e22f9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            # Filter out unwanted chassis"},{"line_number":73,"context_line":"            if chassis and chassis !\u003d chassis_name:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                cr_lrps_count \u003d ("},{"line_number":77,"context_line":"                    found_chassis[chassis_name][\u0027cr_lrps_count\u0027] + 1)"},{"line_number":78,"context_line":"            except KeyError:"},{"line_number":79,"context_line":"                cr_lrps_count \u003d 1"},{"line_number":80,"context_line":"            try:"},{"line_number":81,"context_line":"                cr_lrps \u003d found_chassis[chassis_name][\u0027cr_lrps\u0027]"},{"line_number":82,"context_line":"                cr_lrps.append(cl_lrp)"},{"line_number":83,"context_line":"            except KeyError:"},{"line_number":84,"context_line":"                cr_lrps \u003d [cl_lrp]"},{"line_number":85,"context_line":"            found_chassis.update({"},{"line_number":86,"context_line":"                chassis_name: {"},{"line_number":87,"context_line":"                    \u0027cr_lrps_count\u0027: cr_lrps_count,"},{"line_number":88,"context_line":"                    \u0027cr_lrps\u0027: cr_lrps"},{"line_number":89,"context_line":"                }"},{"line_number":90,"context_line":"            })"},{"line_number":91,"context_line":"        return found_chassis"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_748a8dbf","line":90,"range":{"start_line":75,"start_character":0,"end_line":90,"end_character":14},"in_reply_to":"3fa7e38b_d4434112","updated":"2019-09-24 11:54:43.000000000","message":"I think the best here would be:\n\n chassis_cr_lrps \u003d collections.defaultdict(list)\n for ...\n     ...\n     chassis_cr_lrps[chassis_name].append(cr_lrp)\n\nand where we need cr_lrps_count call\n\n len(chassis_cr_lrps[chassis_name])","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"},{"line_number":94,"context_line":"        # lrp -\u003e lp -\u003e datapath_binding -\u003e LS -\u003e providernet"},{"line_number":95,"context_line":"        lp_name \u003d lrp.replace(\u0027lrp-\u0027, \u0027\u0027)"},{"line_number":96,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":97,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":98,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_b40c85ec","line":95,"range":{"start_line":95,"start_character":18,"end_line":95,"end_character":41},"updated":"2019-09-24 11:41:08.000000000","message":"nit: lrp[4:] is probably faster and safer if you want to just remove the prefix","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"},{"line_number":94,"context_line":"        # lrp -\u003e lp -\u003e datapath_binding -\u003e LS -\u003e providernet"},{"line_number":95,"context_line":"        lp_name \u003d lrp.replace(\u0027lrp-\u0027, \u0027\u0027)"},{"line_number":96,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":97,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":98,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_0d795981","line":95,"range":{"start_line":95,"start_character":18,"end_line":95,"end_character":41},"in_reply_to":"3fa7e38b_b40c85ec","updated":"2019-11-26 15:26:40.000000000","message":"right! done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"},{"line_number":94,"context_line":"        # lrp -\u003e lp -\u003e datapath_binding -\u003e LS -\u003e providernet"},{"line_number":95,"context_line":"        lp_name \u003d lrp.replace(\u0027lrp-\u0027, \u0027\u0027)"},{"line_number":96,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":97,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":98,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"},{"line_number":99,"context_line":"        if not lp:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_7475ad63","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":10},"updated":"2019-09-24 11:41:08.000000000","message":"shouldn\u0027t this be \u0027pb\u0027 ?","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def get_provider_net_name(self, lrp):"},{"line_number":94,"context_line":"        # lrp -\u003e lp -\u003e datapath_binding -\u003e LS -\u003e providernet"},{"line_number":95,"context_line":"        lp_name \u003d lrp.replace(\u0027lrp-\u0027, \u0027\u0027)"},{"line_number":96,"context_line":"        lp \u003d self._sb_idl.db_find_rows("},{"line_number":97,"context_line":"            \u0027Port_Binding\u0027,"},{"line_number":98,"context_line":"            (\u0027logical_port\u0027, \u0027\u003d\u0027, lp_name)).execute(check_error\u003dTrue)"},{"line_number":99,"context_line":"        if not lp:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_2da53504","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":10},"in_reply_to":"3fa7e38b_7475ad63","updated":"2019-11-26 15:26:40.000000000","message":"Jakub has right as always :) done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if not datapath:"},{"line_number":106,"context_line":"            return"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":109,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":110,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":111,"context_line":"            \u0027Logical_Switch_Port\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_340095ab","line":108,"range":{"start_line":108,"start_character":54,"end_line":108,"end_character":78},"updated":"2019-09-24 11:41:08.000000000","message":"nit: ditto as L95","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        if not datapath:"},{"line_number":106,"context_line":"            return"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":109,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":110,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":111,"context_line":"            \u0027Logical_Switch_Port\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_8de1c92e","line":108,"range":{"start_line":108,"start_character":54,"end_line":108,"end_character":78},"in_reply_to":"3fa7e38b_340095ab","updated":"2019-11-26 15:26:40.000000000","message":"done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            return"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":109,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":110,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":111,"context_line":"            \u0027Logical_Switch_Port\u0027,"},{"line_number":112,"context_line":"            (\u0027name\u0027, \u0027\u003d\u0027, provnet_lsp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_b425655e","line":109,"range":{"start_line":109,"start_character":27,"end_line":109,"end_character":61},"updated":"2019-09-24 11:41:08.000000000","message":"nit: \u0027provnet-%s\u0027  % neutron_net","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            return"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        neutron_net \u003d datapath[0].external_ids[\u0027name\u0027].replace(\u0027neutron-\u0027, \u0027\u0027)"},{"line_number":109,"context_line":"        provnet_lsp_name \u003d \u0027%s-%s\u0027 % (\u0027provnet\u0027, neutron_net)"},{"line_number":110,"context_line":"        provnet_lsp \u003d self._nb_idl.db_find_rows("},{"line_number":111,"context_line":"            \u0027Logical_Switch_Port\u0027,"},{"line_number":112,"context_line":"            (\u0027name\u0027, \u0027\u003d\u0027, provnet_lsp_name)).execute(check_error\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_edbddd03","line":109,"range":{"start_line":109,"start_character":27,"end_line":109,"end_character":61},"in_reply_to":"3fa7e38b_b425655e","updated":"2019-11-26 15:26:40.000000000","message":"yea :) done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"},{"line_number":142,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":143,"context_line":"        return {chassis"},{"line_number":144,"context_line":"                for chassis, networks in chassis_provnet_mappings.items()"},{"line_number":145,"context_line":"                if provnet in networks}"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":148,"context_line":"        gw_ports \u003d self.get_all_master_ports()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_b4a8058c","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":39},"updated":"2019-09-24 11:41:08.000000000","message":"Looks like you are always interested only in count of items in the result, so perhaps better would be\n\n return sum(provnet in network for network in chassis_provent_mappings.values())","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def get_all_chassis_with_provnet(self, provnet):"},{"line_number":142,"context_line":"        chassis_provnet_mappings \u003d self._sb_idl.get_chassis_and_physnets()"},{"line_number":143,"context_line":"        return {chassis"},{"line_number":144,"context_line":"                for chassis, networks in chassis_provnet_mappings.items()"},{"line_number":145,"context_line":"                if provnet in networks}"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":148,"context_line":"        gw_ports \u003d self.get_all_master_ports()"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_6d4c8d9d","line":145,"range":{"start_line":143,"start_character":0,"end_line":145,"end_character":39},"in_reply_to":"3fa7e38b_b4a8058c","updated":"2019-11-26 15:26:40.000000000","message":"ok, done, but used len instead, sum","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":148,"context_line":"        gw_ports \u003d self.get_all_master_ports()"},{"line_number":149,"context_line":"        return {port: cr_lrp"},{"line_number":150,"context_line":"                for port, cr_lrp in gw_ports.items()"},{"line_number":151,"context_line":"                if cr_lrp.provnet \u003d\u003d provnet}"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def get_avg_per_provnet(self, provnet):"},{"line_number":154,"context_line":"        chassis_num \u003d len(self.get_all_chassis_with_provnet(provnet))"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_349c1569","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":45},"updated":"2019-09-24 11:41:08.000000000","message":"Same as L145:\n\n return sum(cr_lrp.provnet \u003d\u003d provnet for cr_lrp in gw_ports.values())","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def get_master_ports_with_provnet(self, provnet):"},{"line_number":148,"context_line":"        gw_ports \u003d self.get_all_master_ports()"},{"line_number":149,"context_line":"        return {port: cr_lrp"},{"line_number":150,"context_line":"                for port, cr_lrp in gw_ports.items()"},{"line_number":151,"context_line":"                if cr_lrp.provnet \u003d\u003d provnet}"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def get_avg_per_provnet(self, provnet):"},{"line_number":154,"context_line":"        chassis_num \u003d len(self.get_all_chassis_with_provnet(provnet))"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_4d47517c","line":151,"range":{"start_line":149,"start_character":0,"end_line":151,"end_character":45},"in_reply_to":"3fa7e38b_349c1569","updated":"2019-11-26 15:26:40.000000000","message":"it will not work, sum doesn\u0027t work with booleans, I used len","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"},{"line_number":168,"context_line":"                             avg_per_chassis):"},{"line_number":169,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":170,"context_line":"            if not data.get(\u0027cr_lrps\u0027):"},{"line_number":171,"context_line":"                LOG.warning(\"Chassis %s couldn\u0027t be rebalanced because \""},{"line_number":172,"context_line":"                            \"doesn\u0027t have gateway ports attached.\","},{"line_number":173,"context_line":"                            chassis)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_34c3b53a","line":170,"range":{"start_line":170,"start_character":23,"end_line":170,"end_character":28},"updated":"2019-09-24 11:41:08.000000000","message":"nit: cr_lrps will always be there","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    def rebalance_gw_chassis(self, chassis_to_rebalance, provnet,"},{"line_number":168,"context_line":"                             avg_per_chassis):"},{"line_number":169,"context_line":"        for chassis, data in chassis_to_rebalance.items():"},{"line_number":170,"context_line":"            if not data.get(\u0027cr_lrps\u0027):"},{"line_number":171,"context_line":"                LOG.warning(\"Chassis %s couldn\u0027t be rebalanced because \""},{"line_number":172,"context_line":"                            \"doesn\u0027t have gateway ports attached.\","},{"line_number":173,"context_line":"                            chassis)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_2d41b50b","line":170,"range":{"start_line":170,"start_character":23,"end_line":170,"end_character":28},"in_reply_to":"3fa7e38b_34c3b53a","updated":"2019-11-26 15:26:40.000000000","message":"Done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced.\", chassis)"},{"line_number":190,"context_line":"                    break"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"                lrp \u003d cr_lrp.name.replace(\u0027cr-\u0027, \u0027\u0027)"},{"line_number":193,"context_line":"                candidates \u003d self.get_candidates_for_lrp(lrp, provnet)"},{"line_number":194,"context_line":"                if len(candidates) \u003c 2:"},{"line_number":195,"context_line":"                    LOG.warning(\"Can\u0027t rebalance %s due to lack of \""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_b4e485e1","line":192,"range":{"start_line":192,"start_character":33,"end_line":192,"end_character":52},"updated":"2019-09-24 11:41:08.000000000","message":"nit: ditto about prefix removal","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    LOG.info(\"Chassis %s has been rebalanced.\", chassis)"},{"line_number":190,"context_line":"                    break"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"                lrp \u003d cr_lrp.name.replace(\u0027cr-\u0027, \u0027\u0027)"},{"line_number":193,"context_line":"                candidates \u003d self.get_candidates_for_lrp(lrp, provnet)"},{"line_number":194,"context_line":"                if len(candidates) \u003c 2:"},{"line_number":195,"context_line":"                    LOG.warning(\"Can\u0027t rebalance %s due to lack of \""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_cd458118","line":192,"range":{"start_line":192,"start_character":33,"end_line":192,"end_character":52},"in_reply_to":"3fa7e38b_b4e485e1","updated":"2019-11-26 15:26:40.000000000","message":"Done!","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                else:"},{"line_number":214,"context_line":"                    can_names \u003d [can.chassis_name for can in candidates]"},{"line_number":215,"context_line":"                    # Add actual chassis at the end of candidates"},{"line_number":216,"context_line":"                    can_names +\u003d [chassis]"},{"line_number":217,"context_line":"                    try:"},{"line_number":218,"context_line":"                        (self._nb_idl.update_lrouter_port("},{"line_number":219,"context_line":"                            lrp, gateway_chassis\u003dcan_names)."}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_94cf0955","line":216,"range":{"start_line":216,"start_character":20,"end_line":216,"end_character":42},"updated":"2019-09-24 11:41:08.000000000","message":"can_names.append(chassis)","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":213,"context_line":"                else:"},{"line_number":214,"context_line":"                    can_names \u003d [can.chassis_name for can in candidates]"},{"line_number":215,"context_line":"                    # Add actual chassis at the end of candidates"},{"line_number":216,"context_line":"                    can_names +\u003d [chassis]"},{"line_number":217,"context_line":"                    try:"},{"line_number":218,"context_line":"                        (self._nb_idl.update_lrouter_port("},{"line_number":219,"context_line":"                            lrp, gateway_chassis\u003dcan_names)."}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_8d4f8934","line":216,"range":{"start_line":216,"start_character":20,"end_line":216,"end_character":42},"in_reply_to":"3fa7e38b_94cf0955","updated":"2019-11-26 15:26:40.000000000","message":"done, lol I dunno why I did it this way. TooMuchCoffeeException perhaps","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                    # Add actual chassis at the end of candidates"},{"line_number":216,"context_line":"                    can_names +\u003d [chassis]"},{"line_number":217,"context_line":"                    try:"},{"line_number":218,"context_line":"                        (self._nb_idl.update_lrouter_port("},{"line_number":219,"context_line":"                            lrp, gateway_chassis\u003dcan_names)."},{"line_number":220,"context_line":"                            execute(check_error\u003dTrue))"},{"line_number":221,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_74d28d02","line":218,"range":{"start_line":218,"start_character":24,"end_line":218,"end_character":25},"updated":"2019-09-24 11:41:08.000000000","message":"nit: paren not needed","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":215,"context_line":"                    # Add actual chassis at the end of candidates"},{"line_number":216,"context_line":"                    can_names +\u003d [chassis]"},{"line_number":217,"context_line":"                    try:"},{"line_number":218,"context_line":"                        (self._nb_idl.update_lrouter_port("},{"line_number":219,"context_line":"                            lrp, gateway_chassis\u003dcan_names)."},{"line_number":220,"context_line":"                            execute(check_error\u003dTrue))"},{"line_number":221,"context_line":"                    except Exception:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_4d299138","line":218,"range":{"start_line":218,"start_character":24,"end_line":218,"end_character":25},"in_reply_to":"3fa7e38b_74d28d02","updated":"2019-11-26 15:26:40.000000000","message":"I need because at the end I do .execute() on it.","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                    except Exception:"},{"line_number":222,"context_line":"                        LOG.error(\"Failed to update lrp: %(lrp)s with new \""},{"line_number":223,"context_line":"                                  \"gateway list %(gateways)s\","},{"line_number":224,"context_line":"                                  {\u0027lrp\u0027: lrp, \u0027gateways\u0027: can_names})"},{"line_number":225,"context_line":"                        continue"},{"line_number":226,"context_line":"                    LOG.info(\"Gateway chassis for LRP: %(lrp)s has been \""},{"line_number":227,"context_line":"                             \"modified. Actual priority list: %(candidates)s.\","}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_34d8951c","line":224,"updated":"2019-09-24 11:41:08.000000000","message":"Would be good to log the exception content here for troubleshooting purposes","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":221,"context_line":"                    except Exception:"},{"line_number":222,"context_line":"                        LOG.error(\"Failed to update lrp: %(lrp)s with new \""},{"line_number":223,"context_line":"                                  \"gateway list %(gateways)s\","},{"line_number":224,"context_line":"                                  {\u0027lrp\u0027: lrp, \u0027gateways\u0027: can_names})"},{"line_number":225,"context_line":"                        continue"},{"line_number":226,"context_line":"                    LOG.info(\"Gateway chassis for LRP: %(lrp)s has been \""},{"line_number":227,"context_line":"                             \"modified. Actual priority list: %(candidates)s.\","}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_ad136501","line":224,"in_reply_to":"3fa7e38b_34d8951c","updated":"2019-11-26 15:26:40.000000000","message":"Done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"            chassis_to_rebalance \u003d {}"},{"line_number":255,"context_line":"            for chassis, data in gw_chassis.items():"},{"line_number":256,"context_line":"                if data.get(\u0027cr_lrps_count\u0027) \u003e avg_per_chassis:"},{"line_number":257,"context_line":"                    chassis_to_rebalance.update({"},{"line_number":258,"context_line":"                        chassis: {"},{"line_number":259,"context_line":"                            \u0027cr_lrps\u0027: data.get(\u0027cr_lrps\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_5472f14a","line":256,"range":{"start_line":256,"start_character":23,"end_line":256,"end_character":28},"updated":"2019-09-24 11:41:08.000000000","message":"nit: you don\u0027t need get() as cr_lrps_count is always there","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"            chassis_to_rebalance \u003d {}"},{"line_number":255,"context_line":"            for chassis, data in gw_chassis.items():"},{"line_number":256,"context_line":"                if data.get(\u0027cr_lrps_count\u0027) \u003e avg_per_chassis:"},{"line_number":257,"context_line":"                    chassis_to_rebalance.update({"},{"line_number":258,"context_line":"                        chassis: {"},{"line_number":259,"context_line":"                            \u0027cr_lrps\u0027: data.get(\u0027cr_lrps\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_6dd32d39","line":256,"range":{"start_line":256,"start_character":23,"end_line":256,"end_character":28},"in_reply_to":"3fa7e38b_5472f14a","updated":"2019-11-26 15:26:40.000000000","message":"yes, done","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":256,"context_line":"                if data.get(\u0027cr_lrps_count\u0027) \u003e avg_per_chassis:"},{"line_number":257,"context_line":"                    chassis_to_rebalance.update({"},{"line_number":258,"context_line":"                        chassis: {"},{"line_number":259,"context_line":"                            \u0027cr_lrps\u0027: data.get(\u0027cr_lrps\u0027)"},{"line_number":260,"context_line":"                        }"},{"line_number":261,"context_line":"                    })"},{"line_number":262,"context_line":"                    LOG.info(\"AVG gateways per chassis in provider network: \""}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_74cdad64","line":259,"updated":"2019-09-24 11:41:08.000000000","message":"Don\u0027t you need to merge chassis_to_rebalance[\u0027cr_lrps\u0027] with data[\u0027cr_lrps\u0027] here? This will always contain the latest chassis cr_lrps from the gw_chassis dict.","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8d2bf26e0fb2c486392e95ea5d2e490e0bc2f72e","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                              \u0027avg\u0027: avg_per_chassis,"},{"line_number":268,"context_line":"                              \u0027count\u0027: data.get(\u0027cr_lrps_count\u0027),"},{"line_number":269,"context_line":"                              \u0027chassis\u0027: chassis})"},{"line_number":270,"context_line":"            if chassis_to_rebalance:"},{"line_number":271,"context_line":"                self.rebalance_gw_chassis("},{"line_number":272,"context_line":"                    chassis_to_rebalance,"},{"line_number":273,"context_line":"                    provnet,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_d486e113","line":270,"updated":"2019-09-24 11:41:08.000000000","message":"you actually don\u0027t need it, do you?","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"391f65551c4637e7733a5938a61260ef1b70da43","unresolved":false,"context_lines":[{"line_number":267,"context_line":"                              \u0027avg\u0027: avg_per_chassis,"},{"line_number":268,"context_line":"                              \u0027count\u0027: data.get(\u0027cr_lrps_count\u0027),"},{"line_number":269,"context_line":"                              \u0027chassis\u0027: chassis})"},{"line_number":270,"context_line":"            if chassis_to_rebalance:"},{"line_number":271,"context_line":"                self.rebalance_gw_chassis("},{"line_number":272,"context_line":"                    chassis_to_rebalance,"},{"line_number":273,"context_line":"                    provnet,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3fa7e38b_8d99c97b","line":270,"in_reply_to":"3fa7e38b_d486e113","updated":"2019-11-26 15:26:40.000000000","message":"Yes, I don\u0027t need this here. Deleted. Thanks","commit_id":"46429a38e6c5ef84709d55fb1c7a8012a3219ddc"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"351418b4ab9bc4907a740a7af4cdc9572bf17228","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                provnet \u003d self.get_provider_net_name(port.name)"},{"line_number":54,"context_line":"            except Exception as e:"},{"line_number":55,"context_line":"                provnet \u003d None"},{"line_number":56,"context_line":"                LOG.error(\"Failed to get provider network for lrp: %(lrp)s, \""},{"line_number":57,"context_line":"                          \"error: %(err)s.\","},{"line_number":58,"context_line":"                          {\u0027lrp\u0027: port.name, \u0027err\u0027: e})"},{"line_number":59,"context_line":"            lrp_data \u003d LRP(port.uuid, port.name,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_d30509c3","line":56,"range":{"start_line":56,"start_character":20,"end_line":56,"end_character":25},"updated":"2019-11-27 15:56:48.000000000","message":"nit: Sounds more like a warning message than an error for me. Usually errors should make the script fail where a warning we log the problem and continue the work.","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c11f0280059698490995aafe2b557403e1f98673","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                provnet \u003d self.get_provider_net_name(port.name)"},{"line_number":54,"context_line":"            except Exception as e:"},{"line_number":55,"context_line":"                provnet \u003d None"},{"line_number":56,"context_line":"                LOG.error(\"Failed to get provider network for lrp: %(lrp)s, \""},{"line_number":57,"context_line":"                          \"error: %(err)s.\","},{"line_number":58,"context_line":"                          {\u0027lrp\u0027: port.name, \u0027err\u0027: e})"},{"line_number":59,"context_line":"            lrp_data \u003d LRP(port.uuid, port.name,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_773c36c0","line":56,"range":{"start_line":56,"start_character":20,"end_line":56,"end_character":25},"in_reply_to":"3fa7e38b_d30509c3","updated":"2019-11-28 09:33:37.000000000","message":"Ok, ++, I will fix, thx!","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"c2aff108607a0112f719fa361b44fbac306af0d1","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        for provnet in provnets:"},{"line_number":227,"context_line":"            # It\u0027s kind of assumption about AVG, because we have"},{"line_number":228,"context_line":"            # another layer which is candidates."},{"line_number":229,"context_line":"            # We \u0027hope\u0027 that OVNGatewayLeastLoadedScheduler"},{"line_number":230,"context_line":"            # and rescheduler mechanism will properly select"},{"line_number":231,"context_line":"            # candidates pool to be spread across whole available"},{"line_number":232,"context_line":"            # chassis with access to needed provider net."},{"line_number":233,"context_line":"            avg_per_chassis \u003d self.get_avg_per_provnet(provnet)"},{"line_number":234,"context_line":"            if avg_per_chassis \u003d\u003d 0:"},{"line_number":235,"context_line":"                LOG.warning(\u0027There are no chassis gateways for provider \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_dfc0b52e","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":57},"updated":"2019-11-27 09:10:43.000000000","message":"I do not really get this sorry. Why OVNGatewayLeastLoadedScheduler? What if the random scheduler (or some other that we may add later on) is configured instead?","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"351418b4ab9bc4907a740a7af4cdc9572bf17228","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        for provnet in provnets:"},{"line_number":227,"context_line":"            # It\u0027s kind of assumption about AVG, because we have"},{"line_number":228,"context_line":"            # another layer which is candidates."},{"line_number":229,"context_line":"            # We \u0027hope\u0027 that OVNGatewayLeastLoadedScheduler"},{"line_number":230,"context_line":"            # and rescheduler mechanism will properly select"},{"line_number":231,"context_line":"            # candidates pool to be spread across whole available"},{"line_number":232,"context_line":"            # chassis with access to needed provider net."},{"line_number":233,"context_line":"            avg_per_chassis \u003d self.get_avg_per_provnet(provnet)"},{"line_number":234,"context_line":"            if avg_per_chassis \u003d\u003d 0:"},{"line_number":235,"context_line":"                LOG.warning(\u0027There are no chassis gateways for provider \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_73ee9522","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":57},"in_reply_to":"3fa7e38b_009a696e","updated":"2019-11-27 15:56:48.000000000","message":"Heh so this is just like \"I hope the scheduler code works\" :D\n\n(++ to drop it if u send a new patch-set)","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"fafabaebf47f7da0cfe7c52d05db3d2d3b33e1eb","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        for provnet in provnets:"},{"line_number":227,"context_line":"            # It\u0027s kind of assumption about AVG, because we have"},{"line_number":228,"context_line":"            # another layer which is candidates."},{"line_number":229,"context_line":"            # We \u0027hope\u0027 that OVNGatewayLeastLoadedScheduler"},{"line_number":230,"context_line":"            # and rescheduler mechanism will properly select"},{"line_number":231,"context_line":"            # candidates pool to be spread across whole available"},{"line_number":232,"context_line":"            # chassis with access to needed provider net."},{"line_number":233,"context_line":"            avg_per_chassis \u003d self.get_avg_per_provnet(provnet)"},{"line_number":234,"context_line":"            if avg_per_chassis \u003d\u003d 0:"},{"line_number":235,"context_line":"                LOG.warning(\u0027There are no chassis gateways for provider \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3fa7e38b_009a696e","line":232,"range":{"start_line":229,"start_character":0,"end_line":232,"end_character":57},"in_reply_to":"3fa7e38b_dfc0b52e","updated":"2019-11-27 14:55:17.000000000","message":"I mean I hope that a rescheduling mechanism will work and re-schedule a gw chassis on new, just added chassis.\n\nThis comment in code was a helper for me and its not necessary now so I\u0027m just dropping it.","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"}],"networking_ovn/tests/functional/test_rebalance_gw_chassis.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"391909c02d039153412425a8b54eeec1c69adbaa","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron_lib.api.definitions import external_net"},{"line_number":19,"context_line":"from neutron_lib.api.definitions import provider_net as pnet"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from networking_ovn.cmd.rebalance_gw_chassis import ChassisRebalancer as cmd"},{"line_number":22,"context_line":"from networking_ovn.l3 import l3_ovn_scheduler as l3_sched"},{"line_number":23,"context_line":"from networking_ovn.tests.functional import base"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_17c10d81","line":21,"updated":"2019-07-10 08:05:24.000000000","message":"It\u0027s recommended to avoid importing objects but rather import the whole module: https://docs.openstack.org/hacking/latest/user/hacking.html#imports","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"40430d79bcd63576515abc3d0ac6b502d31ad488","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron_lib.api.definitions import external_net"},{"line_number":19,"context_line":"from neutron_lib.api.definitions import provider_net as pnet"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from networking_ovn.cmd.rebalance_gw_chassis import ChassisRebalancer as cmd"},{"line_number":22,"context_line":"from networking_ovn.l3 import l3_ovn_scheduler as l3_sched"},{"line_number":23,"context_line":"from networking_ovn.tests.functional import base"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_6d63d01b","line":21,"in_reply_to":"7faddb67_17c10d81","updated":"2019-07-10 15:13:29.000000000","message":"ack, done, thx!","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"391909c02d039153412425a8b54eeec1c69adbaa","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def test_gateway_chassis_rebalance_odd_gws(self):"},{"line_number":86,"context_line":"        \"\"\"Test cases with odd number of chassis."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"           This test if balancer doesn\u0027t continuesly"},{"line_number":89,"context_line":"           move lrp between two chassis in case of"},{"line_number":90,"context_line":"           odd number of lrps."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_b7bfd9f9","line":88,"range":{"start_line":88,"start_character":16,"end_line":88,"end_character":20},"updated":"2019-07-10 08:05:24.000000000","message":"nit: tests","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"40430d79bcd63576515abc3d0ac6b502d31ad488","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def test_gateway_chassis_rebalance_odd_gws(self):"},{"line_number":86,"context_line":"        \"\"\"Test cases with odd number of chassis."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"           This test if balancer doesn\u0027t continuesly"},{"line_number":89,"context_line":"           move lrp between two chassis in case of"},{"line_number":90,"context_line":"           odd number of lrps."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_ade468ad","line":88,"range":{"start_line":88,"start_character":16,"end_line":88,"end_character":20},"in_reply_to":"7faddb67_b7bfd9f9","updated":"2019-07-10 15:13:29.000000000","message":"done","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"391909c02d039153412425a8b54eeec1c69adbaa","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def test_gateway_chassis_rebalance_even_gws(self):"},{"line_number":122,"context_line":"        \"\"\"Test cases with even number of chassis."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"           This test if balancer doesn\u0027t continuesly"},{"line_number":125,"context_line":"           move lrp between two chassis in case of"},{"line_number":126,"context_line":"           even number of lrps."},{"line_number":127,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_f7f8f1c4","line":124,"range":{"start_line":124,"start_character":16,"end_line":124,"end_character":20},"updated":"2019-07-10 08:05:24.000000000","message":"nit: tests","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"40430d79bcd63576515abc3d0ac6b502d31ad488","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def test_gateway_chassis_rebalance_even_gws(self):"},{"line_number":122,"context_line":"        \"\"\"Test cases with even number of chassis."},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"           This test if balancer doesn\u0027t continuesly"},{"line_number":125,"context_line":"           move lrp between two chassis in case of"},{"line_number":126,"context_line":"           even number of lrps."},{"line_number":127,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_edda60e7","line":124,"range":{"start_line":124,"start_character":16,"end_line":124,"end_character":20},"in_reply_to":"7faddb67_f7f8f1c4","updated":"2019-07-10 15:13:29.000000000","message":"done","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"391909c02d039153412425a8b54eeec1c69adbaa","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            \u0027ext2\u0027, \u0027flat\u0027, \u0027physnet2\u0027, None, \"22.0.0.1\", \"22.0.0.0/24\")"},{"line_number":189,"context_line":"        gw_info2 \u003d {\u0027network_id\u0027: ext2[\u0027network\u0027][\u0027id\u0027]}"},{"line_number":190,"context_line":"        ext2 \u003d self._create_ext_network("},{"line_number":191,"context_line":"            \u0027ext2\u0027, \u0027flat\u0027, \u0027physnet3\u0027, None, \"23.0.0.1\", \"23.0.0.0/24\")"},{"line_number":192,"context_line":"        gw_info3 \u003d {\u0027network_id\u0027: ext2[\u0027network\u0027][\u0027id\u0027]}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        # Create 3 routers with a gateway. Overload first gateway."}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_97317da5","line":191,"range":{"start_line":191,"start_character":13,"end_line":191,"end_character":17},"updated":"2019-07-10 08:05:24.000000000","message":"do you want to create two external networks with the same name?","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"40430d79bcd63576515abc3d0ac6b502d31ad488","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            \u0027ext2\u0027, \u0027flat\u0027, \u0027physnet2\u0027, None, \"22.0.0.1\", \"22.0.0.0/24\")"},{"line_number":189,"context_line":"        gw_info2 \u003d {\u0027network_id\u0027: ext2[\u0027network\u0027][\u0027id\u0027]}"},{"line_number":190,"context_line":"        ext2 \u003d self._create_ext_network("},{"line_number":191,"context_line":"            \u0027ext2\u0027, \u0027flat\u0027, \u0027physnet3\u0027, None, \"23.0.0.1\", \"23.0.0.0/24\")"},{"line_number":192,"context_line":"        gw_info3 \u003d {\u0027network_id\u0027: ext2[\u0027network\u0027][\u0027id\u0027]}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"        # Create 3 routers with a gateway. Overload first gateway."}],"source_content_type":"text/x-python","patch_set":9,"id":"7faddb67_b7da7914","line":191,"range":{"start_line":191,"start_character":13,"end_line":191,"end_character":17},"in_reply_to":"7faddb67_97317da5","updated":"2019-07-10 15:13:29.000000000","message":"good catch, looks like to much copy-paste","commit_id":"7ec2784b13d9acc238fa4ffeec7c0dbd5de93dc9"}],"networking_ovn/tests/functional/test_router.py":[{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"a70378e80b74e25e05fdb7a7283d851e601a91c0","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        # Using the least loaded policy for scheduling gateway ports, we"},{"line_number":154,"context_line":"        # expect that they are equally distributed across the two available"},{"line_number":155,"context_line":"        # chassis."},{"line_number":156,"context_line":"        # NOTE(mjozefcz): TU KURWA"},{"line_number":157,"context_line":"        ovn_client \u003d self.l3_plugin._ovn_client"},{"line_number":158,"context_line":"        ovn_client._ovn_scheduler \u003d l3_sched.OVNGatewayLeastLoadedScheduler()"},{"line_number":159,"context_line":"        ext1 \u003d self._create_ext_network("}],"source_content_type":"text/x-python","patch_set":5,"id":"9fb8cfa7_1d2fd5f6","line":156,"updated":"2019-06-07 10:56:45.000000000","message":"https://www.youtube.com/watch?v\u003dDvMh4_ak6r4 sorry","commit_id":"e59fcfa52c2236abf1f64b0cad2fe3fc2f8d9f12"}],"networking_ovn/tests/unit/cmd/test_rebalance_gw_chassis.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from networking_ovn.tests import base"},{"line_number":23,"context_line":"from networking_ovn.tests.unit import fakes"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestNetworkingOvnRebalanceGwChassis(base.TestCase):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    REBALANCER_CLASS \u003d (\u0027networking_ovn.cmd.rebalance_gw_chassis.\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_807fc713","line":25,"updated":"2019-07-12 13:13:50.000000000","message":"Looks like get_connections function is not covered :) Would be good to have a test class for it.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestNetworkingOvnRebalanceGwChassis(base.TestCase):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    REBALANCER_CLASS \u003d (\u0027networking_ovn.cmd.rebalance_gw_chassis.\u0027"},{"line_number":29,"context_line":"                        \u0027ChassisRebalancer\u0027)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c0b37f09","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":20},"updated":"2019-07-12 13:13:50.000000000","message":"The class is imported in the module on L21. It\u0027s better to reuse it instead of concatenating strings. When you want to mock a \u0027foo\u0027 method of ChassisRebalancer, you can do:\n\n mock.patch.object(cmd.ChassisRebalancer, \u0027foo\u0027)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestNetworkingOvnRebalanceGwChassis(base.TestCase):"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    REBALANCER_CLASS \u003d (\u0027networking_ovn.cmd.rebalance_gw_chassis.\u0027"},{"line_number":29,"context_line":"                        \u0027ChassisRebalancer\u0027)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_ddfcb3b6","line":28,"range":{"start_line":28,"start_character":4,"end_line":28,"end_character":20},"in_reply_to":"7faddb67_c0b37f09","updated":"2019-07-15 13:02:31.000000000","message":"yep, done :) thanks","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(TestNetworkingOvnRebalanceGwChassis, self).setUp()"},{"line_number":33,"context_line":"        self.cmd_log \u003d mock.Mock()"},{"line_number":34,"context_line":"        cmd.LOG \u003d self.cmd_log"},{"line_number":35,"context_line":"        self.nb_idl \u003d fakes.FakeOvsdbNbOvnIdl()"},{"line_number":36,"context_line":"        self.sb_idl \u003d fakes.FakeOvsdbSbOvnIdl()"},{"line_number":37,"context_line":"        self.rebalancer \u003d cmd.ChassisRebalancer(self.nb_idl, self.sb_idl)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c0da9f49","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":30},"updated":"2019-07-12 13:13:50.000000000","message":"mock.patch.object(cmd, \u0027LOG\u0027).start()\n\nWhy is it even needed?","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setUp(self):"},{"line_number":32,"context_line":"        super(TestNetworkingOvnRebalanceGwChassis, self).setUp()"},{"line_number":33,"context_line":"        self.cmd_log \u003d mock.Mock()"},{"line_number":34,"context_line":"        cmd.LOG \u003d self.cmd_log"},{"line_number":35,"context_line":"        self.nb_idl \u003d fakes.FakeOvsdbNbOvnIdl()"},{"line_number":36,"context_line":"        self.sb_idl \u003d fakes.FakeOvsdbSbOvnIdl()"},{"line_number":37,"context_line":"        self.rebalancer \u003d cmd.ChassisRebalancer(self.nb_idl, self.sb_idl)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_5d2443af","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":30},"in_reply_to":"7faddb67_c0da9f49","updated":"2019-07-15 13:02:31.000000000","message":"Its not, deleting it. Thanks","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.sb_idl \u003d fakes.FakeOvsdbSbOvnIdl()"},{"line_number":37,"context_line":"        self.rebalancer \u003d cmd.ChassisRebalancer(self.nb_idl, self.sb_idl)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        self.provnets \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":40,"context_line":"        self.mock_provnets \u003d mock.patch("},{"line_number":41,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_provnets\u0027,"},{"line_number":42,"context_line":"            return_value\u003dself.provnets)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_a0e5230b","line":39,"range":{"start_line":39,"start_character":24,"end_line":39,"end_character":50},"updated":"2019-07-12 13:13:50.000000000","message":"{\u0027public\u0027, \u0027public2\u0027}","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.sb_idl \u003d fakes.FakeOvsdbSbOvnIdl()"},{"line_number":37,"context_line":"        self.rebalancer \u003d cmd.ChassisRebalancer(self.nb_idl, self.sb_idl)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        self.provnets \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":40,"context_line":"        self.mock_provnets \u003d mock.patch("},{"line_number":41,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_provnets\u0027,"},{"line_number":42,"context_line":"            return_value\u003dself.provnets)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_1d3a4bcb","line":39,"range":{"start_line":39,"start_character":24,"end_line":39,"end_character":50},"in_reply_to":"7faddb67_a0e5230b","updated":"2019-07-15 13:02:31.000000000","message":"done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            \u0027chassis1\u0027: [\u0027public\u0027, \u0027public2\u0027],"},{"line_number":47,"context_line":"            \u0027chassis2\u0027: [\u0027public\u0027, \u0027public2\u0027],"},{"line_number":48,"context_line":"            \u0027chassis3\u0027: [\u0027public2\u0027]}"},{"line_number":49,"context_line":"        self.sb_idl.get_chassis_and_physnets.return_value \u003d \\"},{"line_number":50,"context_line":"            self.chassis_provnet_mappings"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        self.master_ports \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_80d10726","line":49,"range":{"start_line":49,"start_character":60,"end_line":49,"end_character":61},"updated":"2019-07-12 13:13:50.000000000","message":"nit: parenthesis are preferred over backslash","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            \u0027chassis1\u0027: [\u0027public\u0027, \u0027public2\u0027],"},{"line_number":47,"context_line":"            \u0027chassis2\u0027: [\u0027public\u0027, \u0027public2\u0027],"},{"line_number":48,"context_line":"            \u0027chassis3\u0027: [\u0027public2\u0027]}"},{"line_number":49,"context_line":"        self.sb_idl.get_chassis_and_physnets.return_value \u003d \\"},{"line_number":50,"context_line":"            self.chassis_provnet_mappings"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        self.master_ports \u003d {"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_9de39bd9","line":49,"range":{"start_line":49,"start_character":60,"end_line":49,"end_character":61},"in_reply_to":"7faddb67_80d10726","updated":"2019-07-15 13:02:31.000000000","message":"Done everywhere. Thanks. I\u0027ll remember that :)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            return_value\u003dself.master_ports)"},{"line_number":67,"context_line":"        self.mock_master_ports.start()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.start\u0027)"},{"line_number":70,"context_line":"    def test_main(self, mock_balancer):"},{"line_number":71,"context_line":"        test_args \u003d ["},{"line_number":72,"context_line":"            \u0027networking-ovn-rebalance-gw-chassis\u0027,"},{"line_number":73,"context_line":"            \u0027--config-file\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e086bb13","line":70,"range":{"start_line":69,"start_character":0,"end_line":70,"end_character":39},"updated":"2019-07-12 13:13:50.000000000","message":"It\u0027s a good rule-of-a-thumb to create a test class for function as you likely won\u0027t need almost anything from the setUp of this class when testing a standalone function.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            return_value\u003dself.master_ports)"},{"line_number":67,"context_line":"        self.mock_master_ports.start()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.start\u0027)"},{"line_number":70,"context_line":"    def test_main(self, mock_balancer):"},{"line_number":71,"context_line":"        test_args \u003d ["},{"line_number":72,"context_line":"            \u0027networking-ovn-rebalance-gw-chassis\u0027,"},{"line_number":73,"context_line":"            \u0027--config-file\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_7dd49f20","line":70,"range":{"start_line":69,"start_character":0,"end_line":70,"end_character":39},"in_reply_to":"7faddb67_e086bb13","updated":"2019-07-15 13:02:31.000000000","message":"Ack, moved this to new testclass. Thanks for good practices! Done :)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            \u0027networking-ovn-rebalance-gw-chassis\u0027,"},{"line_number":73,"context_line":"            \u0027--config-file\u0027,"},{"line_number":74,"context_line":"        ]"},{"line_number":75,"context_line":"        test_args.append(tempfile.mkstemp()[1])"},{"line_number":76,"context_line":"        with mock.patch.object(sys, \u0027argv\u0027, test_args), mock.patch("},{"line_number":77,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.get_connections\u0027,"},{"line_number":78,"context_line":"                return_value\u003d(self.nb_idl, self.sb_idl)) as mock_conn:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_008c3734","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":47},"updated":"2019-07-12 13:13:50.000000000","message":"Unittests must not have any interaction with the system. It\u0027s better to mock out function that parses the config file and pass \u0027foo\u0027 instead.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            \u0027networking-ovn-rebalance-gw-chassis\u0027,"},{"line_number":73,"context_line":"            \u0027--config-file\u0027,"},{"line_number":74,"context_line":"        ]"},{"line_number":75,"context_line":"        test_args.append(tempfile.mkstemp()[1])"},{"line_number":76,"context_line":"        with mock.patch.object(sys, \u0027argv\u0027, test_args), mock.patch("},{"line_number":77,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.get_connections\u0027,"},{"line_number":78,"context_line":"                return_value\u003d(self.nb_idl, self.sb_idl)) as mock_conn:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_9dd95b58","line":75,"range":{"start_line":75,"start_character":0,"end_line":75,"end_character":47},"in_reply_to":"7faddb67_008c3734","updated":"2019-07-15 13:02:31.000000000","message":"Ack, you\u0027re right. Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        mock_conn.assert_called_once()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":84,"context_line":"    def test_start_no_gw_chassis_exception(self, rebalance):"},{"line_number":85,"context_line":"        self.sb_idl.get_chassis_and_physnets.return_value \u003d {}"},{"line_number":86,"context_line":"        self.rebalancer.start()"},{"line_number":87,"context_line":"        rebalance.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c0961f3f","line":84,"range":{"start_line":84,"start_character":32,"end_line":84,"end_character":42},"updated":"2019-07-12 13:13:50.000000000","message":"I don\u0027t understand what\u0027s the test here. There is no exception handler in start() method.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        mock_conn.assert_called_once()"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":84,"context_line":"    def test_start_no_gw_chassis_exception(self, rebalance):"},{"line_number":85,"context_line":"        self.sb_idl.get_chassis_and_physnets.return_value \u003d {}"},{"line_number":86,"context_line":"        self.rebalancer.start()"},{"line_number":87,"context_line":"        rebalance.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_1d87abb7","line":84,"range":{"start_line":84,"start_character":32,"end_line":84,"end_character":42},"in_reply_to":"7faddb67_c0961f3f","updated":"2019-07-15 13:02:31.000000000","message":"Yes, you\u0027re right. This should test get_avg_per_provnet() were ZeroDivisionError is handled. I\u0027ll rename it and modify.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":90,"context_line":"    def test_start_no_gw_chassis_ports(self, rebalance):"},{"line_number":91,"context_line":"        self.mock_master_ports.stop()"},{"line_number":92,"context_line":"        with mock.patch(self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":93,"context_line":"                        return_value\u003d{}):"},{"line_number":94,"context_line":"            self.rebalancer.start()"},{"line_number":95,"context_line":"            rebalance.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_20e4d3e0","line":92,"range":{"start_line":92,"start_character":50,"end_line":92,"end_character":70},"updated":"2019-07-12 13:13:50.000000000","message":"It\u0027s better to mock get_chassis_with_master_ports because that\u0027s what start() calls.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":90,"context_line":"    def test_start_no_gw_chassis_ports(self, rebalance):"},{"line_number":91,"context_line":"        self.mock_master_ports.stop()"},{"line_number":92,"context_line":"        with mock.patch(self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":93,"context_line":"                        return_value\u003d{}):"},{"line_number":94,"context_line":"            self.rebalancer.start()"},{"line_number":95,"context_line":"            rebalance.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e0a54248","line":92,"range":{"start_line":92,"start_character":50,"end_line":92,"end_character":70},"in_reply_to":"7faddb67_20e4d3e0","updated":"2019-07-15 13:02:31.000000000","message":"Done, but to achieve that I added mock on get_avg_per_provnet to be sure it returns not zero.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":90,"context_line":"    def test_start_no_gw_chassis_ports(self, rebalance):"},{"line_number":91,"context_line":"        self.mock_master_ports.stop()"},{"line_number":92,"context_line":"        with mock.patch(self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":93,"context_line":"                        return_value\u003d{}):"},{"line_number":94,"context_line":"            self.rebalancer.start()"},{"line_number":95,"context_line":"            rebalance.assert_not_called()"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_60a72ba9","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":41},"updated":"2019-07-12 13:13:50.000000000","message":"Can you do just?\n\n self.mock_master_ports.return_value \u003d {}\n\nWhy do you need to stop it and mock it back again?","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":90,"context_line":"    def test_start_no_gw_chassis_ports(self, rebalance):"},{"line_number":91,"context_line":"        self.mock_master_ports.stop()"},{"line_number":92,"context_line":"        with mock.patch(self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":93,"context_line":"                        return_value\u003d{}):"},{"line_number":94,"context_line":"            self.rebalancer.start()"},{"line_number":95,"context_line":"            rebalance.assert_not_called()"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_804d6e9b","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":41},"in_reply_to":"7faddb67_60a72ba9","updated":"2019-07-15 13:02:31.000000000","message":"I wish I could. I tried do so but still return_value is the one defined before start().\n\nCheck this example:\n\nimport mock\n\ndef foo(name_a):\n    name \u003d name_a\n    return name\n\npatcher \u003d mock.patch(__name__ + \u0027.foo\u0027, return_value\u003d\u0027aga\u0027)\npatcher.start()\n\n\n\u003e\u003e\u003e foo()\n\u0027aga\u0027\n\u003e\u003e\u003e foo(\u0027tester\u0027)\n\u0027aga\u0027\n\u003e\u003e\u003e patcher.return_value\u003d\u0027abc\u0027\n\u003e\u003e\u003e foo(\u0027tester\u0027)\n\u0027aga\u0027\n\u003e\u003e\u003e patcher.stop()\n\u003e\u003e\u003e foo(\u0027tester\u0027)\n\u0027tester\u0027\n\u003e\u003e\u003e \n\nI don\u0027t have any other idea to stop and start new mock.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c082b931de236dd857523f32fb31a7f6ba8ca9cd","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @mock.patch(REBALANCER_CLASS + \u0027.rebalance_gw_chassis\u0027)"},{"line_number":90,"context_line":"    def test_start_no_gw_chassis_ports(self, rebalance):"},{"line_number":91,"context_line":"        self.mock_master_ports.stop()"},{"line_number":92,"context_line":"        with mock.patch(self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":93,"context_line":"                        return_value\u003d{}):"},{"line_number":94,"context_line":"            self.rebalancer.start()"},{"line_number":95,"context_line":"            rebalance.assert_not_called()"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e20bf4d2","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":41},"in_reply_to":"7faddb67_804d6e9b","updated":"2019-07-16 11:35:22.000000000","message":"Fixed, thanks for the help on IRC!","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            \u0027lrp-test-2\u0027: cmd.LRP("},{"line_number":103,"context_line":"                \u0027lrp-test-2-uuid\u0027, \u0027lrp-test-2\u0027, \u0027chassis2\u0027, \u0027public\u0027),"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        self.mock_master_ports.stop()"},{"line_number":106,"context_line":"        with mock.patch("},{"line_number":107,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":108,"context_line":"            return_value\u003dself.master_ports):"},{"line_number":109,"context_line":"            self.rebalancer.start()"},{"line_number":110,"context_line":"            rebalance.assert_not_called()"},{"line_number":111,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e0023b6f","line":108,"range":{"start_line":105,"start_character":0,"end_line":108,"end_character":44},"updated":"2019-07-12 13:13:50.000000000","message":"ditto about stopping and mocking again","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            \u0027lrp-test-2\u0027: cmd.LRP("},{"line_number":119,"context_line":"                \u0027lrp-test-2-uuid\u0027, \u0027lrp-test-2\u0027, \u0027chassis1\u0027, \u0027public\u0027),"},{"line_number":120,"context_line":"        }"},{"line_number":121,"context_line":"        self.mock_master_ports.stop()"},{"line_number":122,"context_line":"        with mock.patch("},{"line_number":123,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":124,"context_line":"            return_value\u003dself.master_ports):"},{"line_number":125,"context_line":"            self.rebalancer.start()"},{"line_number":126,"context_line":"            try:"},{"line_number":127,"context_line":"                rebalance.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_60ee4bb5","line":124,"range":{"start_line":121,"start_character":0,"end_line":124,"end_character":44},"updated":"2019-07-12 13:13:50.000000000","message":"ditto about stopping and mocking again","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                        {\u0027cr_lrps\u0027: [self.master_ports[\u0027lrp-test-1\u0027],"},{"line_number":130,"context_line":"                                     self.master_ports[\u0027lrp-test-2\u0027]]}},"},{"line_number":131,"context_line":"                    \u0027public\u0027, 1)"},{"line_number":132,"context_line":"            except AssertionError:"},{"line_number":133,"context_line":"                # cr_lrps is unordered list, try different order"},{"line_number":134,"context_line":"                rebalance.assert_called_once_with("},{"line_number":135,"context_line":"                    {\u0027chassis1\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_6043abb0","line":132,"range":{"start_line":132,"start_character":0,"end_line":132,"end_character":34},"updated":"2019-07-12 13:13:50.000000000","message":"The behavior is deterministic, isn\u0027t it? We should know which data are returned and in what order rebalance is called, no?\n\nAnd if it isn\u0027t, you can get the parameters that were used in the call and then use assertItemsEqual on it","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                        {\u0027cr_lrps\u0027: [self.master_ports[\u0027lrp-test-1\u0027],"},{"line_number":130,"context_line":"                                     self.master_ports[\u0027lrp-test-2\u0027]]}},"},{"line_number":131,"context_line":"                    \u0027public\u0027, 1)"},{"line_number":132,"context_line":"            except AssertionError:"},{"line_number":133,"context_line":"                # cr_lrps is unordered list, try different order"},{"line_number":134,"context_line":"                rebalance.assert_called_once_with("},{"line_number":135,"context_line":"                    {\u0027chassis1\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e316ac49","line":132,"range":{"start_line":132,"start_character":0,"end_line":132,"end_character":34},"in_reply_to":"7faddb67_6043abb0","updated":"2019-07-15 13:02:31.000000000","message":"There is no slight difference between witch LRP will be moved from overloaded GW, at least we don\u0027t have LRP bandwidth use parameters so we\u0027re blind.\n\nThe \u0027cr_lrps\u0027 list could be retrieved all the time in other order. That\u0027s because of get_chassis_with_master_ports() and loop over dict master_ports. Dicts by default are not ordered and I don\u0027t feel we need to be strict to any order here.\n\nI\u0027ll modify the assert.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            attrs\u003d{"},{"line_number":161,"context_line":"                \u0027name\u0027: \u0027lrp2\u0027,"},{"line_number":162,"context_line":"                \u0027gateway_chassis\u0027: []})"},{"line_number":163,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d \\"},{"line_number":164,"context_line":"            [lrp1, lrp2]"},{"line_number":165,"context_line":"        returned \u003d self.rebalancer.get_all_master_ports()"},{"line_number":166,"context_line":"        expected \u003d {\u0027lrp1\u0027: cmd.LRP(lrp1.uuid, lrp1.name, \u0027chassis1\u0027, None)}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_138b336e","line":163,"range":{"start_line":163,"start_character":69,"end_line":163,"end_character":70},"updated":"2019-07-12 13:13:50.000000000","message":"nit: parens are preferred","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            attrs\u003d{"},{"line_number":161,"context_line":"                \u0027name\u0027: \u0027lrp2\u0027,"},{"line_number":162,"context_line":"                \u0027gateway_chassis\u0027: []})"},{"line_number":163,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d \\"},{"line_number":164,"context_line":"            [lrp1, lrp2]"},{"line_number":165,"context_line":"        returned \u003d self.rebalancer.get_all_master_ports()"},{"line_number":166,"context_line":"        expected \u003d {\u0027lrp1\u0027: cmd.LRP(lrp1.uuid, lrp1.name, \u0027chassis1\u0027, None)}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_8029ee8a","line":163,"range":{"start_line":163,"start_character":69,"end_line":163,"end_character":70},"in_reply_to":"7faddb67_138b336e","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            attrs\u003d{"},{"line_number":187,"context_line":"                \u0027name\u0027: \u0027lrp2\u0027,"},{"line_number":188,"context_line":"                \u0027gateway_chassis\u0027: [gw_chassis_3]})"},{"line_number":189,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d \\"},{"line_number":190,"context_line":"            [lrp1, lrp2]"},{"line_number":191,"context_line":"        returned \u003d self.rebalancer.get_all_master_ports(chassis\u003d\u0027chassis3\u0027)"},{"line_number":192,"context_line":"        expected \u003d {\u0027lrp2\u0027: cmd.LRP(lrp2.uuid, lrp2.name, \u0027chassis3\u0027, None)}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b3c9ffac","line":189,"range":{"start_line":189,"start_character":69,"end_line":189,"end_character":70},"updated":"2019-07-12 13:13:50.000000000","message":"nit: ditto","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            attrs\u003d{"},{"line_number":187,"context_line":"                \u0027name\u0027: \u0027lrp2\u0027,"},{"line_number":188,"context_line":"                \u0027gateway_chassis\u0027: [gw_chassis_3]})"},{"line_number":189,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d \\"},{"line_number":190,"context_line":"            [lrp1, lrp2]"},{"line_number":191,"context_line":"        returned \u003d self.rebalancer.get_all_master_ports(chassis\u003d\u0027chassis3\u0027)"},{"line_number":192,"context_line":"        expected \u003d {\u0027lrp2\u0027: cmd.LRP(lrp2.uuid, lrp2.name, \u0027chassis3\u0027, None)}"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_a0ef4a1c","line":189,"range":{"start_line":189,"start_character":69,"end_line":189,"end_character":70},"in_reply_to":"7faddb67_b3c9ffac","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        expected \u003d {"},{"line_number":198,"context_line":"            \u0027chassis1\u0027: {"},{"line_number":199,"context_line":"                \u0027cr_lrps\u0027:"},{"line_number":200,"context_line":"                    [cmd.LRP(\u0027lrp-test-1-uuid\u0027, \u0027lrp-test-1\u0027,"},{"line_number":201,"context_line":"                             \u0027chassis1\u0027, \u0027public\u0027)],"},{"line_number":202,"context_line":"                    \u0027cr_lrps_count\u0027: 1},"},{"line_number":203,"context_line":"            \u0027chassis2\u0027: {"},{"line_number":204,"context_line":"                \u0027cr_lrps\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_336bcf85","line":201,"range":{"start_line":200,"start_character":21,"end_line":201,"end_character":50},"updated":"2019-07-12 13:13:50.000000000","message":"maybe would be good to refer to it as self.master_ports[0] so it\u0027s obvious where it\u0027s coming from. This looks like magical data.","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":197,"context_line":"        expected \u003d {"},{"line_number":198,"context_line":"            \u0027chassis1\u0027: {"},{"line_number":199,"context_line":"                \u0027cr_lrps\u0027:"},{"line_number":200,"context_line":"                    [cmd.LRP(\u0027lrp-test-1-uuid\u0027, \u0027lrp-test-1\u0027,"},{"line_number":201,"context_line":"                             \u0027chassis1\u0027, \u0027public\u0027)],"},{"line_number":202,"context_line":"                    \u0027cr_lrps_count\u0027: 1},"},{"line_number":203,"context_line":"            \u0027chassis2\u0027: {"},{"line_number":204,"context_line":"                \u0027cr_lrps\u0027:"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_40a216fe","line":201,"range":{"start_line":200,"start_character":21,"end_line":201,"end_character":50},"in_reply_to":"7faddb67_336bcf85","updated":"2019-07-15 13:02:31.000000000","message":"Ok, done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            attrs\u003d{"},{"line_number":237,"context_line":"                \u0027datapath\u0027: datapath,"},{"line_number":238,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":239,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":240,"context_line":"            [[lp], None]"},{"line_number":241,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"},{"line_number":242,"context_line":"        self.assertIsNone(returned)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_33198f21","line":239,"range":{"start_line":239,"start_character":68,"end_line":239,"end_character":69},"updated":"2019-07-12 13:13:50.000000000","message":"nit: parens","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            attrs\u003d{"},{"line_number":237,"context_line":"                \u0027datapath\u0027: datapath,"},{"line_number":238,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":239,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":240,"context_line":"            [[lp], None]"},{"line_number":241,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"},{"line_number":242,"context_line":"        self.assertIsNone(returned)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_fdd16ffc","line":239,"range":{"start_line":239,"start_character":68,"end_line":239,"end_character":69},"in_reply_to":"7faddb67_33198f21","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            attrs\u003d{"},{"line_number":249,"context_line":"                \u0027datapath\u0027: datapath,"},{"line_number":250,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":251,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":252,"context_line":"            [[lp], [datapath]]"},{"line_number":253,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d None"},{"line_number":254,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_73fb8778","line":251,"range":{"start_line":251,"start_character":68,"end_line":251,"end_character":69},"updated":"2019-07-12 13:13:50.000000000","message":"nit: ditto","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":248,"context_line":"            attrs\u003d{"},{"line_number":249,"context_line":"                \u0027datapath\u0027: datapath,"},{"line_number":250,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":251,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":252,"context_line":"            [[lp], [datapath]]"},{"line_number":253,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d None"},{"line_number":254,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_1dcfab56","line":251,"range":{"start_line":251,"start_character":68,"end_line":251,"end_character":69},"in_reply_to":"7faddb67_73fb8778","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":264,"context_line":"        prov_lp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row("},{"line_number":265,"context_line":"            attrs\u003d{\u0027options\u0027: {\u0027network_name\u0027: \u0027foo\u0027}})"},{"line_number":266,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":267,"context_line":"            [[lp], [datapath]]"},{"line_number":268,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [prov_lp]"},{"line_number":269,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b3325f5d","line":266,"range":{"start_line":266,"start_character":68,"end_line":266,"end_character":69},"updated":"2019-07-12 13:13:50.000000000","message":"nit: ditto :)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                \u0027name\u0027: \u0027fake-uuid\u0027})"},{"line_number":264,"context_line":"        prov_lp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row("},{"line_number":265,"context_line":"            attrs\u003d{\u0027options\u0027: {\u0027network_name\u0027: \u0027foo\u0027}})"},{"line_number":266,"context_line":"        self.sb_idl.db_find_rows.return_value.execute.side_effect \u003d \\"},{"line_number":267,"context_line":"            [[lp], [datapath]]"},{"line_number":268,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [prov_lp]"},{"line_number":269,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_bdd777ee","line":266,"range":{"start_line":266,"start_character":68,"end_line":266,"end_character":69},"in_reply_to":"7faddb67_b3325f5d","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"},{"line_number":270,"context_line":"        self.assertEqual(returned, \u0027foo\u0027)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_get_candidates_for_lrp(self):"},{"line_number":273,"context_line":"        lrp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row()"},{"line_number":274,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [lrp]"},{"line_number":275,"context_line":"        self.nb_idl._get_logical_router_port_gateway_chassis.return_value \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_369c1d69","line":272,"updated":"2019-07-12 13:13:50.000000000","message":"I think these cases are missing:\n\n 1. LRP is missing in the DB\n 2. one chassis has not lrp port bound","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        returned \u003d self.rebalancer.get_provider_net_name(\u0027lrp-fake-uuid\u0027)"},{"line_number":270,"context_line":"        self.assertEqual(returned, \u0027foo\u0027)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_get_candidates_for_lrp(self):"},{"line_number":273,"context_line":"        lrp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row()"},{"line_number":274,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [lrp]"},{"line_number":275,"context_line":"        self.nb_idl._get_logical_router_port_gateway_chassis.return_value \u003d \\"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_c34cd0c9","line":272,"in_reply_to":"7faddb67_369c1d69","updated":"2019-07-15 13:02:31.000000000","message":"yes, you\u0027re right\n\n1) done\n2) done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def test_get_candidates_for_lrp(self):"},{"line_number":273,"context_line":"        lrp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row()"},{"line_number":274,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [lrp]"},{"line_number":275,"context_line":"        self.nb_idl._get_logical_router_port_gateway_chassis.return_value \u003d \\"},{"line_number":276,"context_line":"            [(\u0027chassis1\u0027, 1), (\u0027chassis2\u0027, 2)]"},{"line_number":277,"context_line":"        expected \u003d ["},{"line_number":278,"context_line":"            cmd.CANDIDATE(\u0027chassis1\u0027, 1, 1),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_f6d44522","line":275,"updated":"2019-07-12 13:13:50.000000000","message":"nit: ditto :)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":272,"context_line":"    def test_get_candidates_for_lrp(self):"},{"line_number":273,"context_line":"        lrp \u003d fakes.FakeOvsdbRow.create_one_ovsdb_row()"},{"line_number":274,"context_line":"        self.nb_idl.db_find_rows.return_value.execute.return_value \u003d [lrp]"},{"line_number":275,"context_line":"        self.nb_idl._get_logical_router_port_gateway_chassis.return_value \u003d \\"},{"line_number":276,"context_line":"            [(\u0027chassis1\u0027, 1), (\u0027chassis2\u0027, 2)]"},{"line_number":277,"context_line":"        expected \u003d ["},{"line_number":278,"context_line":"            cmd.CANDIDATE(\u0027chassis1\u0027, 1, 1),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_ddd4b3eb","line":275,"in_reply_to":"7faddb67_f6d44522","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def test_get_all_chassis_with_provnet(self):"},{"line_number":284,"context_line":"        returned \u003d self.rebalancer.get_all_chassis_with_provnet(\u0027public2\u0027)"},{"line_number":285,"context_line":"        expected \u003d set([\u0027chassis1\u0027, \u0027chassis2\u0027, \u0027chassis3\u0027])"},{"line_number":286,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_get_master_ports_with_provnet(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_f68be51b","line":285,"range":{"start_line":285,"start_character":19,"end_line":285,"end_character":24},"updated":"2019-07-12 13:13:50.000000000","message":"nit: {","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def test_get_all_chassis_with_provnet(self):"},{"line_number":284,"context_line":"        returned \u003d self.rebalancer.get_all_chassis_with_provnet(\u0027public2\u0027)"},{"line_number":285,"context_line":"        expected \u003d set([\u0027chassis1\u0027, \u0027chassis2\u0027, \u0027chassis3\u0027])"},{"line_number":286,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    def test_get_master_ports_with_provnet(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_7d07bf83","line":285,"range":{"start_line":285,"start_character":19,"end_line":285,"end_character":24},"in_reply_to":"7faddb67_f68be51b","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        returned \u003d self.rebalancer.get_master_ports_with_provnet(\u0027public2\u0027)"},{"line_number":290,"context_line":"        expected \u003d {"},{"line_number":291,"context_line":"            \u0027lrp-test-3\u0027:"},{"line_number":292,"context_line":"                cmd.LRP(\u0027lrp-test-3-uuid\u0027, \u0027lrp-test-3\u0027,"},{"line_number":293,"context_line":"                        \u0027chassis1\u0027, \u0027public2\u0027),"},{"line_number":294,"context_line":"            \u0027lrp-test-4\u0027:"},{"line_number":295,"context_line":"                cmd.LRP(\u0027lrp-test-4-uuid\u0027, \u0027lrp-test-4\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b681edfd","line":292,"updated":"2019-07-12 13:13:50.000000000","message":"maybe reference to self.master_ports would ease reading here","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        returned \u003d self.rebalancer.get_master_ports_with_provnet(\u0027public2\u0027)"},{"line_number":290,"context_line":"        expected \u003d {"},{"line_number":291,"context_line":"            \u0027lrp-test-3\u0027:"},{"line_number":292,"context_line":"                cmd.LRP(\u0027lrp-test-3-uuid\u0027, \u0027lrp-test-3\u0027,"},{"line_number":293,"context_line":"                        \u0027chassis1\u0027, \u0027public2\u0027),"},{"line_number":294,"context_line":"            \u0027lrp-test-4\u0027:"},{"line_number":295,"context_line":"                cmd.LRP(\u0027lrp-test-4-uuid\u0027, \u0027lrp-test-4\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_e08b0265","line":292,"in_reply_to":"7faddb67_b681edfd","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":303,"context_line":"    def test_get_all_provnets(self):"},{"line_number":304,"context_line":"        self.mock_provnets.stop()"},{"line_number":305,"context_line":"        returned \u003d self.rebalancer.get_all_provnets()"},{"line_number":306,"context_line":"        expected \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":307,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_rebalance_gw_chassis_already_rebalanced(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_967cf11f","line":306,"range":{"start_line":306,"start_character":19,"end_line":306,"end_character":24},"updated":"2019-07-12 13:13:50.000000000","message":"nit: {","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":303,"context_line":"    def test_get_all_provnets(self):"},{"line_number":304,"context_line":"        self.mock_provnets.stop()"},{"line_number":305,"context_line":"        returned \u003d self.rebalancer.get_all_provnets()"},{"line_number":306,"context_line":"        expected \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":307,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_rebalance_gw_chassis_already_rebalanced(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_9d0cfba5","line":306,"range":{"start_line":306,"start_character":19,"end_line":306,"end_character":24},"in_reply_to":"7faddb67_967cf11f","updated":"2019-07-15 13:02:31.000000000","message":"Done","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.mock_provnets.stop()"},{"line_number":305,"context_line":"        returned \u003d self.rebalancer.get_all_provnets()"},{"line_number":306,"context_line":"        expected \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":307,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_rebalance_gw_chassis_already_rebalanced(self):"},{"line_number":310,"context_line":"        self.rebalancer.rebalance_gw_chassis({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_f690c545","line":307,"range":{"start_line":307,"start_character":19,"end_line":307,"end_character":22},"updated":"2019-07-12 13:13:50.000000000","message":"Nice, I didn\u0027t know that this method exists :) Thanks for teaching me ;)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6246b2c00612cb8f650d8d257229aff4bf002828","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        self.mock_provnets.stop()"},{"line_number":305,"context_line":"        returned \u003d self.rebalancer.get_all_provnets()"},{"line_number":306,"context_line":"        expected \u003d set([\u0027public\u0027, \u0027public2\u0027])"},{"line_number":307,"context_line":"        self.assertSetEqual(returned, expected)"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def test_rebalance_gw_chassis_already_rebalanced(self):"},{"line_number":310,"context_line":"        self.rebalancer.rebalance_gw_chassis({"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_3dfdc76d","line":307,"range":{"start_line":307,"start_character":19,"end_line":307,"end_character":22},"in_reply_to":"7faddb67_f690c545","updated":"2019-07-15 13:02:31.000000000","message":":)","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        self.mock_master_ports.stop()"},{"line_number":345,"context_line":"        with mock.patch("},{"line_number":346,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":347,"context_line":"            side_effect\u003d[master_ports_1, master_ports_2]), mock.patch("},{"line_number":348,"context_line":"            self.REBALANCER_CLASS + \u0027.get_candidates_for_lrp\u0027,"},{"line_number":349,"context_line":"            return_value\u003dcandidates):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_36aadd70","line":346,"range":{"start_line":346,"start_character":0,"end_line":346,"end_character":60},"updated":"2019-07-12 13:13:50.000000000","message":"ditto about stop mock and mock again","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"aad68e827911b1cbbd5dfa731b5ce4f9d91904a5","unresolved":false,"context_lines":[{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        self.mock_master_ports.stop()"},{"line_number":376,"context_line":"        with mock.patch("},{"line_number":377,"context_line":"            self.REBALANCER_CLASS + \u0027.get_all_master_ports\u0027,"},{"line_number":378,"context_line":"            return_value\u003dmaster_ports), mock.patch("},{"line_number":379,"context_line":"            self.REBALANCER_CLASS + \u0027.get_candidates_for_lrp\u0027,"},{"line_number":380,"context_line":"            return_value\u003dcandidates):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_b6afad7b","line":377,"updated":"2019-07-12 13:13:50.000000000","message":"ditto","commit_id":"b6745848f49ab98a6642f2b0ee1a90aace6dae89"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestGetConnections(base.TestCase):"},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(TestGetConnections, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @mock.patch(\u0027networking_ovn.ovsdb.impl_idl_ovn.get_connection\u0027)"},{"line_number":31,"context_line":"    def test_get_connections(self, mock_conn):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_9eea8ad5","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":47},"updated":"2019-07-17 14:03:17.000000000","message":"This is not needed","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TestGetConnections(base.TestCase):"},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(TestGetConnections, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @mock.patch(\u0027networking_ovn.ovsdb.impl_idl_ovn.get_connection\u0027)"},{"line_number":31,"context_line":"    def test_get_connections(self, mock_conn):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_27c2575a","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":47},"in_reply_to":"7faddb67_9eea8ad5","updated":"2019-07-18 12:14:30.000000000","message":"Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        super(TestGetConnections, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @mock.patch(\u0027networking_ovn.ovsdb.impl_idl_ovn.get_connection\u0027)"},{"line_number":31,"context_line":"    def test_get_connections(self, mock_conn):"},{"line_number":32,"context_line":"        cmd.get_connections()"},{"line_number":33,"context_line":"        expected_calls \u003d ["},{"line_number":34,"context_line":"            mock.call(impl_idl_ovn.OvsdbNbOvnIdl),"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_bed2e626","line":31,"updated":"2019-07-17 14:03:17.000000000","message":"I think the main thing would be to test that when we can\u0027t connect to either DB, None is returned instead. Which makes me think whether it\u0027s something we want to do.","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        super(TestGetConnections, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @mock.patch(\u0027networking_ovn.ovsdb.impl_idl_ovn.get_connection\u0027)"},{"line_number":31,"context_line":"    def test_get_connections(self, mock_conn):"},{"line_number":32,"context_line":"        cmd.get_connections()"},{"line_number":33,"context_line":"        expected_calls \u003d ["},{"line_number":34,"context_line":"            mock.call(impl_idl_ovn.OvsdbNbOvnIdl),"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_a7d887ee","line":31,"in_reply_to":"7faddb67_bed2e626","updated":"2019-07-18 12:14:30.000000000","message":"As per previous file - I\u0027ll assert here if exception is raised while trying to connect to not listening db socket.","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            \u0027--config-file\u0027,"},{"line_number":55,"context_line":"            \u0027foo\u0027,"},{"line_number":56,"context_line":"        ]"},{"line_number":57,"context_line":"        with mock.patch.object(sys, \u0027argv\u0027, test_args), mock.patch("},{"line_number":58,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.get_connections\u0027,"},{"line_number":59,"context_line":"                return_value\u003d(self.nb_idl, self.sb_idl)) as mock_conn:"},{"line_number":60,"context_line":"            cmd.main()"},{"line_number":61,"context_line":"        mock_balancer.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_5e317259","line":58,"range":{"start_line":57,"start_character":56,"end_line":58,"end_character":70},"updated":"2019-07-17 14:03:17.000000000","message":"mock.patch.object(cmd, \u0027get_connections\u0027","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            \u0027--config-file\u0027,"},{"line_number":55,"context_line":"            \u0027foo\u0027,"},{"line_number":56,"context_line":"        ]"},{"line_number":57,"context_line":"        with mock.patch.object(sys, \u0027argv\u0027, test_args), mock.patch("},{"line_number":58,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.get_connections\u0027,"},{"line_number":59,"context_line":"                return_value\u003d(self.nb_idl, self.sb_idl)) as mock_conn:"},{"line_number":60,"context_line":"            cmd.main()"},{"line_number":61,"context_line":"        mock_balancer.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_e7ac3fa0","line":58,"range":{"start_line":57,"start_character":56,"end_line":58,"end_character":70},"in_reply_to":"7faddb67_5e317259","updated":"2019-07-18 12:14:30.000000000","message":"Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        patcher \u003d mock.patch(path, return_value\u003dreturn_value,"},{"line_number":69,"context_line":"                             new_callable\u003dnew_callable)"},{"line_number":70,"context_line":"        patch \u003d patcher.start()"},{"line_number":71,"context_line":"        self.addCleanup(patcher.stop)"},{"line_number":72,"context_line":"        return patch"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_decec258","line":71,"range":{"start_line":71,"start_character":0,"end_line":71,"end_character":37},"updated":"2019-07-17 14:03:17.000000000","message":"You don\u0027t need this, it\u0027s done automatically at https://github.com/openstack/networking-ovn/blob/b0924ba60289412bcfa420f06e266b8413a48ffd/networking_ovn/tests/base.py#L48\n\nYou actually don\u0027t need this whole method as you can call mock.patch().start() directly","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            \u0027lrp-test-5\u0027: cmd.LRP("},{"line_number":103,"context_line":"                \u0027lrp-test-5-uuid\u0027, \u0027lrp-test-5\u0027, \u0027chassis3\u0027, \u0027public2\u0027),"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        self.mock_master_ports \u003d self._start_mock("},{"line_number":106,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.\u0027"},{"line_number":107,"context_line":"            \u0027ChassisRebalancer.get_all_master_ports\u0027,"},{"line_number":108,"context_line":"            return_value\u003dself.master_ports)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_get_avg_per_provnet(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_be58a687","line":107,"range":{"start_line":105,"start_character":33,"end_line":107,"end_character":53},"updated":"2019-07-17 14:03:17.000000000","message":"mock.patch.object(cmd.ChassisRebalancer, \u0027get_all_master_ports\u0027, return_value\u003dself.master_ports).start()","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            \u0027lrp-test-5\u0027: cmd.LRP("},{"line_number":103,"context_line":"                \u0027lrp-test-5-uuid\u0027, \u0027lrp-test-5\u0027, \u0027chassis3\u0027, \u0027public2\u0027),"},{"line_number":104,"context_line":"        }"},{"line_number":105,"context_line":"        self.mock_master_ports \u003d self._start_mock("},{"line_number":106,"context_line":"            \u0027networking_ovn.cmd.rebalance_gw_chassis.\u0027"},{"line_number":107,"context_line":"            \u0027ChassisRebalancer.get_all_master_ports\u0027,"},{"line_number":108,"context_line":"            return_value\u003dself.master_ports)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def test_get_avg_per_provnet(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_c7826300","line":107,"range":{"start_line":105,"start_character":33,"end_line":107,"end_character":53},"in_reply_to":"7faddb67_be58a687","updated":"2019-07-18 12:14:30.000000000","message":"Sorry, I missed that. Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @mock.patch.object(cmd.ChassisRebalancer, \u0027rebalance_gw_chassis\u0027)"},{"line_number":118,"context_line":"    def test_start_avg_zero(self, rebalance):"},{"line_number":119,"context_line":"        with mock.patch.object(cmd.ChassisRebalancer, \u0027get_avg_per_provnet\u0027,"},{"line_number":120,"context_line":"                               return_value\u003d0):"},{"line_number":121,"context_line":"            rebalance.assert_not_called()"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_3eca761a","line":119,"updated":"2019-07-17 14:03:17.000000000","message":"nit: Would be good to have it as a decorator too for consistency","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @mock.patch.object(cmd.ChassisRebalancer, \u0027rebalance_gw_chassis\u0027)"},{"line_number":118,"context_line":"    def test_start_avg_zero(self, rebalance):"},{"line_number":119,"context_line":"        with mock.patch.object(cmd.ChassisRebalancer, \u0027get_avg_per_provnet\u0027,"},{"line_number":120,"context_line":"                               return_value\u003d0):"},{"line_number":121,"context_line":"            rebalance.assert_not_called()"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_87ceab60","line":119,"in_reply_to":"7faddb67_3eca761a","updated":"2019-07-18 12:14:30.000000000","message":"Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            return_value\u003d0), mock.patch.object("},{"line_number":128,"context_line":"                cmd.ChassisRebalancer,"},{"line_number":129,"context_line":"                \u0027get_chassis_with_master_ports\u0027,"},{"line_number":130,"context_line":"                return_value\u003d{}):"},{"line_number":131,"context_line":"            self.rebalancer.start()"},{"line_number":132,"context_line":"            rebalance.assert_not_called()"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_fecffe25","line":130,"updated":"2019-07-17 14:03:17.000000000","message":"ditto","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            return_value\u003d0), mock.patch.object("},{"line_number":128,"context_line":"                cmd.ChassisRebalancer,"},{"line_number":129,"context_line":"                \u0027get_chassis_with_master_ports\u0027,"},{"line_number":130,"context_line":"                return_value\u003d{}):"},{"line_number":131,"context_line":"            self.rebalancer.start()"},{"line_number":132,"context_line":"            rebalance.assert_not_called()"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_a7c96759","line":130,"in_reply_to":"7faddb67_fecffe25","updated":"2019-07-18 12:14:30.000000000","message":"Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6fd08696c06f0ee92f43e0e657b56d481dc76bd0","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            \u0027lrp-test-1\u0027: cmd.LRP("},{"line_number":321,"context_line":"                \u0027lrp-test-1-uuid\u0027, \u0027lrp-test-1\u0027, \u0027chassis1\u0027, \u0027public\u0027),"},{"line_number":322,"context_line":"        }"},{"line_number":323,"context_line":"        self.mock_master_ports.stop()"},{"line_number":324,"context_line":"        with mock.patch.object(cmd.ChassisRebalancer, \u0027get_all_master_ports\u0027,"},{"line_number":325,"context_line":"                               return_value\u003dself.master_ports):"},{"line_number":326,"context_line":"            returned \u003d self.rebalancer.get_candidates_for_lrp("},{"line_number":327,"context_line":"                lrp, \u0027public\u0027)"},{"line_number":328,"context_line":"        expected \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_7ee30ea5","line":325,"range":{"start_line":323,"start_character":0,"end_line":325,"end_character":63},"updated":"2019-07-17 14:03:17.000000000","message":"This is not needed, is it? mock_master_ports call already returns master_ports","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"5af04059326695ddda8968efbeb806ba74fc29d8","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            \u0027lrp-test-1\u0027: cmd.LRP("},{"line_number":321,"context_line":"                \u0027lrp-test-1-uuid\u0027, \u0027lrp-test-1\u0027, \u0027chassis1\u0027, \u0027public\u0027),"},{"line_number":322,"context_line":"        }"},{"line_number":323,"context_line":"        self.mock_master_ports.stop()"},{"line_number":324,"context_line":"        with mock.patch.object(cmd.ChassisRebalancer, \u0027get_all_master_ports\u0027,"},{"line_number":325,"context_line":"                               return_value\u003dself.master_ports):"},{"line_number":326,"context_line":"            returned \u003d self.rebalancer.get_candidates_for_lrp("},{"line_number":327,"context_line":"                lrp, \u0027public\u0027)"},{"line_number":328,"context_line":"        expected \u003d ["}],"source_content_type":"text/x-python","patch_set":15,"id":"7faddb67_67bfefa9","line":325,"range":{"start_line":323,"start_character":0,"end_line":325,"end_character":63},"in_reply_to":"7faddb67_7ee30ea5","updated":"2019-07-18 12:14:30.000000000","message":"Done","commit_id":"b5b2494312bdc057380b9ba32f8fc04bbe23fb97"}],"releasenotes/notes/networking-ovn-rebalance-gw-chassis-e4749b9906432840.yaml":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"351418b4ab9bc4907a740a7af4cdc9572bf17228","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In case of overloaded gateway node it is possible to rebalance LRP associations"},{"line_number":5,"context_line":"    between available chassis. Please be aware that it could lead to potential"},{"line_number":6,"context_line":"    flap of N/S traffic."},{"line_number":7,"context_line":"    Example how to rebalance gateway chassis."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_f372854a","line":4,"range":{"start_line":4,"start_character":67,"end_line":4,"end_character":70},"updated":"2019-11-27 15:56:48.000000000","message":"Maybe we should be more explicit on release notes and just say \"router ports\" (the neutron name) instead of LRP (logical router ports) which is how we call it internally in core OVN.","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c11f0280059698490995aafe2b557403e1f98673","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In case of overloaded gateway node it is possible to rebalance LRP associations"},{"line_number":5,"context_line":"    between available chassis. Please be aware that it could lead to potential"},{"line_number":6,"context_line":"    flap of N/S traffic."},{"line_number":7,"context_line":"    Example how to rebalance gateway chassis."}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_57dd7adb","line":4,"range":{"start_line":4,"start_character":67,"end_line":4,"end_character":70},"in_reply_to":"3fa7e38b_f372854a","updated":"2019-11-28 09:33:37.000000000","message":"done","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"351418b4ab9bc4907a740a7af4cdc9572bf17228","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In case of overloaded gateway node it is possible to rebalance LRP associations"},{"line_number":5,"context_line":"    between available chassis. Please be aware that it could lead to potential"},{"line_number":6,"context_line":"    flap of N/S traffic."},{"line_number":7,"context_line":"    Example how to rebalance gateway chassis."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    $ networking-ovn-rebalance-gw-chassis --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_339edd55","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":8},"updated":"2019-11-27 15:56:48.000000000","message":"data-plane interruptions ?","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c11f0280059698490995aafe2b557403e1f98673","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In case of overloaded gateway node it is possible to rebalance LRP associations"},{"line_number":5,"context_line":"    between available chassis. Please be aware that it could lead to potential"},{"line_number":6,"context_line":"    flap of N/S traffic."},{"line_number":7,"context_line":"    Example how to rebalance gateway chassis."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    $ networking-ovn-rebalance-gw-chassis --config-file /etc/neutron/plugins/ml2/ml2_conf.ini"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"3fa7e38b_b7e5cea6","line":6,"range":{"start_line":6,"start_character":4,"end_line":6,"end_character":8},"in_reply_to":"3fa7e38b_339edd55","updated":"2019-11-28 09:33:37.000000000","message":"done, and its not only related to N/S traffic, so I dropped the comment.","commit_id":"d94d1c981276cac4b63c4449ecdcd4293e4e1aad"}]}
