)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":11,"context_line":"defined for subnet the FIP agent gateway port"},{"line_number":12,"context_line":"update will depend on service_types else it"},{"line_number":13,"context_line":"will depend on the subnets configured for the"},{"line_number":14,"context_line":"gateway. Also addresses the routes for IPv6"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2cd3fb3d602066d0dc7cf0c088e363698c45b995"},{"line_number":17,"context_line":"Closes-Bug: #1774463"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"3fa7e38b_7387dcb6","line":14,"range":{"start_line":14,"start_character":9,"end_line":14,"end_character":43},"updated":"2019-09-26 01:36:16.000000000","message":"It has strong correlation to this patch? Or should we split this to small patch?","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"7d763913e6bfa16eebfc733c1c25881ea1b20a13","unresolved":false,"context_lines":[{"line_number":11,"context_line":"defined for subnet the FIP agent gateway port"},{"line_number":12,"context_line":"update will depend on service_types else it"},{"line_number":13,"context_line":"will depend on the subnets configured for the"},{"line_number":14,"context_line":"gateway. Also addresses the routes for IPv6"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2cd3fb3d602066d0dc7cf0c088e363698c45b995"},{"line_number":17,"context_line":"Closes-Bug: #1774463"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"3fa7e38b_61d01155","line":14,"range":{"start_line":14,"start_character":9,"end_line":14,"end_character":43},"in_reply_to":"3fa7e38b_2be0fdcc","updated":"2019-10-01 18:32:38.000000000","message":"Agreed, these things go together and should not be separated.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":11,"context_line":"defined for subnet the FIP agent gateway port"},{"line_number":12,"context_line":"update will depend on service_types else it"},{"line_number":13,"context_line":"will depend on the subnets configured for the"},{"line_number":14,"context_line":"gateway. Also addresses the routes for IPv6"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2cd3fb3d602066d0dc7cf0c088e363698c45b995"},{"line_number":17,"context_line":"Closes-Bug: #1774463"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":30,"id":"3fa7e38b_2be0fdcc","line":14,"range":{"start_line":14,"start_character":9,"end_line":14,"end_character":43},"in_reply_to":"3fa7e38b_7387dcb6","updated":"2019-09-26 17:51:26.000000000","message":"I think it is related and should go together. Don\u0027t need to split it.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"}],"neutron/agent/l3/dvr_fip_ns.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"60ca769744b260091d8c6cd989014a95662a65df","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":167,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":168,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":169,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":170,"context_line":"            new_subnet_info \u003d ("},{"line_number":171,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":172,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fb8cfa7_ba25060b","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":69},"updated":"2019-06-13 15:27:34.000000000","message":"Simply comparing the lengths of these 2 lists seems like it leaves the door open for some interesting corner cases. I wonder if it would make sense to do a deeper set comparison here, asserting that the content of the sets are different based on the subnet UUID\u0027s in each set.\n\nThere could be others, but the case I\u0027m thinking of is where a subnet is removed and another is added in its place before the agent gets to this line. In that scenario you will need to process a new subnet, but comparing only the length of the old and new lists causes us to miss that.","commit_id":"df089aabb6f7a31430352d54dff964103ee37672"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"cc796765b37437e38688e4818df523f75c399224","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":167,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":168,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":169,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":170,"context_line":"            new_subnet_info \u003d ("},{"line_number":171,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":172,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fb8cfa7_b368baf4","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":69},"in_reply_to":"9fb8cfa7_ba25060b","updated":"2019-06-14 17:53:52.000000000","message":"Yes you are right we should be adding cases for handling, subnet removed and also subnet changes.\nSubnet removed and subnet added will be handled in two different transactions when it comes here.\nSo if we handle each of these cases individually it would be fine.","commit_id":"df089aabb6f7a31430352d54dff964103ee37672"},{"author":{"_account_id":26553,"name":"Long Zhang","email":"zhanglong@gohighsec.com","username":"josie.zhang.long"},"change_message_id":"318bc4c23395a1e5484bfee745dcb879a98b093a","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                                # Remove the rule lookup"},{"line_number":459,"context_line":"                                # /0 addresses for IPv6"},{"line_number":460,"context_line":"                                # based on a link-local address IP version."},{"line_number":461,"context_line":"                                ip_lib.delete_ip_rule("},{"line_number":462,"context_line":"                                    fip_ns_name, ip\u003dinterface_cidr,"},{"line_number":463,"context_line":"                                    iif\u003dfip_2_rtr_name, table\u003dtbl_index,"},{"line_number":464,"context_line":"                                    priority\u003dtbl_index)"},{"line_number":465,"context_line":"            self.local_subnets.release(ri.router_id)"},{"line_number":466,"context_line":"            ri.rtr_fip_subnet \u003d None"},{"line_number":467,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9fb8cfa7_3aefdbe9","line":464,"range":{"start_line":461,"start_character":2,"end_line":464,"end_character":55},"updated":"2019-06-13 10:40:18.000000000","message":"these code is same on above.\nso maybe it can be merged.","commit_id":"df089aabb6f7a31430352d54dff964103ee37672"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"fe2e54c91f23086fcb599fe1a9349055f55f2fd4","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                                # Remove the rule lookup"},{"line_number":459,"context_line":"                                # /0 addresses for IPv6"},{"line_number":460,"context_line":"                                # based on a link-local address IP version."},{"line_number":461,"context_line":"                                ip_lib.delete_ip_rule("},{"line_number":462,"context_line":"                                    fip_ns_name, ip\u003dinterface_cidr,"},{"line_number":463,"context_line":"                                    iif\u003dfip_2_rtr_name, table\u003dtbl_index,"},{"line_number":464,"context_line":"                                    priority\u003dtbl_index)"},{"line_number":465,"context_line":"            self.local_subnets.release(ri.router_id)"},{"line_number":466,"context_line":"            ri.rtr_fip_subnet \u003d None"},{"line_number":467,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9fb8cfa7_1ac1b2e5","line":464,"range":{"start_line":461,"start_character":2,"end_line":464,"end_character":55},"in_reply_to":"9fb8cfa7_3aefdbe9","updated":"2019-06-13 15:07:48.000000000","message":"agreed","commit_id":"df089aabb6f7a31430352d54dff964103ee37672"},{"author":{"_account_id":26553,"name":"Long Zhang","email":"zhanglong@gohighsec.com","username":"josie.zhang.long"},"change_message_id":"6403ac6997900c69e287f2ebbb38d54ca81c5be4","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                    new_agent_port_subnets]):"},{"line_number":190,"context_line":"                LOG.debug(\"FIP Agent port subnets are identical\")"},{"line_number":191,"context_line":"                return False"},{"line_number":192,"context_line":"            else:"},{"line_number":193,"context_line":"                LOG.debug(\"FIP Agent port subnets are not identical\")"},{"line_number":194,"context_line":"                return True"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9fb8cfa7_a7ee2ab2","line":192,"range":{"start_line":192,"start_character":9,"end_line":192,"end_character":12},"updated":"2019-06-17 01:43:00.000000000","message":"is this blank space possible?","commit_id":"af6f5a703a25eb4866bdeaa7df7b1ce3171f4c9b"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5dd1f08d0ec39b0985c338a12ea6c9be597b27e4","unresolved":false,"context_lines":[{"line_number":40,"context_line":"ROUTER_2_FIP_DEV_PREFIX \u003d namespaces.ROUTER_2_FIP_DEV_PREFIX"},{"line_number":41,"context_line":"# Route Table index for FIPs"},{"line_number":42,"context_line":"FIP_RT_TBL \u003d 16"},{"line_number":43,"context_line":"FIP_IPV6_RT_TBL \u003d 16"},{"line_number":44,"context_line":"# Rule priority range for FIPs"},{"line_number":45,"context_line":"FIP_PR_START \u003d 32768"},{"line_number":46,"context_line":"FIP_PR_END \u003d FIP_PR_START + 40000"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_08758898","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":20},"updated":"2019-06-19 18:32:10.000000000","message":"Can we use FIP_RT_TABLE instead of defining a new constant?","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"bada8fb302fb4c99b107f659fe0ea0d7b7b89edd","unresolved":false,"context_lines":[{"line_number":40,"context_line":"ROUTER_2_FIP_DEV_PREFIX \u003d namespaces.ROUTER_2_FIP_DEV_PREFIX"},{"line_number":41,"context_line":"# Route Table index for FIPs"},{"line_number":42,"context_line":"FIP_RT_TBL \u003d 16"},{"line_number":43,"context_line":"FIP_IPV6_RT_TBL \u003d 16"},{"line_number":44,"context_line":"# Rule priority range for FIPs"},{"line_number":45,"context_line":"FIP_PR_START \u003d 32768"},{"line_number":46,"context_line":"FIP_PR_END \u003d FIP_PR_START + 40000"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_635f870e","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":20},"in_reply_to":"9fb8cfa7_08758898","updated":"2019-06-19 19:15:35.000000000","message":"I just used another variable to distinguish the two for the readers.\nI am open to change if it is confusing.","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2c2d1a70647489b1f79f2303884d82cd2d81ca9b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"ROUTER_2_FIP_DEV_PREFIX \u003d namespaces.ROUTER_2_FIP_DEV_PREFIX"},{"line_number":41,"context_line":"# Route Table index for FIPs"},{"line_number":42,"context_line":"FIP_RT_TBL \u003d 16"},{"line_number":43,"context_line":"FIP_IPV6_RT_TBL \u003d 16"},{"line_number":44,"context_line":"# Rule priority range for FIPs"},{"line_number":45,"context_line":"FIP_PR_START \u003d 32768"},{"line_number":46,"context_line":"FIP_PR_END \u003d FIP_PR_START + 40000"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_a379ff2f","line":43,"range":{"start_line":43,"start_character":0,"end_line":43,"end_character":20},"in_reply_to":"9fb8cfa7_635f870e","updated":"2019-06-19 19:32:39.000000000","message":"Makes sense, this is just a nit :)","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5dd1f08d0ec39b0985c338a12ea6c9be597b27e4","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":170,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":171,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":172,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":173,"context_line":"            new_subnet_info \u003d ("},{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_c858d0fb","line":172,"range":{"start_line":172,"start_character":11,"end_line":172,"end_character":68},"updated":"2019-06-19 18:32:10.000000000","message":"My comments on PS17 still apply. I think this should be a set operation rather than comparing the length of lists. Comparing the length of the lists is too superficial, what we\u0027re really after is whether there are new subnets to process. This condition can evaluate to False simply because the same number of subnets still applies, even though there is a new subnet we need to process. I\u0027m thinking of something along these lines:\n\nold_agent_port_subnets \u003d set(self.agent_gateway_port.get(\u0027subnets\u0027, []))\nnew_agent_port_subnets \u003d set(agent_gateway_port.get(\u0027subnets\u0027, []))\n\nif len(new_agent_port_subnets.difference(old_agent_port_subnets) \u003e 0:\n...\n...\n...","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"2c2d1a70647489b1f79f2303884d82cd2d81ca9b","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":170,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":171,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":172,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":173,"context_line":"            new_subnet_info \u003d ("},{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_e387f70e","line":172,"range":{"start_line":172,"start_character":11,"end_line":172,"end_character":68},"in_reply_to":"9fb8cfa7_2388af6f","updated":"2019-06-19 19:32:39.000000000","message":"OK, with a second look at this I see what you\u0027re saying. I still think a set difference operation to identify new subnets might be a little more clear and allow us to express the same logic with fewer lines of code and if...elif blocks.","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"bada8fb302fb4c99b107f659fe0ea0d7b7b89edd","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":170,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":171,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":172,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":173,"context_line":"            new_subnet_info \u003d ("},{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_2388af6f","line":172,"range":{"start_line":172,"start_character":11,"end_line":172,"end_character":68},"in_reply_to":"9fb8cfa7_c858d0fb","updated":"2019-06-19 19:15:35.000000000","message":"The first level of comparision is the size of the subnets, and then we do check if the items in the subnet list that was greater is it still in the old list or not.\nSee the code  in #L173.","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"107f3f60709b14e9f24d1c6c43514b54302e26ad","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):"},{"line_number":170,"context_line":"        old_agent_port_subnets \u003d self.agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":171,"context_line":"        new_agent_port_subnets \u003d agent_gateway_port.get(\u0027subnets\u0027, [])"},{"line_number":172,"context_line":"        if len(new_agent_port_subnets) \u003e len(old_agent_port_subnets):"},{"line_number":173,"context_line":"            new_subnet_info \u003d ("},{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"}],"source_content_type":"text/x-python","patch_set":21,"id":"9fb8cfa7_4d0e16e6","line":172,"range":{"start_line":172,"start_character":11,"end_line":172,"end_character":68},"in_reply_to":"9fb8cfa7_c858d0fb","updated":"2019-06-20 22:03:17.000000000","message":"def check_for_new_subnets_in_agent_gateway_port(self, agent_gateway_port):\n        old_agent_port_subnets \u003d set(self.agent_gateway_port[\u0027subnets\u0027])\n        new_agent_port_subnets \u003d set(agent_gateway_port[\u0027subnets\u0027])\n        if len(old_agent_port_subnets.difference(new_agent_port_subnets)) \u003e 0:\n            return True\n        elif len(new_agent_port_subnets.difference(old_agent_port_subnets)) \u003e 0:\n            return True\n        elif len(new_agent_port_subnets.difference(old_agent_port_subnets)) \u003d\u003d 0:\n            return False\n        else:\n            return False\n\nGenerates a TypeError: unhashable type: dict","commit_id":"b02a30f46feabe6d7819f6c876570fb565746534"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"},{"line_number":176,"context_line":"            LOG.debug(\"FIP Agent gw port new subnet info: \""},{"line_number":177,"context_line":"                      \"%s\", new_subnet_info[0])"},{"line_number":178,"context_line":"            return True"},{"line_number":179,"context_line":"        elif len(old_agent_port_subnets) \u003e len(new_agent_port_subnets):"},{"line_number":180,"context_line":"            removed_subnet_info \u003d ("}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_733d9c29","line":177,"range":{"start_line":177,"start_character":22,"end_line":177,"end_character":26},"updated":"2019-09-26 01:36:16.000000000","message":"Moving this to the former line should not exceed width 79.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                [item for item in new_agent_port_subnets if item not in"},{"line_number":175,"context_line":"                    old_agent_port_subnets])"},{"line_number":176,"context_line":"            LOG.debug(\"FIP Agent gw port new subnet info: \""},{"line_number":177,"context_line":"                      \"%s\", new_subnet_info[0])"},{"line_number":178,"context_line":"            return True"},{"line_number":179,"context_line":"        elif len(old_agent_port_subnets) \u003e len(new_agent_port_subnets):"},{"line_number":180,"context_line":"            removed_subnet_info \u003d ("}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_4be3f9d9","line":177,"range":{"start_line":177,"start_character":22,"end_line":177,"end_character":26},"in_reply_to":"3fa7e38b_733d9c29","updated":"2019-09-26 17:51:26.000000000","message":"Ok, will fix it.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                [item for item in old_agent_port_subnets if item not in"},{"line_number":182,"context_line":"                    new_agent_port_subnets])"},{"line_number":183,"context_line":"            LOG.debug(\"FIP Agent gw port removed subnet info: \""},{"line_number":184,"context_line":"                      \"%s\", removed_subnet_info)"},{"line_number":185,"context_line":"            return True"},{"line_number":186,"context_line":"        elif len(old_agent_port_subnets) \u003d\u003d len(new_agent_port_subnets):"},{"line_number":187,"context_line":"            LOG.debug(\"FIP Agent gw port subnets were not added or removed\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_1346a8c1","line":184,"range":{"start_line":184,"start_character":22,"end_line":184,"end_character":26},"updated":"2019-09-26 01:36:16.000000000","message":"ditto","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                [item for item in old_agent_port_subnets if item not in"},{"line_number":182,"context_line":"                    new_agent_port_subnets])"},{"line_number":183,"context_line":"            LOG.debug(\"FIP Agent gw port removed subnet info: \""},{"line_number":184,"context_line":"                      \"%s\", removed_subnet_info)"},{"line_number":185,"context_line":"            return True"},{"line_number":186,"context_line":"        elif len(old_agent_port_subnets) \u003d\u003d len(new_agent_port_subnets):"},{"line_number":187,"context_line":"            LOG.debug(\"FIP Agent gw port subnets were not added or removed\")"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_ebe505dd","line":184,"range":{"start_line":184,"start_character":22,"end_line":184,"end_character":26},"in_reply_to":"3fa7e38b_1346a8c1","updated":"2019-09-26 17:51:26.000000000","message":"ok will fix it.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            return True"},{"line_number":186,"context_line":"        elif len(old_agent_port_subnets) \u003d\u003d len(new_agent_port_subnets):"},{"line_number":187,"context_line":"            LOG.debug(\"FIP Agent gw port subnets were not added or removed\")"},{"line_number":188,"context_line":"            if ([a \u003d\u003d b for a in old_agent_port_subnets for b in"},{"line_number":189,"context_line":"                    new_agent_port_subnets]):"},{"line_number":190,"context_line":"                LOG.debug(\"FIP Agent port subnets are identical\")"},{"line_number":191,"context_line":"                return False"},{"line_number":192,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d3633041","line":189,"range":{"start_line":188,"start_character":16,"end_line":189,"end_character":43},"updated":"2019-09-26 01:36:16.000000000","message":"This is my test, the none empty list will always be True. Did you miss any() for this condition? And the items\u0027 order should be considered, or not?\n\n\u003e\u003e\u003e x \u003d [1, 2, 3]\n\u003e\u003e\u003e y \u003d [3, 2, 1]\n\u003e\u003e\u003e [a \u003d\u003d b for a in x for b in y]\n[False, False, True, False, True, False, True, False, False]\n\u003e\u003e\u003e y \u003d [1, 2, 3]\n\u003e\u003e\u003e [a \u003d\u003d b for a in x for b in y]\n[True, False, False, False, True, False, False, False, True]\n\u003e\u003e\u003e y \u003d [4, 5, 6]\n\u003e\u003e\u003e [a \u003d\u003d b for a in x for b in y]\n[False, False, False, False, False, False, False, False, False]","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            return True"},{"line_number":186,"context_line":"        elif len(old_agent_port_subnets) \u003d\u003d len(new_agent_port_subnets):"},{"line_number":187,"context_line":"            LOG.debug(\"FIP Agent gw port subnets were not added or removed\")"},{"line_number":188,"context_line":"            if ([a \u003d\u003d b for a in old_agent_port_subnets for b in"},{"line_number":189,"context_line":"                    new_agent_port_subnets]):"},{"line_number":190,"context_line":"                LOG.debug(\"FIP Agent port subnets are identical\")"},{"line_number":191,"context_line":"                return False"},{"line_number":192,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_8bed71b8","line":189,"range":{"start_line":188,"start_character":16,"end_line":189,"end_character":43},"in_reply_to":"3fa7e38b_d3633041","updated":"2019-09-26 17:51:26.000000000","message":"Let me check.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":370,"context_line":"            is_ipv6\u003dFalse)"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def _update_gateway_route(self, agent_gateway_port,"},{"line_number":373,"context_line":"                              interface_name, tbl_index, ipversion):"},{"line_number":374,"context_line":"        ns_name \u003d self.get_name()"},{"line_number":375,"context_line":"        ipd \u003d ip_lib.IPDevice(interface_name, namespace\u003dns_name)"},{"line_number":376,"context_line":"        # If the \u0027fg-\u0027 device doesn\u0027t exist in the namespace then trying"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_939cd80e","line":373,"range":{"start_line":373,"start_character":57,"end_line":373,"end_character":66},"updated":"2019-09-26 01:36:16.000000000","message":"nit: ip_version looks more clear.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"}],"neutron/agent/l3/dvr_local_router.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d077a1163c10eee9d96d7592c4dd3dbf4d19f6a1","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            rtr_2_fip_device_cidrs \u003d self._get_rtr_2_fip_cidrs()"},{"line_number":677,"context_line":"            for subnet in router_port[\u0027subnets\u0027]:"},{"line_number":678,"context_line":"                rtr_port_cidr \u003d subnet[\u0027cidr\u0027]"},{"line_number":679,"context_line":"                ipversion \u003d common_utils.get_ip_version(rtr_port_cidr)"},{"line_number":680,"context_line":"                if ipversion \u003d\u003d lib_constants.IP_VERSION_4:"},{"line_number":681,"context_line":"                    v4_rtr_2_fip_ip \u003d ("},{"line_number":682,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":683,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":684,"context_line":"                    if v4_rtr_2_fip_ip:"},{"line_number":685,"context_line":"                        device.route.delete_route("},{"line_number":686,"context_line":"                            rtr_port_cidr, via\u003dstr(v4_rtr_2_fip_ip))"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    v6_rtr_2_fip_ip \u003d ("},{"line_number":689,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":690,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":691,"context_line":"                    if v6_rtr_2_fip_ip:"},{"line_number":692,"context_line":"                        device.route.delete_route("},{"line_number":693,"context_line":"                            rtr_port_cidr, via\u003dstr(v6_rtr_2_fip_ip))"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def _get_interface_ip_from_cidr_and_version("},{"line_number":696,"context_line":"            self, interface_cidrs, ipversion):"}],"source_content_type":"text/x-python","patch_set":28,"id":"7faddb67_8c9d640a","line":693,"range":{"start_line":679,"start_character":16,"end_line":693,"end_character":68},"updated":"2019-09-05 16:43:51.000000000","message":"Do we need this if/else block? Could we do it like this:\n\nrtr_2_fip_ip \u003d (\n    self._get_interface_ip_from_cidr_and_version(\n                            rtr_2_fip_device_cidrs, \n                            ipversion))\nif rtr_2_fip_ip:\n    device.route.delete_route(\n        rtr_port_cidr,\n        via\u003dstr(rtr_2_fip_ip))\n\n?\n\nI don\u0027t see a distinction between IPv4 and IPv6 logic here.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"7ced1f1e298aedd363a9968670e0bdc1b2b7dabf","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            rtr_2_fip_device_cidrs \u003d self._get_rtr_2_fip_cidrs()"},{"line_number":677,"context_line":"            for subnet in router_port[\u0027subnets\u0027]:"},{"line_number":678,"context_line":"                rtr_port_cidr \u003d subnet[\u0027cidr\u0027]"},{"line_number":679,"context_line":"                ipversion \u003d common_utils.get_ip_version(rtr_port_cidr)"},{"line_number":680,"context_line":"                if ipversion \u003d\u003d lib_constants.IP_VERSION_4:"},{"line_number":681,"context_line":"                    v4_rtr_2_fip_ip \u003d ("},{"line_number":682,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":683,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":684,"context_line":"                    if v4_rtr_2_fip_ip:"},{"line_number":685,"context_line":"                        device.route.delete_route("},{"line_number":686,"context_line":"                            rtr_port_cidr, via\u003dstr(v4_rtr_2_fip_ip))"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    v6_rtr_2_fip_ip \u003d ("},{"line_number":689,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":690,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":691,"context_line":"                    if v6_rtr_2_fip_ip:"},{"line_number":692,"context_line":"                        device.route.delete_route("},{"line_number":693,"context_line":"                            rtr_port_cidr, via\u003dstr(v6_rtr_2_fip_ip))"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def _get_interface_ip_from_cidr_and_version("},{"line_number":696,"context_line":"            self, interface_cidrs, ipversion):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_b78572d1","line":693,"range":{"start_line":679,"start_character":16,"end_line":693,"end_character":68},"in_reply_to":"3fa7e38b_6ee2ca03","updated":"2019-09-23 22:19:56.000000000","message":"Yes I got what you are saying. Yes it can be fixed.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"80bfa5531e5d21dbbb038b7228adda50804e2c27","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            rtr_2_fip_device_cidrs \u003d self._get_rtr_2_fip_cidrs()"},{"line_number":677,"context_line":"            for subnet in router_port[\u0027subnets\u0027]:"},{"line_number":678,"context_line":"                rtr_port_cidr \u003d subnet[\u0027cidr\u0027]"},{"line_number":679,"context_line":"                ipversion \u003d common_utils.get_ip_version(rtr_port_cidr)"},{"line_number":680,"context_line":"                if ipversion \u003d\u003d lib_constants.IP_VERSION_4:"},{"line_number":681,"context_line":"                    v4_rtr_2_fip_ip \u003d ("},{"line_number":682,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":683,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":684,"context_line":"                    if v4_rtr_2_fip_ip:"},{"line_number":685,"context_line":"                        device.route.delete_route("},{"line_number":686,"context_line":"                            rtr_port_cidr, via\u003dstr(v4_rtr_2_fip_ip))"},{"line_number":687,"context_line":"                else:"},{"line_number":688,"context_line":"                    v6_rtr_2_fip_ip \u003d ("},{"line_number":689,"context_line":"                        self._get_interface_ip_from_cidr_and_version("},{"line_number":690,"context_line":"                            rtr_2_fip_device_cidrs, ipversion))"},{"line_number":691,"context_line":"                    if v6_rtr_2_fip_ip:"},{"line_number":692,"context_line":"                        device.route.delete_route("},{"line_number":693,"context_line":"                            rtr_port_cidr, via\u003dstr(v6_rtr_2_fip_ip))"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def _get_interface_ip_from_cidr_and_version("},{"line_number":696,"context_line":"            self, interface_cidrs, ipversion):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_6ee2ca03","line":693,"range":{"start_line":679,"start_character":16,"end_line":693,"end_character":68},"in_reply_to":"7faddb67_8c9d640a","updated":"2019-09-23 19:24:33.000000000","message":"Does it not depend on the \u0027version\u0027 that we are passing to the _get_interface_ip_from_cidr_and_version.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"7d763913e6bfa16eebfc733c1c25881ea1b20a13","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            self, ex_gw_port, fip_agent_port):"},{"line_number":767,"context_line":"        ex_gw_fixed_ips \u003d ex_gw_port[\u0027fixed_ips\u0027]"},{"line_number":768,"context_line":"        fip_gw_fixed_ips \u003d fip_agent_port[\u0027fixed_ips\u0027]"},{"line_number":769,"context_line":"        # If a subnet has service_types defined for"},{"line_number":770,"context_line":"        # floatingip_agent_gateway ports, then those"},{"line_number":771,"context_line":"        # subnets are part of the extra_subnets list in"},{"line_number":772,"context_line":"        # the external gateway dict being passed to the"},{"line_number":773,"context_line":"        # agent."},{"line_number":774,"context_line":"        ex_gw_extra_subnets \u003d ex_gw_port.get(\u0027extra_subnets\u0027, [])"},{"line_number":775,"context_line":"        ex_gw_subnet_ids \u003d []"},{"line_number":776,"context_line":"        ex_gw_extra_subnet_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_c1c46562","line":773,"range":{"start_line":769,"start_character":8,"end_line":773,"end_character":16},"updated":"2019-10-01 18:32:38.000000000","message":"I\u0027m trying to understand why the use of service_types on a subnet matters here. It\u0027s not clear to me how extra_subnets is relevant here. Could you elaborate?","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"bb4eedd563efcaf9f2e9889b3270023d63a250df","unresolved":false,"context_lines":[{"line_number":766,"context_line":"            self, ex_gw_port, fip_agent_port):"},{"line_number":767,"context_line":"        ex_gw_fixed_ips \u003d ex_gw_port[\u0027fixed_ips\u0027]"},{"line_number":768,"context_line":"        fip_gw_fixed_ips \u003d fip_agent_port[\u0027fixed_ips\u0027]"},{"line_number":769,"context_line":"        # If a subnet has service_types defined for"},{"line_number":770,"context_line":"        # floatingip_agent_gateway ports, then those"},{"line_number":771,"context_line":"        # subnets are part of the extra_subnets list in"},{"line_number":772,"context_line":"        # the external gateway dict being passed to the"},{"line_number":773,"context_line":"        # agent."},{"line_number":774,"context_line":"        ex_gw_extra_subnets \u003d ex_gw_port.get(\u0027extra_subnets\u0027, [])"},{"line_number":775,"context_line":"        ex_gw_subnet_ids \u003d []"},{"line_number":776,"context_line":"        ex_gw_extra_subnet_ids \u003d []"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_b45dc1ea","line":773,"range":{"start_line":769,"start_character":8,"end_line":773,"end_character":16},"in_reply_to":"3fa7e38b_c1c46562","updated":"2019-10-03 18:05:01.000000000","message":"This is required for the agent port to get updated or recreated based on the service_type subnets.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"            if name_generator and interface_name is None:"},{"line_number":1088,"context_line":"                device_name \u003d name_generator(p[\u0027id\u0027])"},{"line_number":1089,"context_line":"            if interface_name and name_generator is None:"},{"line_number":1090,"context_line":"                device_name \u003d interface_name"},{"line_number":1091,"context_line":"            ip_cidrs \u003d common_utils.fixed_ip_cidrs(p[\u0027fixed_ips\u0027])"},{"line_number":1092,"context_line":"            port_as_marks \u003d self.get_port_address_scope_mark(p)"},{"line_number":1093,"context_line":"            for ip_version in {common_utils.get_ip_version(cidr)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_d3649024","line":1090,"updated":"2019-09-26 01:36:16.000000000","message":"what value will the device_name have for the default param \"name_generator\u003dNone, interface_name\u003dNone\" ?","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"            if name_generator and interface_name is None:"},{"line_number":1088,"context_line":"                device_name \u003d name_generator(p[\u0027id\u0027])"},{"line_number":1089,"context_line":"            if interface_name and name_generator is None:"},{"line_number":1090,"context_line":"                device_name \u003d interface_name"},{"line_number":1091,"context_line":"            ip_cidrs \u003d common_utils.fixed_ip_cidrs(p[\u0027fixed_ips\u0027])"},{"line_number":1092,"context_line":"            port_as_marks \u003d self.get_port_address_scope_mark(p)"},{"line_number":1093,"context_line":"            for ip_version in {common_utils.get_ip_version(cidr)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_ab414dab","line":1090,"in_reply_to":"3fa7e38b_d3649024","updated":"2019-09-26 17:51:26.000000000","message":"Good question, I need to check, since I reused the existing code that passes the name_generator.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"}],"neutron/common/_constants.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d077a1163c10eee9d96d7592c4dd3dbf4d19f6a1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPTABLES_RANDOM_FULLY_VERSION \u003d \u00271.6.2\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# FIP agent gateway port subnet service_type"},{"line_number":69,"context_line":"FIP_AGENT_GW_SUBNET_SERVICE_TYPE \u003d \"network:floatingip_agent_gateway\""}],"source_content_type":"text/x-python","patch_set":28,"id":"7faddb67_8c6b24ee","line":69,"updated":"2019-09-05 16:43:51.000000000","message":"There\u0027s already a constant for this https://github.com/openstack/neutron-lib/blob/cb44b5dc009bcc105f9c2b2adca1073ba1e08def/neutron_lib/constants.py#L58\n\nThe service types match up with device_owner, we can just use that.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"80bfa5531e5d21dbbb038b7228adda50804e2c27","unresolved":false,"context_lines":[{"line_number":66,"context_line":"IPTABLES_RANDOM_FULLY_VERSION \u003d \u00271.6.2\u0027"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"# FIP agent gateway port subnet service_type"},{"line_number":69,"context_line":"FIP_AGENT_GW_SUBNET_SERVICE_TYPE \u003d \"network:floatingip_agent_gateway\""}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_6ecbaa71","line":69,"in_reply_to":"7faddb67_8c6b24ee","updated":"2019-09-23 19:24:33.000000000","message":"Yes we can use the existing constant. I will fix it.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"}],"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"82cf2f67f1c86941daa69085e797352552dd1f4a","unresolved":false,"context_lines":[{"line_number":988,"context_line":"            agent_port \u003d self._get_agent_gw_ports_exist_for_network("},{"line_number":989,"context_line":"                context, network_id, host, l3_agent_db[\u0027id\u0027])"},{"line_number":990,"context_line":"            if not agent_port:"},{"line_number":991,"context_line":"                ext_net_subnet_info \u003d ("},{"line_number":992,"context_line":"                    self._core_plugin._get_subnets_by_network("},{"line_number":993,"context_line":"                        context, network_id))"},{"line_number":994,"context_line":"                ext_net_subnets \u003d []"},{"line_number":995,"context_line":"                for s in ext_net_subnet_info:"},{"line_number":996,"context_line":"                    if not s[\u0027gateway_ip\u0027]:"},{"line_number":997,"context_line":"                        continue"},{"line_number":998,"context_line":"                    ext_net_subnets.append({\u0027subnet_id\u0027: s[\u0027id\u0027]})"},{"line_number":999,"context_line":"                subnet_info \u003d (ext_net_subnets or const.ATTR_NOT_SPECIFIED)"},{"line_number":1000,"context_line":"                LOG.info(\"Floating IP Agent Gateway port does not exist, \""},{"line_number":1001,"context_line":"                         \"creating one\")"},{"line_number":1002,"context_line":"                port_data \u003d {\u0027tenant_id\u0027: \u0027\u0027,"},{"line_number":1003,"context_line":"                             \u0027network_id\u0027: network_id,"},{"line_number":1004,"context_line":"                             \u0027fixed_ips\u0027: subnet_info,"},{"line_number":1005,"context_line":"                             \u0027device_id\u0027: l3_agent_db[\u0027id\u0027],"},{"line_number":1006,"context_line":"                             \u0027device_owner\u0027: const.DEVICE_OWNER_AGENT_GW,"},{"line_number":1007,"context_line":"                             portbindings.HOST_ID: host,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_77286ae1","line":1004,"range":{"start_line":991,"start_character":0,"end_line":1004,"end_character":54},"updated":"2019-06-07 15:28:21.000000000","message":"How would this handle situations where you are upgrading, you have existing router, dual-stack external network, and you want to start doing distributed ingress/egress for IPv6?\n\nIt seems like this assumes a \"green-field\" FIP gateway creation. We don\u0027t seem to be handling the case where you have an existing FIP gateway port that needs to have an IPv6 address added to it.","commit_id":"233ba3c881a857dd8404502a29ce51b3086e75da"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"1ef9fd9f1cedd78c47633debb293fdabeba57913","unresolved":false,"context_lines":[{"line_number":988,"context_line":"            agent_port \u003d self._get_agent_gw_ports_exist_for_network("},{"line_number":989,"context_line":"                context, network_id, host, l3_agent_db[\u0027id\u0027])"},{"line_number":990,"context_line":"            if not agent_port:"},{"line_number":991,"context_line":"                ext_net_subnet_info \u003d ("},{"line_number":992,"context_line":"                    self._core_plugin._get_subnets_by_network("},{"line_number":993,"context_line":"                        context, network_id))"},{"line_number":994,"context_line":"                ext_net_subnets \u003d []"},{"line_number":995,"context_line":"                for s in ext_net_subnet_info:"},{"line_number":996,"context_line":"                    if not s[\u0027gateway_ip\u0027]:"},{"line_number":997,"context_line":"                        continue"},{"line_number":998,"context_line":"                    ext_net_subnets.append({\u0027subnet_id\u0027: s[\u0027id\u0027]})"},{"line_number":999,"context_line":"                subnet_info \u003d (ext_net_subnets or const.ATTR_NOT_SPECIFIED)"},{"line_number":1000,"context_line":"                LOG.info(\"Floating IP Agent Gateway port does not exist, \""},{"line_number":1001,"context_line":"                         \"creating one\")"},{"line_number":1002,"context_line":"                port_data \u003d {\u0027tenant_id\u0027: \u0027\u0027,"},{"line_number":1003,"context_line":"                             \u0027network_id\u0027: network_id,"},{"line_number":1004,"context_line":"                             \u0027fixed_ips\u0027: subnet_info,"},{"line_number":1005,"context_line":"                             \u0027device_id\u0027: l3_agent_db[\u0027id\u0027],"},{"line_number":1006,"context_line":"                             \u0027device_owner\u0027: const.DEVICE_OWNER_AGENT_GW,"},{"line_number":1007,"context_line":"                             portbindings.HOST_ID: host,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_887efcac","line":1004,"range":{"start_line":991,"start_character":0,"end_line":1004,"end_character":54},"in_reply_to":"9fb8cfa7_77286ae1","updated":"2019-06-10 22:32:33.000000000","message":"Patch set 13 addresses the upgrade path for the fip agent gateway port based on the external network.","commit_id":"233ba3c881a857dd8404502a29ce51b3086e75da"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"f436906c1ad7adc30b55ae739f8bef90023a96e0","unresolved":false,"context_lines":[{"line_number":988,"context_line":"            agent_port \u003d self._get_agent_gw_ports_exist_for_network("},{"line_number":989,"context_line":"                context, network_id, host, l3_agent_db[\u0027id\u0027])"},{"line_number":990,"context_line":"            if not agent_port:"},{"line_number":991,"context_line":"                ext_net_subnet_info \u003d ("},{"line_number":992,"context_line":"                    self._core_plugin._get_subnets_by_network("},{"line_number":993,"context_line":"                        context, network_id))"},{"line_number":994,"context_line":"                ext_net_subnets \u003d []"},{"line_number":995,"context_line":"                for s in ext_net_subnet_info:"},{"line_number":996,"context_line":"                    if not s[\u0027gateway_ip\u0027]:"},{"line_number":997,"context_line":"                        continue"},{"line_number":998,"context_line":"                    ext_net_subnets.append({\u0027subnet_id\u0027: s[\u0027id\u0027]})"},{"line_number":999,"context_line":"                subnet_info \u003d (ext_net_subnets or const.ATTR_NOT_SPECIFIED)"},{"line_number":1000,"context_line":"                LOG.info(\"Floating IP Agent Gateway port does not exist, \""},{"line_number":1001,"context_line":"                         \"creating one\")"},{"line_number":1002,"context_line":"                port_data \u003d {\u0027tenant_id\u0027: \u0027\u0027,"},{"line_number":1003,"context_line":"                             \u0027network_id\u0027: network_id,"},{"line_number":1004,"context_line":"                             \u0027fixed_ips\u0027: subnet_info,"},{"line_number":1005,"context_line":"                             \u0027device_id\u0027: l3_agent_db[\u0027id\u0027],"},{"line_number":1006,"context_line":"                             \u0027device_owner\u0027: const.DEVICE_OWNER_AGENT_GW,"},{"line_number":1007,"context_line":"                             portbindings.HOST_ID: host,"}],"source_content_type":"text/x-python","patch_set":10,"id":"9fb8cfa7_0918f2d0","line":1004,"range":{"start_line":991,"start_character":0,"end_line":1004,"end_character":54},"in_reply_to":"9fb8cfa7_77286ae1","updated":"2019-06-07 17:31:39.000000000","message":"yes you are right. I am working on a fix for that, will upload it soon.","commit_id":"233ba3c881a857dd8404502a29ce51b3086e75da"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d077a1163c10eee9d96d7592c4dd3dbf4d19f6a1","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"        ext_service_subnet_ids \u003d []"},{"line_number":1012,"context_line":"        ext_all_subnet_ids \u003d []"},{"line_number":1013,"context_line":"        for s in ext_net_subnets:"},{"line_number":1014,"context_line":"            if not s[\u0027gateway_ip\u0027]:"},{"line_number":1015,"context_line":"                continue"},{"line_number":1016,"context_line":"            if (s[\u0027service_types\u0027] and"},{"line_number":1017,"context_line":"                    self.check_for_subnet_service_type("},{"line_number":1018,"context_line":"                        s[\u0027service_types\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"7faddb67_ff2b5c78","line":1015,"range":{"start_line":1014,"start_character":12,"end_line":1015,"end_character":24},"updated":"2019-09-05 16:43:51.000000000","message":"Why do we need to bail out of this if the subnet doesn\u0027t have a gateway?","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"80bfa5531e5d21dbbb038b7228adda50804e2c27","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"        ext_service_subnet_ids \u003d []"},{"line_number":1012,"context_line":"        ext_all_subnet_ids \u003d []"},{"line_number":1013,"context_line":"        for s in ext_net_subnets:"},{"line_number":1014,"context_line":"            if not s[\u0027gateway_ip\u0027]:"},{"line_number":1015,"context_line":"                continue"},{"line_number":1016,"context_line":"            if (s[\u0027service_types\u0027] and"},{"line_number":1017,"context_line":"                    self.check_for_subnet_service_type("},{"line_number":1018,"context_line":"                        s[\u0027service_types\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_ae9c425d","line":1015,"range":{"start_line":1014,"start_character":12,"end_line":1015,"end_character":24},"in_reply_to":"7faddb67_ff2b5c78","updated":"2019-09-23 19:24:33.000000000","message":"Do you think we need to look for all subnets irrespective of the gateway here.\nIs there a use case where the subnet without a gateway will be used here.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d077a1163c10eee9d96d7592c4dd3dbf4d19f6a1","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"            if (s[\u0027service_types\u0027] and"},{"line_number":1017,"context_line":"                    self.check_for_subnet_service_type("},{"line_number":1018,"context_line":"                        s[\u0027service_types\u0027],"},{"line_number":1019,"context_line":"                        n_consts.FIP_AGENT_GW_SUBNET_SERVICE_TYPE)):"},{"line_number":1020,"context_line":"                # If floatingip_agent_gateway service_types is defined"},{"line_number":1021,"context_line":"                # for subnet just collect those subnet ids."},{"line_number":1022,"context_line":"                ext_service_subnet_ids.append({\u0027subnet_id\u0027: s[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":28,"id":"7faddb67_5f1dd05f","line":1019,"range":{"start_line":1019,"start_character":24,"end_line":1019,"end_character":65},"updated":"2019-09-05 16:43:51.000000000","message":"Nit: Just use the constant from neutron-lib https://github.com/openstack/neutron-lib/blob/cb44b5dc009bcc105f9c2b2adca1073ba1e08def/neutron_lib/constants.py#L58","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"80bfa5531e5d21dbbb038b7228adda50804e2c27","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"            if (s[\u0027service_types\u0027] and"},{"line_number":1017,"context_line":"                    self.check_for_subnet_service_type("},{"line_number":1018,"context_line":"                        s[\u0027service_types\u0027],"},{"line_number":1019,"context_line":"                        n_consts.FIP_AGENT_GW_SUBNET_SERVICE_TYPE)):"},{"line_number":1020,"context_line":"                # If floatingip_agent_gateway service_types is defined"},{"line_number":1021,"context_line":"                # for subnet just collect those subnet ids."},{"line_number":1022,"context_line":"                ext_service_subnet_ids.append({\u0027subnet_id\u0027: s[\u0027id\u0027]})"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_cea17eab","line":1019,"range":{"start_line":1019,"start_character":24,"end_line":1019,"end_character":65},"in_reply_to":"7faddb67_5f1dd05f","updated":"2019-09-23 19:24:33.000000000","message":"Yes will fix it.","commit_id":"92af2797c53d01c938fc4917e5e581aea84a05d9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        # TODO(slaweq): add proper constraint on database level to avoid"},{"line_number":1065,"context_line":"        # creation of duplicated Floating IP gateway ports for same network and"},{"line_number":1066,"context_line":"        # same L3 agent. When this will be done, we can get rid of this lock."},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"        try:"},{"line_number":1069,"context_line":"            l3_agent_db \u003d self._get_agent_by_type_and_host("},{"line_number":1070,"context_line":"                context, const.AGENT_TYPE_L3, host)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_93b5b880","line":1067,"updated":"2019-09-26 01:36:16.000000000","message":"nit nit: not related change","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":1064,"context_line":"        # TODO(slaweq): add proper constraint on database level to avoid"},{"line_number":1065,"context_line":"        # creation of duplicated Floating IP gateway ports for same network and"},{"line_number":1066,"context_line":"        # same L3 agent. When this will be done, we can get rid of this lock."},{"line_number":1067,"context_line":""},{"line_number":1068,"context_line":"        try:"},{"line_number":1069,"context_line":"            l3_agent_db \u003d self._get_agent_by_type_and_host("},{"line_number":1070,"context_line":"                context, const.AGENT_TYPE_L3, host)"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_8b4251aa","line":1067,"in_reply_to":"3fa7e38b_93b5b880","updated":"2019-09-26 17:51:26.000000000","message":"Will fix it.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4051d12817086892e20036be8a7fdcd059a0d95c","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        return agent_port"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    def _generate_arp_table_and_notify_agent("},{"line_number":1177,"context_line":"            self, context, fixed_ip, mac_address, notifier):"},{"line_number":1178,"context_line":"        \"\"\"Generates the arp table entry and notifies the l3 agent.\"\"\""},{"line_number":1179,"context_line":"        ip_address \u003d fixed_ip[\u0027ip_address\u0027]"},{"line_number":1180,"context_line":"        subnet \u003d fixed_ip[\u0027subnet_id\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_53b3c098","line":1177,"range":{"start_line":1177,"start_character":0,"end_line":1177,"end_character":60},"updated":"2019-09-26 01:36:16.000000000","message":"nit nit: not related change","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"5515538214e88677685760d31baaee42578e0dae","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        return agent_port"},{"line_number":1175,"context_line":""},{"line_number":1176,"context_line":"    def _generate_arp_table_and_notify_agent("},{"line_number":1177,"context_line":"            self, context, fixed_ip, mac_address, notifier):"},{"line_number":1178,"context_line":"        \"\"\"Generates the arp table entry and notifies the l3 agent.\"\"\""},{"line_number":1179,"context_line":"        ip_address \u003d fixed_ip[\u0027ip_address\u0027]"},{"line_number":1180,"context_line":"        subnet \u003d fixed_ip[\u0027subnet_id\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"3fa7e38b_4b1a19cc","line":1177,"range":{"start_line":1177,"start_character":0,"end_line":1177,"end_character":60},"in_reply_to":"3fa7e38b_53b3c098","updated":"2019-09-26 17:51:26.000000000","message":"Sure will fix it.","commit_id":"324e753c2adbdc2e28856c17d841586f92fb5811"}]}
