)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"7b8c4a2f4c2cf86245ea7699650567491c0dac3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"03e4d13f_9eb7e72f","updated":"2022-03-03 09:43:01.000000000","message":"let\u0027s wait until the Z cycle starts","commit_id":"a8a99ab75e8f9a0a4e855b0d34f012157a56a14c"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"d589de87d5f768e7023d7e7b209bcb427a957a75","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"aa0386fc_31401f36","updated":"2022-03-28 12:22:15.000000000","message":"I\u0027ms still the owner of this patch, and I\u0027m still working on it (and also on the patches in the relation chain), could you please stop updating these patches? Thanks","commit_id":"fd4a368ddc05c2591572365d27620e20a7575f55"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"e06aa820_47415f8c","updated":"2022-08-09 21:46:44.000000000","message":"Start of a review of this patch","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"9772521351b03891e2776ca5b1ca9704a6e5d367","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"a3a667db_62ac4c0d","updated":"2022-07-21 19:52:36.000000000","message":"recheck octavia-v2-dsvm-scenario issue with apt mirror: 403  Forbidden [IP: 149.202.160.10 80]\n","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"a3eb51b5ebe189121cfbb2f4aef66c5bd20fc56e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"3c7daec7_e09bd0a9","updated":"2022-08-18 20:39:34.000000000","message":"Let me know what you find on the route advertisement question, then I can re-vote.","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"4a1de78c74e289f6d642bd53277003d4a6e7aa0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1a05a2c6_265af54f","in_reply_to":"3c7daec7_e09bd0a9","updated":"2022-08-19 13:07:50.000000000","message":"So I have refactored the code because of this question.\n\nI have found a way to get the \"owner\" of a network resource (route or rule), the \"proto\" of the resource indicates if the object was created by the kernel (ex a default route when configuring an ip address), by keepalived, by router-advertisement, or by sn admin (which, in the amphora, is Octavia).\nSo in patchset 15 we are only updating/deleting resources that we own, we cannot delete a route announced by ra (or keepalived), the code is way simpler than in the previous patchsets.\n\nThe only resource that cannot be \u0027tagged\u0027 with an owner is the address.\nSo I have renamed the unclear \"ignore\" flag, it is now \"octavia_owned\".\nIgnore means that an address was potentially configured by keepalived and our tool should not have tried to add/delete it.\nNow, if octavia_owned is True it means that the address should be configured by amphora-interface, if it is False it means that this address could be configured by keepalived and should not be considered as a removable address.","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"adde528a2e7f4c73f5c7b64ab870917b0eab2692","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"94469ccc_95559d88","updated":"2022-08-19 16:08:46.000000000","message":"THis does look better. Just one question about a debug log line.","commit_id":"58630d947fd126ceaaf54237498a6d2d15f13e48"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"cf30bd1233d6f20aa1a2168355dd8b6af74b359a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"6349137b_097d2ea0","updated":"2022-08-19 19:58:26.000000000","message":"LGTM","commit_id":"7118e8d56f76a99f19fd0696be3f09b6fb258cb2"}],"octavia/amphorae/backends/utils/interface.py":[{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"b3a03768923b21ec10d37ed654dbd336eac7d8f2","unresolved":true,"context_lines":[{"line_number":83,"context_line":"                if args:"},{"line_number":84,"context_line":"                    command \u003d args[0]"},{"line_number":85,"context_line":"                    if command \u003d\u003d self.ADD and e.code !\u003d errno.EEXIST:"},{"line_number":86,"context_line":"                        msg \u003d \"Cannot call {} {} (with {}): {}\".format("},{"line_number":87,"context_line":"                            method.__name__, command, kwargs, e)"},{"line_number":88,"context_line":"                        if raise_on_error:"},{"line_number":89,"context_line":"                            raise exceptions.AmphoraNetworkConfigException(msg)"},{"line_number":90,"context_line":"                        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"6ccfa4c0_a3790ea9","line":87,"range":{"start_line":86,"start_character":30,"end_line":87,"end_character":64},"updated":"2022-03-25 10:39:01.000000000","message":"To be precise it should be something like f\"Cannot call {method.__name__}({\u0027, \u0027.join(str(a) for a in args)}, {\u0027, \u0027.join(f\u0027{k}\u003d{v}\u0027 for k, v in kwargs.items())}}): {e}\". You call it with *args now.","commit_id":"a8a99ab75e8f9a0a4e855b0d34f012157a56a14c"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"311faae4cf990bf536180c5d149bb59843f061f5","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                if args:"},{"line_number":84,"context_line":"                    command \u003d args[0]"},{"line_number":85,"context_line":"                    if command \u003d\u003d self.ADD and e.code !\u003d errno.EEXIST:"},{"line_number":86,"context_line":"                        msg \u003d \"Cannot call {} {} (with {}): {}\".format("},{"line_number":87,"context_line":"                            method.__name__, command, kwargs, e)"},{"line_number":88,"context_line":"                        if raise_on_error:"},{"line_number":89,"context_line":"                            raise exceptions.AmphoraNetworkConfigException(msg)"},{"line_number":90,"context_line":"                        LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3c01c7b5_7218dfbd","line":87,"range":{"start_line":86,"start_character":30,"end_line":87,"end_character":64},"in_reply_to":"6ccfa4c0_a3790ea9","updated":"2022-08-04 13:28:09.000000000","message":"Done","commit_id":"a8a99ab75e8f9a0a4e855b0d34f012157a56a14c"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"311faae4cf990bf536180c5d149bb59843f061f5","unresolved":true,"context_lines":[{"line_number":173,"context_line":"        ip_network \u003d ipaddress.ip_network(address, strict\u003dFalse)"},{"line_number":174,"context_line":"        return ip_network.compressed"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def up(self, interface):"},{"line_number":177,"context_line":"        LOG.info(\"Setting interface %s up\", interface.name)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        with pyroute2.IPRoute() as ipr:"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f934fd8_0415b1ed","line":176,"range":{"start_line":176,"start_character":4,"end_line":176,"end_character":28},"updated":"2022-08-04 13:28:09.000000000","message":"This huge method is quite complex and should be split up into smaller pieces.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        ip_network \u003d ipaddress.ip_network(address, strict\u003dFalse)"},{"line_number":174,"context_line":"        return ip_network.compressed"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def up(self, interface):"},{"line_number":177,"context_line":"        LOG.info(\"Setting interface %s up\", interface.name)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        with pyroute2.IPRoute() as ipr:"}],"source_content_type":"text/x-python","patch_set":13,"id":"4adfa2be_f01db201","line":176,"range":{"start_line":176,"start_character":4,"end_line":176,"end_character":28},"in_reply_to":"127ba4ca_53777646","updated":"2022-08-18 07:58:48.000000000","message":"Done","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":true,"context_lines":[{"line_number":173,"context_line":"        ip_network \u003d ipaddress.ip_network(address, strict\u003dFalse)"},{"line_number":174,"context_line":"        return ip_network.compressed"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def up(self, interface):"},{"line_number":177,"context_line":"        LOG.info(\"Setting interface %s up\", interface.name)"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        with pyroute2.IPRoute() as ipr:"}],"source_content_type":"text/x-python","patch_set":13,"id":"127ba4ca_53777646","line":176,"range":{"start_line":176,"start_character":4,"end_line":176,"end_character":28},"in_reply_to":"3f934fd8_0415b1ed","updated":"2022-08-09 21:46:44.000000000","message":"+1, I agree we should try to break this down a bit.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"311faae4cf990bf536180c5d149bb59843f061f5","unresolved":true,"context_lines":[{"line_number":245,"context_line":"                # Disabling B104: hardcoded_bind_all_interfaces"},{"line_number":246,"context_line":"                dst \u003d attrs.get("},{"line_number":247,"context_line":"                    \u0027RTA_DST\u0027,"},{"line_number":248,"context_line":"                    \u00270.0.0.0\u0027 if route[\u0027family\u0027] \u003d\u003d 2 else \u0027::\u0027)  # nosec"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"                key \u003d (\"{}/{}\".format(self._normalize_ip_address(dst),"},{"line_number":251,"context_line":"                                      route.get(\u0027dst_len\u0027, 0)),"}],"source_content_type":"text/x-python","patch_set":13,"id":"43065424_f4da53de","line":248,"range":{"start_line":248,"start_character":52,"end_line":248,"end_character":53},"updated":"2022-08-04 13:28:09.000000000","message":"Use socket.AF_INET instead.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                # Disabling B104: hardcoded_bind_all_interfaces"},{"line_number":246,"context_line":"                dst \u003d attrs.get("},{"line_number":247,"context_line":"                    \u0027RTA_DST\u0027,"},{"line_number":248,"context_line":"                    \u00270.0.0.0\u0027 if route[\u0027family\u0027] \u003d\u003d 2 else \u0027::\u0027)  # nosec"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"                key \u003d (\"{}/{}\".format(self._normalize_ip_address(dst),"},{"line_number":251,"context_line":"                                      route.get(\u0027dst_len\u0027, 0)),"}],"source_content_type":"text/x-python","patch_set":13,"id":"021bf0c6_2365b39c","line":248,"range":{"start_line":248,"start_character":52,"end_line":248,"end_character":53},"in_reply_to":"01977722_49dd5552","updated":"2022-08-18 07:58:48.000000000","message":"Done","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":true,"context_lines":[{"line_number":245,"context_line":"                # Disabling B104: hardcoded_bind_all_interfaces"},{"line_number":246,"context_line":"                dst \u003d attrs.get("},{"line_number":247,"context_line":"                    \u0027RTA_DST\u0027,"},{"line_number":248,"context_line":"                    \u00270.0.0.0\u0027 if route[\u0027family\u0027] \u003d\u003d 2 else \u0027::\u0027)  # nosec"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"                key \u003d (\"{}/{}\".format(self._normalize_ip_address(dst),"},{"line_number":251,"context_line":"                                      route.get(\u0027dst_len\u0027, 0)),"}],"source_content_type":"text/x-python","patch_set":13,"id":"01977722_49dd5552","line":248,"range":{"start_line":248,"start_character":52,"end_line":248,"end_character":53},"in_reply_to":"43065424_f4da53de","updated":"2022-08-09 21:46:44.000000000","message":"+1","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":true,"context_lines":[{"line_number":267,"context_line":"                    LOG.debug(\"%s: Adding route %s\", interface.name, route)"},{"line_number":268,"context_line":"                    # Set retry_on_invalid_argument\u003dTrue because the interface"},{"line_number":269,"context_line":"                    # might not be ready after setting its addresses"},{"line_number":270,"context_line":"                    # Note: can we use \u0027replace\u0027 instead of \u0027add\u0027 here?"},{"line_number":271,"context_line":"                    # Set raise_on_error to False, possible invalid"},{"line_number":272,"context_line":"                    # (user-defined) routes from the subnet\u0027s host_routes will"},{"line_number":273,"context_line":"                    # not break the script."}],"source_content_type":"text/x-python","patch_set":13,"id":"52524433_e46843a4","line":270,"updated":"2022-08-09 21:46:44.000000000","message":"Probably don\u0027t still need this note here.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":true,"context_lines":[{"line_number":276,"context_line":"                                      raise_on_error\u003dFalse,"},{"line_number":277,"context_line":"                                      oif\u003didx, **route)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            if not has_dynamic_addr:"},{"line_number":280,"context_line":"                # Remove mandatory/auto/default routes from the list of routes"},{"line_number":281,"context_line":"                # to remove"},{"line_number":282,"context_line":"                for addr in interface.addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"b1ef5dfd_10bb455c","line":279,"updated":"2022-08-09 21:46:44.000000000","message":"You are enabling accept_ra \u003d\u003d 2 above, so how are you making sure you don\u0027t delete default routes discovered via router advertisement?","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":true,"context_lines":[{"line_number":276,"context_line":"                                      raise_on_error\u003dFalse,"},{"line_number":277,"context_line":"                                      oif\u003didx, **route)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"            if not has_dynamic_addr:"},{"line_number":280,"context_line":"                # Remove mandatory/auto/default routes from the list of routes"},{"line_number":281,"context_line":"                # to remove"},{"line_number":282,"context_line":"                for addr in interface.addresses:"}],"source_content_type":"text/x-python","patch_set":13,"id":"b34d1108_c3db3ff2","line":279,"in_reply_to":"b1ef5dfd_10bb455c","updated":"2022-08-18 07:58:48.000000000","message":"I need to doublecheck but in case of non-static configuration, we don\u0027t delete any default routes.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"311faae4cf990bf536180c5d149bb59843f061f5","unresolved":true,"context_lines":[{"line_number":320,"context_line":"                             \u0027gateway\u0027: r[1],"},{"line_number":321,"context_line":"                             \u0027prefsrc\u0027: r[2],"},{"line_number":322,"context_line":"                             \u0027table\u0027: r[3]}"},{"line_number":323,"context_line":"                    route[consts.FAMILY] \u003d self._family(route[consts.DST])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"                    LOG.debug(\"%s: Deleting route %s\", interface.name, route)"},{"line_number":326,"context_line":"                    self._ipr_command(ipr.route, self.DELETE,"}],"source_content_type":"text/x-python","patch_set":13,"id":"311bd187_d99537d0","line":323,"range":{"start_line":323,"start_character":20,"end_line":323,"end_character":74},"updated":"2022-08-04 13:28:09.000000000","message":"Why don\u0027t you include this in the route dict definition above?","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                             \u0027gateway\u0027: r[1],"},{"line_number":321,"context_line":"                             \u0027prefsrc\u0027: r[2],"},{"line_number":322,"context_line":"                             \u0027table\u0027: r[3]}"},{"line_number":323,"context_line":"                    route[consts.FAMILY] \u003d self._family(route[consts.DST])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"                    LOG.debug(\"%s: Deleting route %s\", interface.name, route)"},{"line_number":326,"context_line":"                    self._ipr_command(ipr.route, self.DELETE,"}],"source_content_type":"text/x-python","patch_set":13,"id":"b3976c24_f86ace11","line":323,"range":{"start_line":323,"start_character":20,"end_line":323,"end_character":74},"in_reply_to":"311bd187_d99537d0","updated":"2022-08-18 07:58:48.000000000","message":"moved to the dict","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"41379c81b455ae127ddf0faa8b31494e18678e74","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                key \u003d (attrs.get(\u0027FRA_TABLE\u0027),"},{"line_number":345,"context_line":"                       attrs.get(\u0027FRA_SRC\u0027),"},{"line_number":346,"context_line":"                       rule[\u0027src_len\u0027])"},{"line_number":347,"context_line":"                print(attrs)"},{"line_number":348,"context_line":"                current_rules.append(key)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"            # Add new rules"}],"source_content_type":"text/x-python","patch_set":13,"id":"e38e1880_cd59b81e","line":347,"updated":"2022-08-09 21:46:44.000000000","message":"We probably don\u0027t want this print.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                key \u003d (attrs.get(\u0027FRA_TABLE\u0027),"},{"line_number":345,"context_line":"                       attrs.get(\u0027FRA_SRC\u0027),"},{"line_number":346,"context_line":"                       rule[\u0027src_len\u0027])"},{"line_number":347,"context_line":"                print(attrs)"},{"line_number":348,"context_line":"                current_rules.append(key)"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"            # Add new rules"}],"source_content_type":"text/x-python","patch_set":13,"id":"49b45f3e_1d5dc8b5","line":347,"in_reply_to":"e38e1880_cd59b81e","updated":"2022-08-18 07:58:48.000000000","message":"Done","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"311faae4cf990bf536180c5d149bb59843f061f5","unresolved":true,"context_lines":[{"line_number":364,"context_line":"            if not has_dynamic_addr:"},{"line_number":365,"context_line":"                # Remove old rules"},{"line_number":366,"context_line":"                for r in current_rules:"},{"line_number":367,"context_line":"                    rule \u003d {\u0027table\u0027: r[0],"},{"line_number":368,"context_line":"                            \u0027src\u0027: r[1],"},{"line_number":369,"context_line":"                            \u0027src_len\u0027: r[2]}"},{"line_number":370,"context_line":"                    if rule[consts.SRC]:"},{"line_number":371,"context_line":"                        rule[consts.FAMILY] \u003d self._family(rule[consts.SRC])"},{"line_number":372,"context_line":"                    LOG.debug(\"%s: Deleting rule %s\", interface.name, rule)"}],"source_content_type":"text/x-python","patch_set":13,"id":"89a9c1b3_af9c5610","line":369,"range":{"start_line":367,"start_character":27,"end_line":369,"end_character":44},"updated":"2022-08-04 13:28:09.000000000","message":"Here and in other places: Sometimes you use the string value, other times (like in the line below) you use the constant. You should be consistent and use constants everywhere.","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":false,"context_lines":[{"line_number":364,"context_line":"            if not has_dynamic_addr:"},{"line_number":365,"context_line":"                # Remove old rules"},{"line_number":366,"context_line":"                for r in current_rules:"},{"line_number":367,"context_line":"                    rule \u003d {\u0027table\u0027: r[0],"},{"line_number":368,"context_line":"                            \u0027src\u0027: r[1],"},{"line_number":369,"context_line":"                            \u0027src_len\u0027: r[2]}"},{"line_number":370,"context_line":"                    if rule[consts.SRC]:"},{"line_number":371,"context_line":"                        rule[consts.FAMILY] \u003d self._family(rule[consts.SRC])"},{"line_number":372,"context_line":"                    LOG.debug(\"%s: Deleting rule %s\", interface.name, rule)"}],"source_content_type":"text/x-python","patch_set":13,"id":"67ca1319_bf8a7c62","line":369,"range":{"start_line":367,"start_character":27,"end_line":369,"end_character":44},"in_reply_to":"89a9c1b3_af9c5610","updated":"2022-08-18 07:58:48.000000000","message":"Ack","commit_id":"1e14ab3b4e9f7e5ea10a3890c7518b2685195f3d"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"adde528a2e7f4c73f5c7b64ab870917b0eab2692","unresolved":true,"context_lines":[{"line_number":230,"context_line":"                          address)"},{"line_number":231,"context_line":"                self._ipr_command(ipr.addr, self.ADD, index\u003didx, **address)"},{"line_number":232,"context_line":"            else:"},{"line_number":233,"context_line":"                LOG.debug(\"INGORE!!!\")"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self._wait_tentative(ipr, idx)"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3031aae1_6c8f4708","line":233,"updated":"2022-08-19 16:08:46.000000000","message":"This log entry isn\u0027t actionable or clear. Can we improve this or remove it?","commit_id":"58630d947fd126ceaaf54237498a6d2d15f13e48"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"2ec3b84351c1962099020a49a0e87c44a046347b","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                          address)"},{"line_number":231,"context_line":"                self._ipr_command(ipr.addr, self.ADD, index\u003didx, **address)"},{"line_number":232,"context_line":"            else:"},{"line_number":233,"context_line":"                LOG.debug(\"INGORE!!!\")"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        self._wait_tentative(ipr, idx)"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"67caf7dd_bf99a56c","line":233,"in_reply_to":"3031aae1_6c8f4708","updated":"2022-08-19 16:42:12.000000000","message":"Done","commit_id":"58630d947fd126ceaaf54237498a6d2d15f13e48"}],"octavia/amphorae/backends/utils/interface_file.py":[{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"88137070ae730daf7de9e1f4c95d1b9f0016b60b","unresolved":true,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        if ignore:"},{"line_number":148,"context_line":"            # Keepalived sets this prefixlen for the addresses it maintains"},{"line_number":149,"context_line":"            vip_prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            vip_prefixlen \u003d prefixlen"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5b07db18_c9afd631","line":149,"updated":"2022-08-18 00:19:18.000000000","message":"These get ignored/not used right? If so, maybe just let the passed in prefix length get set?","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"4a1de78c74e289f6d642bd53277003d4a6e7aa0a","unresolved":true,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        if ignore:"},{"line_number":148,"context_line":"            # Keepalived sets this prefixlen for the addresses it maintains"},{"line_number":149,"context_line":"            vip_prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            vip_prefixlen \u003d prefixlen"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9d982c01_b15a0dec","line":149,"in_reply_to":"48653417_a61008b7","updated":"2022-08-19 13:07:50.000000000","message":"I have also simplified this part, all the VIPs are added with the max prefixlen (32 for ipv4, 128 for ipv6)","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"a3eb51b5ebe189121cfbb2f4aef66c5bd20fc56e","unresolved":true,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        if ignore:"},{"line_number":148,"context_line":"            # Keepalived sets this prefixlen for the addresses it maintains"},{"line_number":149,"context_line":"            vip_prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            vip_prefixlen \u003d prefixlen"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"48653417_a61008b7","line":149,"in_reply_to":"4e8024f0_895b1aab","updated":"2022-08-18 20:39:34.000000000","message":"Yeah, maybe add a comment explaining what the expected behavior is for \"ignore\".","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":true,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        if ignore:"},{"line_number":148,"context_line":"            # Keepalived sets this prefixlen for the addresses it maintains"},{"line_number":149,"context_line":"            vip_prefixlen \u003d 32 if ip_version \u003d\u003d 4 else 128"},{"line_number":150,"context_line":"        else:"},{"line_number":151,"context_line":"            vip_prefixlen \u003d prefixlen"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"4e8024f0_895b1aab","line":149,"in_reply_to":"5b07db18_c9afd631","updated":"2022-08-18 07:58:48.000000000","message":"maybe I need to clarify \"ignore\", it means that octavia-interface will not add any routes/addresses in the kernel for such entries, but the entries have to match (addr, prefixlen, etc) what is added by keepalived, so octavia-interface will not remove them because it considers these routes/addresses as unused/old","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"88137070ae730daf7de9e1f4c95d1b9f0016b60b","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        ip_versions \u003d {ip_version}"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if fixed_ips:"},{"line_number":181,"context_line":"            for fixed_ip in fixed_ips:"},{"line_number":182,"context_line":"                ip_addr \u003d fixed_ip[\u0027ip_address\u0027]"},{"line_number":183,"context_line":"                cidr \u003d fixed_ip[\u0027subnet_cidr\u0027]"},{"line_number":184,"context_line":"                ip \u003d ipaddress.ip_address(ip_addr)"}],"source_content_type":"text/x-python","patch_set":14,"id":"51935368_0443d067","line":181,"updated":"2022-08-18 00:19:18.000000000","message":"In this patch, there can be only one IP right? the \"vip\" parameter passed in. Should this move to the multi-vip patch?","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":29244,"name":"Gregory Thiemonge","email":"gthiemon@redhat.com","username":"gthiemonge"},"change_message_id":"88a6ba45493b5d2f81ffc1c640873fdc4a7a878e","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        ip_versions \u003d {ip_version}"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if fixed_ips:"},{"line_number":181,"context_line":"            for fixed_ip in fixed_ips:"},{"line_number":182,"context_line":"                ip_addr \u003d fixed_ip[\u0027ip_address\u0027]"},{"line_number":183,"context_line":"                cidr \u003d fixed_ip[\u0027subnet_cidr\u0027]"},{"line_number":184,"context_line":"                ip \u003d ipaddress.ip_address(ip_addr)"}],"source_content_type":"text/x-python","patch_set":14,"id":"71fdfcfa_bc2e13eb","line":181,"in_reply_to":"51935368_0443d067","updated":"2022-08-18 07:58:48.000000000","message":"yes, this is preliminary work for the multi-vip patch.\nI think this block could be included in this patch, but if there are concerns I could move it.","commit_id":"dffb3b3fee66f47a2de317731f3fc2964585218c"},{"author":{"_account_id":34429,"name":"Tom Weininger","email":"dienste@weinimo.de","username":"tweining"},"change_message_id":"268bf4534329c66a4907f4ebf3cab49eddc83e0d","unresolved":true,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        ip_versions \u003d {ip_version}"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        if fixed_ips:"},{"line_number":173,"context_line":"            for fixed_ip in fixed_ips:"},{"line_number":174,"context_line":"                ip_addr \u003d fixed_ip[\u0027ip_address\u0027]"},{"line_number":175,"context_line":"                cidr \u003d fixed_ip[\u0027subnet_cidr\u0027]"},{"line_number":176,"context_line":"                ip \u003d ipaddress.ip_address(ip_addr)"}],"source_content_type":"text/x-python","patch_set":17,"id":"0dc15244_01e9f254","line":173,"range":{"start_line":172,"start_character":8,"end_line":173,"end_character":38},"updated":"2022-08-22 16:14:38.000000000","message":"You could combine that into one line:\nfor fixed_ip in fixed_ips or ():","commit_id":"7118e8d56f76a99f19fd0696be3f09b6fb258cb2"}]}
