)]}'
{"neutron/db/l3_dvr_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"    def _get_ext_nets_by_host(self, context, host):"},{"line_number":1145,"context_line":"        ext_nets \u003d set()"},{"line_number":1146,"context_line":"        ports \u003d port_obj.Port.get_ports_by_host(context, host)"},{"line_number":1147,"context_line":"        for port in ports:"},{"line_number":1148,"context_line":"            fips \u003d self._get_floatingips_by_port_id(context, port.id)"},{"line_number":1149,"context_line":"            for fip in fips:"}],"source_content_type":"text/x-python","patch_set":1,"id":"93e3415e_752565ed","line":1146,"range":{"start_line":1146,"start_character":30,"end_line":1146,"end_character":47},"updated":"2021-04-23 11:41:30.000000000","message":"In a beefy system, this query can return hundreds of ports. A port OVO query is very expensive. More comments in the method implementation","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":true,"context_lines":[{"line_number":1143,"context_line":""},{"line_number":1144,"context_line":"    def _get_ext_nets_by_host(self, context, host):"},{"line_number":1145,"context_line":"        ext_nets \u003d set()"},{"line_number":1146,"context_line":"        ports \u003d port_obj.Port.get_ports_by_host(context, host)"},{"line_number":1147,"context_line":"        for port in ports:"},{"line_number":1148,"context_line":"            fips \u003d self._get_floatingips_by_port_id(context, port.id)"},{"line_number":1149,"context_line":"            for fip in fips:"}],"source_content_type":"text/x-python","patch_set":1,"id":"edee2eec_df928e45","line":1146,"range":{"start_line":1146,"start_character":30,"end_line":1146,"end_character":47},"in_reply_to":"93e3415e_752565ed","updated":"2021-04-26 20:28:59.000000000","message":"Theoretically yes. But in practical it will be called only when new agent is registered in the DB. And in such case I pretty sure that in most cases there will be no any ports there yet so it shouldn\u0027t be problem.\nI added this code to create fip agent gw port just in case if someone would delete agent from db \"by accident\" and it would be recreated in few seconds. In most cases I think it will not happen like that really :)","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"            return"},{"line_number":1165,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":1166,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":1167,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":1168,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1169,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1170,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"700b89be_7524335c","line":1167,"updated":"2021-04-23 11:41:30.000000000","message":"same comments as in next function","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"            return"},{"line_number":1165,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":1166,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":1167,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":1168,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1169,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1170,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f313ddd_61d45063","line":1167,"range":{"start_line":1167,"start_character":9,"end_line":1167,"end_character":73},"updated":"2021-04-23 11:41:30.000000000","message":"why don\u0027t you use self._get_agent_mode()?","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":true,"context_lines":[{"line_number":1164,"context_line":"            return"},{"line_number":1165,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":1166,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":1167,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":1168,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1169,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1170,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":1,"id":"79efe46d_9f35e940","line":1167,"range":{"start_line":1167,"start_character":9,"end_line":1167,"end_character":73},"in_reply_to":"3f313ddd_61d45063","updated":"2021-04-26 20:28:59.000000000","message":"Because in that case agent in payload isn\u0027t Agent object but dict. Please see in https://github.com/openstack/neutron/blob/309639ca892bd50cbcf27e4373aa65984c635ea5/neutron/db/agents_db.py#L435","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1172,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":1173,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":1174,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":1175,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":1176,"context_line":"                context, ext_net, host)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"}],"source_content_type":"text/x-python","patch_set":1,"id":"52c75f1d_29dfc4aa","line":1175,"range":{"start_line":1175,"start_character":17,"end_line":1175,"end_character":55},"updated":"2021-04-23 11:41:30.000000000","message":"just a comment: this is weird that we have a method to ensure the GW port is created. This kind of uncertainty is prone to errors.","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"095510c43972f618e8b275de9860c2ea9c785b73","unresolved":true,"context_lines":[{"line_number":1172,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":1173,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":1174,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":1175,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":1176,"context_line":"                context, ext_net, host)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"}],"source_content_type":"text/x-python","patch_set":1,"id":"8883f84d_441cc016","line":1175,"range":{"start_line":1175,"start_character":17,"end_line":1175,"end_character":55},"in_reply_to":"52c75f1d_29dfc4aa","updated":"2021-04-26 02:07:18.000000000","message":"Maybe a new race condition will be introduced here after which neutron will create more than one gateway port for same host? A lock may not work, since create_fip_agent_gw_port_if_not_exists can be called on different hosts.","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":true,"context_lines":[{"line_number":1172,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":1173,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":1174,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":1175,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":1176,"context_line":"                context, ext_net, host)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"}],"source_content_type":"text/x-python","patch_set":1,"id":"202bc8e2_9bd6c896","line":1175,"range":{"start_line":1175,"start_character":17,"end_line":1175,"end_character":55},"in_reply_to":"8883f84d_441cc016","updated":"2021-04-26 20:28:59.000000000","message":"Please check L1109, there is DB constraint to be sure that there is only one such entry per host. So there will be no race here","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9253f124_9c592140","line":1191,"range":{"start_line":1191,"start_character":8,"end_line":1191,"end_character":29},"updated":"2021-04-23 11:41:30.000000000","message":"micro nit:\n\n  if self._get_agent_mode(agent) in [....","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4f653106_cbcdbf51","line":1191,"range":{"start_line":1191,"start_character":8,"end_line":1191,"end_character":29},"in_reply_to":"9253f124_9c592140","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"d0f6f72b_29b387c3","line":1192,"range":{"start_line":1192,"start_character":39,"end_line":1192,"end_character":61},"updated":"2021-04-23 11:41:30.000000000","message":"And \"L3_AGENT_MODE_DVR_NO_EXTERNAL\"?\n\nShould we have a tuple with those three constants in n-lib to avoid this in the future?","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff4ecc27_9e655daf","line":1192,"range":{"start_line":1192,"start_character":39,"end_line":1192,"end_character":61},"in_reply_to":"9d03b8e6_a383de4a","updated":"2021-04-26 20:28:59.000000000","message":"Exactly, as LIU said, it\u0027s not needed on the node with no external connectivity","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"095510c43972f618e8b275de9860c2ea9c785b73","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9d03b8e6_a383de4a","line":1192,"range":{"start_line":1192,"start_character":39,"end_line":1192,"end_character":61},"in_reply_to":"d0f6f72b_29b387c3","updated":"2021-04-26 02:07:18.000000000","message":"dvr_no_external mode will not create fip-namespace with fg-device, so no gw port is needed.","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"dee5b13e95295277edf0860a16f55372af2a5405","unresolved":true,"context_lines":[{"line_number":1189,"context_line":"            return"},{"line_number":1190,"context_line":"        l3_agent_mode \u003d self._get_agent_mode(agent)"},{"line_number":1191,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"3b75e10a_6371d7af","line":1192,"range":{"start_line":1192,"start_character":39,"end_line":1192,"end_character":61},"in_reply_to":"ff4ecc27_9e655daf","updated":"2021-06-22 10:06:31.000000000","message":"Upsss, thanks for the reply. You are right.","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":1196,"context_line":"        for gw_port in agent_gw_ports:"},{"line_number":1197,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":1198,"context_line":"            try:"},{"line_number":1199,"context_line":"                l3_obj.DvrFipGatewayPortAgentBinding("},{"line_number":1200,"context_line":"                    payload.context, network_id\u003dgw_port[\u0027network_id\u0027],"},{"line_number":1201,"context_line":"                    agent_id\u003dagent[\u0027id\u0027]).delete()"},{"line_number":1202,"context_line":"            except n_exc.ObjectNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c964bb1a_08a4c166","line":1199,"updated":"2021-04-23 11:41:30.000000000","message":"DvrFipGatewayPortAgentBinding DB model has\n  agent_id\u003dsa.ForeignKey(\"agents.id\", ondelete\u003d\"CASCADE\")\n\nWhen the agent is deleted, the DB will remove it from the DB.\n\nWe don\u0027t need this operation.","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"095510c43972f618e8b275de9860c2ea9c785b73","unresolved":true,"context_lines":[{"line_number":1196,"context_line":"        for gw_port in agent_gw_ports:"},{"line_number":1197,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":1198,"context_line":"            try:"},{"line_number":1199,"context_line":"                l3_obj.DvrFipGatewayPortAgentBinding("},{"line_number":1200,"context_line":"                    payload.context, network_id\u003dgw_port[\u0027network_id\u0027],"},{"line_number":1201,"context_line":"                    agent_id\u003dagent[\u0027id\u0027]).delete()"},{"line_number":1202,"context_line":"            except n_exc.ObjectNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d91a0801_cde255a0","line":1199,"in_reply_to":"c964bb1a_08a4c166","updated":"2021-04-26 02:07:18.000000000","message":"+1","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":1196,"context_line":"        for gw_port in agent_gw_ports:"},{"line_number":1197,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":1198,"context_line":"            try:"},{"line_number":1199,"context_line":"                l3_obj.DvrFipGatewayPortAgentBinding("},{"line_number":1200,"context_line":"                    payload.context, network_id\u003dgw_port[\u0027network_id\u0027],"},{"line_number":1201,"context_line":"                    agent_id\u003dagent[\u0027id\u0027]).delete()"},{"line_number":1202,"context_line":"            except n_exc.ObjectNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"cf9f856a_6fc5dc82","line":1199,"in_reply_to":"d91a0801_cde255a0","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"182587a3f3911d14433abba0444e005dec90bd69","unresolved":true,"context_lines":[{"line_number":1150,"context_line":"                ext_nets.add(fip.floating_network_id)"},{"line_number":1151,"context_line":"        return ext_nets"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_CREATE])"},{"line_number":1154,"context_line":"    def create_fip_agent_gw_ports(self, resource, event,"},{"line_number":1155,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":1156,"context_line":"        \"\"\"Create floating agent gw ports for DVR L3 agent."},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"        Create floating IP Agent gateway ports when an L3 agent is created."},{"line_number":1159,"context_line":"        \"\"\""},{"line_number":1160,"context_line":"        if not payload:"},{"line_number":1161,"context_line":"            return"},{"line_number":1162,"context_line":"        agent \u003d payload.latest_state"},{"line_number":1163,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1164,"context_line":"            return"},{"line_number":1165,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":1166,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":1167,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":1168,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1169,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1170,"context_line":"            return"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":1173,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":1174,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":1175,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":1176,"context_line":"                context, ext_net, host)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"},{"line_number":1179,"context_line":"    def delete_fip_agent_gw_ports(self, resource, event,"},{"line_number":1180,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":1181,"context_line":"        \"\"\"Delete floating agent gw ports for DVR."},{"line_number":1182,"context_line":""},{"line_number":1183,"context_line":"        Delete floating IP Agent gateway ports from host when an L3 agent is"},{"line_number":1184,"context_line":"        deleted."},{"line_number":1185,"context_line":"        \"\"\""},{"line_number":1186,"context_line":"        if not payload:"},{"line_number":1187,"context_line":"            return"},{"line_number":1188,"context_line":"        agent \u003d payload.latest_state"},{"line_number":1189,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1190,"context_line":"            return"},{"line_number":1191,"context_line":"        if self._get_agent_mode(agent) not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                               const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"},{"line_number":1196,"context_line":"        for gw_port in agent_gw_ports:"},{"line_number":1197,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"        # Delete the Floating IP agent gateway ports bindings on that host"},{"line_number":1200,"context_line":"        l3_obj.DvrFipGatewayPortAgentBinding.delete_objects("},{"line_number":1201,"context_line":"            payload.context, agent_id\u003dagent[\u0027id\u0027])"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def _generate_arp_table_and_notify_agent(self, context, fixed_ip,"},{"line_number":1204,"context_line":"                                             mac_address, notifier):"}],"source_content_type":"text/x-python","patch_set":3,"id":"83783cc5_bdc3d635","line":1201,"range":{"start_line":1153,"start_character":0,"end_line":1201,"end_character":50},"updated":"2021-06-17 00:55:07.000000000","message":"These methods should be added to class DVRResourceOperationHandler, in the class DVRResourceOperationHandler it contains callbacks for DVR related operations. Otherwise this class shouldd add the decorator \"@registry.has_registry_receivers\"","commit_id":"1b48b36e211b65f6120d86407fff7f35e88437a7"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8577d45be65c49cb4d9f30714e6bf99124b66a84","unresolved":true,"context_lines":[{"line_number":1150,"context_line":"                ext_nets.add(fip.floating_network_id)"},{"line_number":1151,"context_line":"        return ext_nets"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_CREATE])"},{"line_number":1154,"context_line":"    def create_fip_agent_gw_ports(self, resource, event,"},{"line_number":1155,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":1156,"context_line":"        \"\"\"Create floating agent gw ports for DVR L3 agent."},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"        Create floating IP Agent gateway ports when an L3 agent is created."},{"line_number":1159,"context_line":"        \"\"\""},{"line_number":1160,"context_line":"        if not payload:"},{"line_number":1161,"context_line":"            return"},{"line_number":1162,"context_line":"        agent \u003d payload.latest_state"},{"line_number":1163,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1164,"context_line":"            return"},{"line_number":1165,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":1166,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":1167,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":1168,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1169,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1170,"context_line":"            return"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":1173,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":1174,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":1175,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":1176,"context_line":"                context, ext_net, host)"},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"},{"line_number":1179,"context_line":"    def delete_fip_agent_gw_ports(self, resource, event,"},{"line_number":1180,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":1181,"context_line":"        \"\"\"Delete floating agent gw ports for DVR."},{"line_number":1182,"context_line":""},{"line_number":1183,"context_line":"        Delete floating IP Agent gateway ports from host when an L3 agent is"},{"line_number":1184,"context_line":"        deleted."},{"line_number":1185,"context_line":"        \"\"\""},{"line_number":1186,"context_line":"        if not payload:"},{"line_number":1187,"context_line":"            return"},{"line_number":1188,"context_line":"        agent \u003d payload.latest_state"},{"line_number":1189,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":1190,"context_line":"            return"},{"line_number":1191,"context_line":"        if self._get_agent_mode(agent) not in [const.L3_AGENT_MODE_DVR,"},{"line_number":1192,"context_line":"                                               const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":1193,"context_line":"            return"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"        agent_gw_ports \u003d self._get_agent_gw_ports(payload.context, agent[\u0027id\u0027])"},{"line_number":1196,"context_line":"        for gw_port in agent_gw_ports:"},{"line_number":1197,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":1198,"context_line":""},{"line_number":1199,"context_line":"        # Delete the Floating IP agent gateway ports bindings on that host"},{"line_number":1200,"context_line":"        l3_obj.DvrFipGatewayPortAgentBinding.delete_objects("},{"line_number":1201,"context_line":"            payload.context, agent_id\u003dagent[\u0027id\u0027])"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def _generate_arp_table_and_notify_agent(self, context, fixed_ip,"},{"line_number":1204,"context_line":"                                             mac_address, notifier):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6035ab8a_d4973baf","line":1201,"range":{"start_line":1153,"start_character":0,"end_line":1201,"end_character":50},"in_reply_to":"83783cc5_bdc3d635","updated":"2021-06-17 14:12:44.000000000","message":"Good catch. Changed.","commit_id":"1b48b36e211b65f6120d86407fff7f35e88437a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a1ad0a6fe81e1555c73b9aecb73629cda9516eb7","unresolved":true,"context_lines":[{"line_number":801,"context_line":"        return ext_nets"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_CREATE])"},{"line_number":804,"context_line":"    def create_fip_agent_gw_ports(self, resource, event,"},{"line_number":805,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":806,"context_line":"        \"\"\"Create floating agent gw ports for DVR L3 agent."},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        Create floating IP Agent gateway ports when an L3 agent is created."},{"line_number":809,"context_line":"        \"\"\""},{"line_number":810,"context_line":"        if not payload:"},{"line_number":811,"context_line":"            return"},{"line_number":812,"context_line":"        agent \u003d payload.latest_state"},{"line_number":813,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":814,"context_line":"            return"},{"line_number":815,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":816,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":817,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":818,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":819,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":820,"context_line":"            return"},{"line_number":821,"context_line":""},{"line_number":822,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":823,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":824,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":825,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":826,"context_line":"                context, ext_net, host)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"},{"line_number":829,"context_line":"    def delete_fip_agent_gw_ports(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1d20338e_4dcfc4b2","line":826,"range":{"start_line":804,"start_character":0,"end_line":826,"end_character":1},"updated":"2021-06-17 16:11:07.000000000","message":"But this should be done (actually it is) by the agent scheduler when a new instance is created.\n\nAnd when a FIP is updated, \"_create_dvr_floating_gw_port\" is called. If the router is distributed, the compute hosting the FIP fixed_ip is retrieved and \"create_fip_agent_gw_port_if_not_exists\" is called.\n\nWhy do we need this method?","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"801715421a78c913371047174dd9d58f2ecc1069","unresolved":true,"context_lines":[{"line_number":801,"context_line":"        return ext_nets"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_CREATE])"},{"line_number":804,"context_line":"    def create_fip_agent_gw_ports(self, resource, event,"},{"line_number":805,"context_line":"                                  trigger, payload\u003dNone):"},{"line_number":806,"context_line":"        \"\"\"Create floating agent gw ports for DVR L3 agent."},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"        Create floating IP Agent gateway ports when an L3 agent is created."},{"line_number":809,"context_line":"        \"\"\""},{"line_number":810,"context_line":"        if not payload:"},{"line_number":811,"context_line":"            return"},{"line_number":812,"context_line":"        agent \u003d payload.latest_state"},{"line_number":813,"context_line":"        if agent.get(\u0027agent_type\u0027) !\u003d const.AGENT_TYPE_L3:"},{"line_number":814,"context_line":"            return"},{"line_number":815,"context_line":"        # NOTE(slaweq) agent is passed in payload as dict so to avoid getting"},{"line_number":816,"context_line":"        # again from db, lets just get configuration from this dict directly"},{"line_number":817,"context_line":"        l3_agent_mode \u003d agent.get(\u0027configurations\u0027, {}).get(\u0027agent_mode\u0027)"},{"line_number":818,"context_line":"        if l3_agent_mode not in [const.L3_AGENT_MODE_DVR,"},{"line_number":819,"context_line":"                                 const.L3_AGENT_MODE_DVR_SNAT]:"},{"line_number":820,"context_line":"            return"},{"line_number":821,"context_line":""},{"line_number":822,"context_line":"        host \u003d agent[\u0027host\u0027]"},{"line_number":823,"context_line":"        context \u003d n_utils.get_elevated_context(payload.context)"},{"line_number":824,"context_line":"        for ext_net in self._get_ext_nets_by_host(context, host):"},{"line_number":825,"context_line":"            self.create_fip_agent_gw_port_if_not_exists("},{"line_number":826,"context_line":"                context, ext_net, host)"},{"line_number":827,"context_line":""},{"line_number":828,"context_line":"    @registry.receives(resources.AGENT, [events.AFTER_DELETE])"},{"line_number":829,"context_line":"    def delete_fip_agent_gw_ports(self, resource, event,"}],"source_content_type":"text/x-python","patch_set":4,"id":"73969e79_d0673305","line":826,"range":{"start_line":804,"start_character":0,"end_line":826,"end_character":1},"in_reply_to":"1d20338e_4dcfc4b2","updated":"2021-06-18 08:21:41.000000000","message":"In case if e.g. agent would be accidentally removed from the neutron db, we should recreate those ports when agent would be registered back.\nI know it\u0027s corner case but I wanted to cover it here too.","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a1ad0a6fe81e1555c73b9aecb73629cda9516eb7","unresolved":true,"context_lines":[{"line_number":847,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        # Delete the Floating IP agent gateway ports bindings on that host"},{"line_number":850,"context_line":"        l3_obj.DvrFipGatewayPortAgentBinding.delete_objects("},{"line_number":851,"context_line":"            payload.context, agent_id\u003dagent[\u0027id\u0027])"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"e53a60d3_56a1f5c3","line":850,"range":{"start_line":850,"start_character":15,"end_line":850,"end_character":44},"updated":"2021-06-17 16:11:07.000000000","message":"If the agent is deleted, this register should be deleted too. From the DB definition:\n\nagent_id \u003d sa.Column(sa.String(36), sa.ForeignKey(\"agents.id\",\n                                                  ondelete\u003d\"CASCADE\"),  \u003c---\n                     primary_key\u003dTrue)","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"801715421a78c913371047174dd9d58f2ecc1069","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            self._core_plugin.delete_port(payload.context, gw_port[\u0027id\u0027])"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        # Delete the Floating IP agent gateway ports bindings on that host"},{"line_number":850,"context_line":"        l3_obj.DvrFipGatewayPortAgentBinding.delete_objects("},{"line_number":851,"context_line":"            payload.context, agent_id\u003dagent[\u0027id\u0027])"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"51bf1ca2_2fc4efb3","line":850,"range":{"start_line":850,"start_character":15,"end_line":850,"end_character":44},"in_reply_to":"e53a60d3_56a1f5c3","updated":"2021-06-18 08:21:41.000000000","message":"Done","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"}],"neutron/objects/ports.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @classmethod"},{"line_number":642,"context_line":"    def get_ports_by_host(cls, context, host):"},{"line_number":643,"context_line":"        query \u003d context.session.query(models_v2.Port).join("},{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("},{"line_number":646,"context_line":"            ml2_models.PortBinding.host \u003d\u003d host)"}],"source_content_type":"text/x-python","patch_set":1,"id":"75edb1b4_ef4d6ac8","line":643,"range":{"start_line":643,"start_character":48,"end_line":643,"end_character":52},"updated":"2021-04-23 11:41:30.000000000","message":"This method should return only the port IDs, as commented in \"l3_dvr_db.py\". This should be Port.id","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @classmethod"},{"line_number":642,"context_line":"    def get_ports_by_host(cls, context, host):"},{"line_number":643,"context_line":"        query \u003d context.session.query(models_v2.Port).join("},{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("},{"line_number":646,"context_line":"            ml2_models.PortBinding.host \u003d\u003d host)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d37a35ea_eed17a37","line":643,"range":{"start_line":643,"start_character":48,"end_line":643,"end_character":52},"in_reply_to":"75edb1b4_ef4d6ac8","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a54e44711d3590ee07155f89ed4a3e15873e985f","unresolved":true,"context_lines":[{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("},{"line_number":646,"context_line":"            ml2_models.PortBinding.host \u003d\u003d host)"},{"line_number":647,"context_line":"        return [cls._load_object(context, db_obj) for db_obj in query.all()]"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    @classmethod"},{"line_number":650,"context_line":"    def get_ports_by_binding_type_and_host(cls, context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"55591841_f28b1829","line":647,"range":{"start_line":647,"start_character":20,"end_line":647,"end_character":32},"updated":"2021-04-23 11:41:30.000000000","message":"... thus, we don\u0027t need to load the object, just return query.all() or create a list with the field returned\n\n  return [port_id[0] for port_id in query.all()]","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("},{"line_number":646,"context_line":"            ml2_models.PortBinding.host \u003d\u003d host)"},{"line_number":647,"context_line":"        return [cls._load_object(context, db_obj) for db_obj in query.all()]"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    @classmethod"},{"line_number":650,"context_line":"    def get_ports_by_binding_type_and_host(cls, context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d245a4ac_2bd2c005","line":647,"range":{"start_line":647,"start_character":20,"end_line":647,"end_character":32},"in_reply_to":"55591841_f28b1829","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a1ad0a6fe81e1555c73b9aecb73629cda9516eb7","unresolved":true,"context_lines":[{"line_number":639,"context_line":"        return [port_binding[\u0027port_id\u0027] for port_binding in query.all()]"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @classmethod"},{"line_number":642,"context_line":"    def get_ports_by_host(cls, context, host):"},{"line_number":643,"context_line":"        query \u003d context.session.query(models_v2.Port.id).join("},{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":4,"id":"aefe3256_80a1802c","line":642,"range":{"start_line":642,"start_character":8,"end_line":642,"end_character":25},"updated":"2021-06-17 16:11:07.000000000","message":"I think you can reuse the next method \"get_ports_by_binding_type_and_host\"\n\n    @classmethod\n    def get_ports_by_binding_type_and_host(cls, context,\n                                           binding_type, host):\n        query \u003d context.session.query(models_v2.Port).join(\n            ml2_models.PortBinding)\n        if binding_type:\n            query \u003d query.filter(ml2_models.PortBinding.vif_type \u003d\u003d binding_type)\n        if host:\n            query \u003d query.filter(ml2_models.PortBinding.host \u003d\u003d host)\n        return [cls._load_object(context, db_obj) for db_obj in query.all()]\n\n\n\n    ports \u003d cls.get_ports_by_binding_type_and_host(ctx, None, host_id)","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"801715421a78c913371047174dd9d58f2ecc1069","unresolved":true,"context_lines":[{"line_number":639,"context_line":"        return [port_binding[\u0027port_id\u0027] for port_binding in query.all()]"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @classmethod"},{"line_number":642,"context_line":"    def get_ports_by_host(cls, context, host):"},{"line_number":643,"context_line":"        query \u003d context.session.query(models_v2.Port.id).join("},{"line_number":644,"context_line":"            ml2_models.PortBinding)"},{"line_number":645,"context_line":"        query \u003d query.filter("}],"source_content_type":"text/x-python","patch_set":4,"id":"108cf05f_e2f3ed88","line":642,"range":{"start_line":642,"start_character":8,"end_line":642,"end_character":25},"in_reply_to":"aefe3256_80a1802c","updated":"2021-06-18 08:21:41.000000000","message":"But here I\u0027m taking just port_ids, not whole port objects.","commit_id":"a527110cce068e918a0a76f699bd3b58b844520e"}],"neutron/tests/unit/db/test_l3_dvr_db.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"095510c43972f618e8b275de9860c2ea9c785b73","unresolved":true,"context_lines":[{"line_number":866,"context_line":"                create_fip_gw.assert_not_called()"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"    def test_create_fip_agent_gw_ports(self):"},{"line_number":869,"context_line":"        self._test_create_fip_agent_gw_ports("},{"line_number":870,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr\u0027)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def test_create_fip_agent_gw_ports_dvr_no_external_agent(self):"},{"line_number":873,"context_line":"        self._test_create_fip_agent_gw_ports("},{"line_number":874,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr_no_external\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d46cdfb0_140368f5","line":871,"range":{"start_line":869,"start_character":0,"end_line":871,"end_character":0},"updated":"2021-04-26 02:07:18.000000000","message":"nit: could add dvr_snat here for more coverage rate:\n        self._test_create_fip_agent_gw_ports(\n            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr_snat\u0027)","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":866,"context_line":"                create_fip_gw.assert_not_called()"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"    def test_create_fip_agent_gw_ports(self):"},{"line_number":869,"context_line":"        self._test_create_fip_agent_gw_ports("},{"line_number":870,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr\u0027)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    def test_create_fip_agent_gw_ports_dvr_no_external_agent(self):"},{"line_number":873,"context_line":"        self._test_create_fip_agent_gw_ports("},{"line_number":874,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr_no_external\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"471a1736_00a7101d","line":871,"range":{"start_line":869,"start_character":0,"end_line":871,"end_character":0},"in_reply_to":"d46cdfb0_140368f5","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"095510c43972f618e8b275de9860c2ea9c785b73","unresolved":true,"context_lines":[{"line_number":915,"context_line":"                dvr_fip_agent_port_instance.delete.assert_not_called()"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"    def test_delete_fip_agent_gw_ports(self):"},{"line_number":918,"context_line":"        self._test_delete_fip_agent_gw_ports("},{"line_number":919,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr\u0027)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    def test_delete_fip_agent_gw_ports_dvr_no_external_agent(self):"},{"line_number":922,"context_line":"        self._test_delete_fip_agent_gw_ports("},{"line_number":923,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr_no_external\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2ff9b547_32c0b69b","line":920,"range":{"start_line":918,"start_character":0,"end_line":920,"end_character":0},"updated":"2021-04-26 02:07:18.000000000","message":"ditto","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4b66bc9543ba783571fe09cb869a343ab1447c64","unresolved":false,"context_lines":[{"line_number":915,"context_line":"                dvr_fip_agent_port_instance.delete.assert_not_called()"},{"line_number":916,"context_line":""},{"line_number":917,"context_line":"    def test_delete_fip_agent_gw_ports(self):"},{"line_number":918,"context_line":"        self._test_delete_fip_agent_gw_ports("},{"line_number":919,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr\u0027)"},{"line_number":920,"context_line":""},{"line_number":921,"context_line":"    def test_delete_fip_agent_gw_ports_dvr_no_external_agent(self):"},{"line_number":922,"context_line":"        self._test_delete_fip_agent_gw_ports("},{"line_number":923,"context_line":"            agent_type\u003d\u0027L3 agent\u0027, agent_mode\u003d\u0027dvr_no_external\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"0155380f_2c6b340a","line":920,"range":{"start_line":918,"start_character":0,"end_line":920,"end_character":0},"in_reply_to":"2ff9b547_32c0b69b","updated":"2021-04-26 20:28:59.000000000","message":"Done","commit_id":"a9bf8cac59e971f75001704736bfb22cee9753a0"}]}
