)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df9d833d58fea172b02a7e0bd42fd46415ffa2a1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Always create dhcp port when subnet enable dhcp"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, OVN does not support DHCP for subnet without gateway IP"},{"line_number":10,"context_line":"when meatadata service is disable."},{"line_number":11,"context_line":"now Create a reserved port as DHCP service IP for subnet without gateway IP,"},{"line_number":12,"context_line":"when meatadata service is disable"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa7e38b_b8fba114","line":10,"range":{"start_line":10,"start_character":5,"end_line":10,"end_character":14},"updated":"2020-02-17 15:31:05.000000000","message":"metadata","commit_id":"420ddb7349c165c6f780b448a4611022d7829cf9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df9d833d58fea172b02a7e0bd42fd46415ffa2a1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently, OVN does not support DHCP for subnet without gateway IP"},{"line_number":10,"context_line":"when meatadata service is disable."},{"line_number":11,"context_line":"now Create a reserved port as DHCP service IP for subnet without gateway IP,"},{"line_number":12,"context_line":"when meatadata service is disable"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Iab03c3300a1603e42c16dbcc36035363c8704340"},{"line_number":15,"context_line":"Signed-off-by: zhangyuhe \u003c1073258077@qq.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa7e38b_53f60e2f","line":12,"range":{"start_line":12,"start_character":5,"end_line":12,"end_character":14},"updated":"2020-02-17 15:31:05.000000000","message":"metadata","commit_id":"420ddb7349c165c6f780b448a4611022d7829cf9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a53eec8b635ad3f2aa7e8b5e82a2c6a1662ddd64","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhangyuhe \u003c1073258077@qq.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-03-02 06:17:56 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[OVN] Support native DHCP service for subnet without gateway IP "},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, OVN does not support DHCP for subnet without gateway IP"},{"line_number":10,"context_line":"when metadata service is disable."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1fa4df85_44933efb","line":7,"range":{"start_line":7,"start_character":63,"end_line":7,"end_character":64},"updated":"2020-03-02 11:51:37.000000000","message":"nitty nit: please remove this trailing space if You would respin this patch","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2089c1855eecdb8980b47d058171fc36a8224b7c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"[OVN] Support native DHCP service for subnet without gateway IP"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, OVN does not support DHCP for subnet without gateway IP"},{"line_number":10,"context_line":"when metadata service is disable."},{"line_number":11,"context_line":"now Create a reserved port as dhcp-server-ip for this case"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iab03c3300a1603e42c16dbcc36035363c8704340"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1fa4df85_87482f5c","line":10,"range":{"start_line":10,"start_character":25,"end_line":10,"end_character":32},"updated":"2020-03-04 10:11:50.000000000","message":"disabled","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2089c1855eecdb8980b47d058171fc36a8224b7c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, OVN does not support DHCP for subnet without gateway IP"},{"line_number":10,"context_line":"when metadata service is disable."},{"line_number":11,"context_line":"now Create a reserved port as dhcp-server-ip for this case"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Iab03c3300a1603e42c16dbcc36035363c8704340"},{"line_number":14,"context_line":"Signed-off-by: zhangyuhe \u003c1073258077@qq.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1fa4df85_67f093ff","line":11,"range":{"start_line":11,"start_character":1,"end_line":11,"end_character":58},"updated":"2020-03-04 10:11:50.000000000","message":"Starting from now a reserved port for dhcp will be created to support this use-case.","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_client.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df9d833d58fea172b02a7e0bd42fd46415ffa2a1","unresolved":false,"context_lines":[{"line_number":2087,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2088,"context_line":"        return \u0027\u0027"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"    def _validate_dhcp_port(self, subnet, ori_subnet_dhcp_option\u003dNone):"},{"line_number":2091,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2092,"context_line":"            return"},{"line_number":2093,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not ori_subnet_dhcp_option:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_7380ea49","line":2090,"range":{"start_line":2090,"start_character":42,"end_line":2090,"end_character":45},"updated":"2020-02-17 15:31:05.000000000","message":"s/ovn ?  or orig\n\nAlso, create_subnet() and update_subnet() already have an admin context, so they can just pass it along.","commit_id":"420ddb7349c165c6f780b448a4611022d7829cf9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"df9d833d58fea172b02a7e0bd42fd46415ffa2a1","unresolved":false,"context_lines":[{"line_number":2098,"context_line":"            return"},{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        ctx \u003d n_context.get_admin_context()"},{"line_number":2101,"context_line":"        if self._find_metadata_port(ctx, subnet[\u0027network_id\u0027]) or \\"},{"line_number":2102,"context_line":"                self._get_dhcp_port_ip(ctx, subnet):"},{"line_number":2103,"context_line":"            return"},{"line_number":2104,"context_line":"        if create:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_f3d05a59","line":2101,"range":{"start_line":2101,"start_character":66,"end_line":2101,"end_character":67},"updated":"2020-02-17 15:31:05.000000000","message":"nit: can you put () around the check - if (...): instead of the backslash?","commit_id":"420ddb7349c165c6f780b448a4611022d7829cf9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":1769,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1770,"context_line":"        # supporting DHCP of subnet without gateway IP."},{"line_number":1771,"context_line":"        # We will remove this restriction later."},{"line_number":1772,"context_line":"        service_id \u003d dhcp_port_ip or subnet[\u0027gateway_ip\u0027] or metadata_port_ip"},{"line_number":1773,"context_line":"        if not service_id:"},{"line_number":1774,"context_line":"            return {}"},{"line_number":1775,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_c9a6a356","line":1772,"range":{"start_line":1772,"start_character":21,"end_line":1772,"end_character":33},"updated":"2020-02-19 18:16:30.000000000","message":"Why in first place? Should we first use subnet[\u0027gateway_ip\u0027] and then metadata_port_ip?","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":1769,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1770,"context_line":"        # supporting DHCP of subnet without gateway IP."},{"line_number":1771,"context_line":"        # We will remove this restriction later."},{"line_number":1772,"context_line":"        service_id \u003d dhcp_port_ip or subnet[\u0027gateway_ip\u0027] or metadata_port_ip"},{"line_number":1773,"context_line":"        if not service_id:"},{"line_number":1774,"context_line":"            return {}"},{"line_number":1775,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_bb0dbb91","line":1772,"range":{"start_line":1772,"start_character":21,"end_line":1772,"end_character":33},"in_reply_to":"3fa7e38b_c9a6a356","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2085,"context_line":"        for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2086,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2087,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2088,"context_line":"        return \u0027\u0027"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"    def _validate_dhcp_port(self, context, subnet, original_subnet_dhcp_option\u003dNone):"},{"line_number":2091,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_29b6578e","line":2088,"range":{"start_line":2088,"start_character":15,"end_line":2088,"end_character":17},"updated":"2020-02-19 18:16:30.000000000","message":"Why an empty string?\n\nBTW, by default any function will return None.","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2085,"context_line":"        for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2086,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2087,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2088,"context_line":"        return \u0027\u0027"},{"line_number":2089,"context_line":""},{"line_number":2090,"context_line":"    def _validate_dhcp_port(self, context, subnet, original_subnet_dhcp_option\u003dNone):"},{"line_number":2091,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_db12f7b1","line":2088,"range":{"start_line":2088,"start_character":15,"end_line":2088,"end_character":17},"in_reply_to":"3fa7e38b_29b6578e","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2098,"context_line":"            return"},{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        if (self._find_metadata_port(context, subnet[\u0027network_id\u0027])"},{"line_number":2101,"context_line":"                or self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2102,"context_line":"            return"},{"line_number":2103,"context_line":"        if create:"},{"line_number":2104,"context_line":"            self._create_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b48ffa75","line":2101,"range":{"start_line":2101,"start_character":19,"end_line":2101,"end_character":58},"updated":"2020-02-19 18:16:30.000000000","message":"Why this condition? If we want to delete it, this will never happen because of this.","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2098,"context_line":"            return"},{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        if (self._find_metadata_port(context, subnet[\u0027network_id\u0027])"},{"line_number":2101,"context_line":"                or self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2102,"context_line":"            return"},{"line_number":2103,"context_line":"        if create:"},{"line_number":2104,"context_line":"            self._create_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_5b1e07bb","line":2101,"range":{"start_line":2101,"start_character":19,"end_line":2101,"end_character":58},"in_reply_to":"3fa7e38b_b48ffa75","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_c902230e","line":2110,"range":{"start_line":2110,"start_character":13,"end_line":2110,"end_character":22},"updated":"2020-02-19 18:16:30.000000000","message":"Please, use \"project_id\"","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_54fc860a","line":2110,"range":{"start_line":2110,"start_character":25,"end_line":2110,"end_character":78},"updated":"2020-02-19 18:16:30.000000000","message":"This could be:\n  subnet.get(\u0027project_id\u0027)","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_fb7813f9","line":2110,"range":{"start_line":2110,"start_character":25,"end_line":2110,"end_character":78},"in_reply_to":"3fa7e38b_54fc860a","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_1b7e4fe4","line":2110,"range":{"start_line":2110,"start_character":13,"end_line":2110,"end_character":22},"in_reply_to":"3fa7e38b_c902230e","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_3420ea9d","line":2111,"range":{"start_line":2111,"start_character":12,"end_line":2111,"end_character":55},"updated":"2020-02-19 18:16:30.000000000","message":"Not needed","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2108,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_1a80808b","line":2111,"range":{"start_line":2111,"start_character":12,"end_line":2111,"end_character":55},"in_reply_to":"3fa7e38b_3420ea9d","updated":"2020-03-01 03:40:21.000000000","message":"\u0027name\u0027 is needed in create_port function, How to set it? Can I set it to \u0027\u0027 ?","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2115,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f419f275","line":2112,"range":{"start_line":2112,"start_character":12,"end_line":2112,"end_character":34},"updated":"2020-02-19 18:16:30.000000000","message":"Not needed","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        port_dict \u003d {"},{"line_number":2110,"context_line":"            \u0027tenant_id\u0027: subnet[\u0027project_id\u0027] if \u0027project_id\u0027in subnet else \u0027\u0027,"},{"line_number":2111,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2112,"context_line":"            \u0027security_groups\u0027: [],"},{"line_number":2113,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2115,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_db8757d7","line":2112,"range":{"start_line":2112,"start_character":12,"end_line":2112,"end_character":34},"in_reply_to":"3fa7e38b_f419f275","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a3da0441cfcb37277818e4c7675b8da9c2ca77a9","unresolved":false,"context_lines":[{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2115,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"},{"line_number":2116,"context_line":"            \u0027network_id\u0027: subnet[\u0027network_id\u0027],"},{"line_number":2117,"context_line":"            \u0027mac_address\u0027: const.ATTR_NOT_SPECIFIED,"},{"line_number":2118,"context_line":"            \u0027fixed_ips\u0027: [{\u0027subnet_id\u0027: subnet[\u0027id\u0027]}]}"},{"line_number":2119,"context_line":"        try:"},{"line_number":2120,"context_line":"            self._plugin.create_port(context, {\u0027port\u0027: port_dict})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b4385acc","line":2117,"range":{"start_line":2117,"start_character":12,"end_line":2117,"end_character":52},"updated":"2020-02-19 18:16:30.000000000","message":"Not needed","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"8e57a2b653799aa3019bfda64353e7a97e92d26d","unresolved":false,"context_lines":[{"line_number":2114,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2115,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"},{"line_number":2116,"context_line":"            \u0027network_id\u0027: subnet[\u0027network_id\u0027],"},{"line_number":2117,"context_line":"            \u0027mac_address\u0027: const.ATTR_NOT_SPECIFIED,"},{"line_number":2118,"context_line":"            \u0027fixed_ips\u0027: [{\u0027subnet_id\u0027: subnet[\u0027id\u0027]}]}"},{"line_number":2119,"context_line":"        try:"},{"line_number":2120,"context_line":"            self._plugin.create_port(context, {\u0027port\u0027: port_dict})"}],"source_content_type":"text/x-python","patch_set":3,"id":"1fa4df85_9b69df26","line":2117,"range":{"start_line":2117,"start_character":12,"end_line":2117,"end_character":52},"in_reply_to":"3fa7e38b_b4385acc","updated":"2020-03-01 03:40:21.000000000","message":"Done","commit_id":"b186a3f319c54d8c4bca6b288fc2db217a48577f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ddb0c489006b4738c8ad0f4214517714a9679b8e","unresolved":false,"context_lines":[{"line_number":2251,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2252,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2253,"context_line":""},{"line_number":2254,"context_line":"    def _validate_dhcp_port(self, context, subnet,"},{"line_number":2255,"context_line":"                            original_subnet_dhcp_option\u003dNone):"},{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_423573f6","line":2254,"range":{"start_line":2254,"start_character":9,"end_line":2254,"end_character":17},"updated":"2020-03-02 09:38:07.000000000","message":"nit: \u0027ensure\u0027?","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"b883276558c591d5424542291a3845e927bb552e","unresolved":false,"context_lines":[{"line_number":2251,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2252,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2253,"context_line":""},{"line_number":2254,"context_line":"    def _validate_dhcp_port(self, context, subnet,"},{"line_number":2255,"context_line":"                            original_subnet_dhcp_option\u003dNone):"},{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_64bbda0d","line":2254,"range":{"start_line":2254,"start_character":9,"end_line":2254,"end_character":17},"in_reply_to":"1fa4df85_423573f6","updated":"2020-03-02 11:24:31.000000000","message":"Done","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ddb0c489006b4738c8ad0f4214517714a9679b8e","unresolved":false,"context_lines":[{"line_number":2262,"context_line":"        else:"},{"line_number":2263,"context_line":"            return"},{"line_number":2264,"context_line":""},{"line_number":2265,"context_line":"        if create:"},{"line_number":2266,"context_line":"            if not (subnet.get(\u0027gateway_ip\u0027) or"},{"line_number":2267,"context_line":"                    self._find_metadata_port(context, subnet[\u0027network_id\u0027]) or"},{"line_number":2268,"context_line":"                    self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2269,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2270,"context_line":"            else:"},{"line_number":2271,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2272,"context_line":"                          \u0027as gateway or metadata Port or dhcp port exist\u0027,"},{"line_number":2273,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2274,"context_line":"        else:"},{"line_number":2275,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2276,"context_line":""},{"line_number":2277,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2278,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_024a1b7f","line":2275,"range":{"start_line":2265,"start_character":8,"end_line":2275,"end_character":51},"updated":"2020-03-02 09:38:07.000000000","message":"why need additional if/else and \u0027create\u0027 var? Consider placing 2266-2273 -\u003e 2259, 2275 -\u003e 2261","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"b883276558c591d5424542291a3845e927bb552e","unresolved":false,"context_lines":[{"line_number":2262,"context_line":"        else:"},{"line_number":2263,"context_line":"            return"},{"line_number":2264,"context_line":""},{"line_number":2265,"context_line":"        if create:"},{"line_number":2266,"context_line":"            if not (subnet.get(\u0027gateway_ip\u0027) or"},{"line_number":2267,"context_line":"                    self._find_metadata_port(context, subnet[\u0027network_id\u0027]) or"},{"line_number":2268,"context_line":"                    self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2269,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2270,"context_line":"            else:"},{"line_number":2271,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2272,"context_line":"                          \u0027as gateway or metadata Port or dhcp port exist\u0027,"},{"line_number":2273,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2274,"context_line":"        else:"},{"line_number":2275,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2276,"context_line":""},{"line_number":2277,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2278,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_0438e69d","line":2275,"range":{"start_line":2265,"start_character":8,"end_line":2275,"end_character":51},"in_reply_to":"1fa4df85_024a1b7f","updated":"2020-03-02 11:24:31.000000000","message":"Done","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ddb0c489006b4738c8ad0f4214517714a9679b8e","unresolved":false,"context_lines":[{"line_number":2296,"context_line":"            try:"},{"line_number":2297,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2298,"context_line":"            except Exception:"},{"line_number":2299,"context_line":"                LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2300,"context_line":"                          \u0027subnet %(subnet)s failed\u0027,"},{"line_number":2301,"context_line":"                          {\u0027port\u0027: dhcp_port[\u0027id\u0027],"},{"line_number":2302,"context_line":"                           \u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2303,"context_line":""},{"line_number":2304,"context_line":"    def _find_metadata_port(self, context, network_id):"},{"line_number":2305,"context_line":"        if not ovn_conf.is_ovn_metadata_enabled():"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_a27787d4","line":2302,"range":{"start_line":2299,"start_character":16,"end_line":2302,"end_character":51},"updated":"2020-03-02 09:38:07.000000000","message":"may be useful to log the exact error as well","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"b883276558c591d5424542291a3845e927bb552e","unresolved":false,"context_lines":[{"line_number":2296,"context_line":"            try:"},{"line_number":2297,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2298,"context_line":"            except Exception:"},{"line_number":2299,"context_line":"                LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2300,"context_line":"                          \u0027subnet %(subnet)s failed\u0027,"},{"line_number":2301,"context_line":"                          {\u0027port\u0027: dhcp_port[\u0027id\u0027],"},{"line_number":2302,"context_line":"                           \u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2303,"context_line":""},{"line_number":2304,"context_line":"    def _find_metadata_port(self, context, network_id):"},{"line_number":2305,"context_line":"        if not ovn_conf.is_ovn_metadata_enabled():"}],"source_content_type":"text/x-python","patch_set":9,"id":"1fa4df85_243ba29c","line":2302,"range":{"start_line":2299,"start_character":16,"end_line":2302,"end_character":51},"in_reply_to":"1fa4df85_a27787d4","updated":"2020-03-02 11:24:31.000000000","message":"Done","commit_id":"c7edb56ab17cfc4a6c7bb96e0b31f45864b07722"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a53eec8b635ad3f2aa7e8b5e82a2c6a1662ddd64","unresolved":false,"context_lines":[{"line_number":2252,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2253,"context_line":""},{"line_number":2254,"context_line":"    def _ensure_dhcp_port(self, context, subnet,"},{"line_number":2255,"context_line":"                            original_subnet_dhcp_option\u003dNone):"},{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"},{"line_number":2258,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_e4702adf","line":2255,"range":{"start_line":2255,"start_character":26,"end_line":2255,"end_character":28},"updated":"2020-03-02 11:51:37.000000000","message":"nitty nit: please fix this indentation","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"4e9cad9ad3a042376c970f07a968f06a5e475b9f","unresolved":false,"context_lines":[{"line_number":2252,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2253,"context_line":""},{"line_number":2254,"context_line":"    def _ensure_dhcp_port(self, context, subnet,"},{"line_number":2255,"context_line":"                            original_subnet_dhcp_option\u003dNone):"},{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"},{"line_number":2258,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_2a50445d","line":2255,"range":{"start_line":2255,"start_character":26,"end_line":2255,"end_character":28},"in_reply_to":"1fa4df85_e4702adf","updated":"2020-03-02 16:20:55.000000000","message":"oh! I was careless. i will fix it.","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a53eec8b635ad3f2aa7e8b5e82a2c6a1662ddd64","unresolved":false,"context_lines":[{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"},{"line_number":2258,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"},{"line_number":2259,"context_line":"            if not (subnet.get(\u0027gateway_ip\u0027) or"},{"line_number":2260,"context_line":"                    self._find_metadata_port(context, subnet[\u0027network_id\u0027]) or"},{"line_number":2261,"context_line":"                    self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2262,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2263,"context_line":"            else:"},{"line_number":2264,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_e417ca50","line":2261,"range":{"start_line":2259,"start_character":20,"end_line":2261,"end_character":59},"updated":"2020-03-02 11:51:37.000000000","message":"this is in fact the same as \"service_id\" from L1937, maybe You could add small helper method like \"get_service_id\" or something like that, it can looks like:\n\n    def get_service_id(self, subnet):\n        metadata_port_ip \u003d self._find_metadata_port_ip(\n            n_context.get_admin_context(), subnet)\n        dhcp_port_ip \u003d self._get_dhcp_port_ip(\n            n_context.get_admin_context(), subnet)\n        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or dhcp_port_ip\n\nAnd You can then use it in both L1937 and here.","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b88e4e1addbb4cbb34cd817f2bd624b3ddc032de","unresolved":false,"context_lines":[{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"},{"line_number":2258,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"},{"line_number":2259,"context_line":"            if not (subnet.get(\u0027gateway_ip\u0027) or"},{"line_number":2260,"context_line":"                    self._find_metadata_port(context, subnet[\u0027network_id\u0027]) or"},{"line_number":2261,"context_line":"                    self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2262,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2263,"context_line":"            else:"},{"line_number":2264,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_ed29d989","line":2261,"range":{"start_line":2259,"start_character":20,"end_line":2261,"end_character":59},"in_reply_to":"1fa4df85_aab2f4e4","updated":"2020-03-03 10:04:49.000000000","message":"yes, it may work like that :)","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"4e9cad9ad3a042376c970f07a968f06a5e475b9f","unresolved":false,"context_lines":[{"line_number":2256,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2257,"context_line":"            return"},{"line_number":2258,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"},{"line_number":2259,"context_line":"            if not (subnet.get(\u0027gateway_ip\u0027) or"},{"line_number":2260,"context_line":"                    self._find_metadata_port(context, subnet[\u0027network_id\u0027]) or"},{"line_number":2261,"context_line":"                    self._get_dhcp_port_ip(context, subnet)):"},{"line_number":2262,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2263,"context_line":"            else:"},{"line_number":2264,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_aab2f4e4","line":2261,"range":{"start_line":2259,"start_character":20,"end_line":2261,"end_character":59},"in_reply_to":"1fa4df85_e417ca50","updated":"2020-03-02 16:20:55.000000000","message":"Maybe this helper method looks like this:\n    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):\n        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)\n        if not metadata_port_ip:\n            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)\n        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or dhcp_port_ip\n\n\nThe calling method becomes like this, \nbecause \u0027metadata_port_ip \u0027 is used at L1974.\n    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):\n        admin_context \u003d n_context.get_admin_context()\n        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)\n        service_id \u003d self._get_server_id(admin_context, subnet,\n                                    metadata_port_ip\u003dmetadata_port_ip)\n        if not service_id:\n            return {}\n        ...","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a53eec8b635ad3f2aa7e8b5e82a2c6a1662ddd64","unresolved":false,"context_lines":[{"line_number":2270,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2271,"context_line":"        port_dict \u003d {"},{"line_number":2272,"context_line":"            \u0027tenant_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2273,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2274,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2275,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2276,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_a70eb42f","line":2273,"updated":"2020-03-02 11:51:37.000000000","message":"should You set such name for this port? I\u0027m not sure if we are doing something similar in case of DHCP agent.","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"4e9cad9ad3a042376c970f07a968f06a5e475b9f","unresolved":false,"context_lines":[{"line_number":2270,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2271,"context_line":"        port_dict \u003d {"},{"line_number":2272,"context_line":"            \u0027tenant_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2273,"context_line":"            \u0027name\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2274,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2275,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2276,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_8a237805","line":2273,"in_reply_to":"1fa4df85_a70eb42f","updated":"2020-03-02 16:20:55.000000000","message":"i will remove it, name is not needed.","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a53eec8b635ad3f2aa7e8b5e82a2c6a1662ddd64","unresolved":false,"context_lines":[{"line_number":2285,"context_line":""},{"line_number":2286,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2287,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2288,"context_line":"        if dhcp_port:"},{"line_number":2289,"context_line":"            try:"},{"line_number":2290,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2291,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_47c0207c","line":2288,"updated":"2020-03-02 11:51:37.000000000","message":"because of this check this method isn\u0027t in fact atomic. Can\u0027t You just try to delete port always and properly catch exception in case if it don\u0027t exists?","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"4e9cad9ad3a042376c970f07a968f06a5e475b9f","unresolved":false,"context_lines":[{"line_number":2285,"context_line":""},{"line_number":2286,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2287,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2288,"context_line":"        if dhcp_port:"},{"line_number":2289,"context_line":"            try:"},{"line_number":2290,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2291,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_aa0e748a","line":2288,"in_reply_to":"1fa4df85_47c0207c","updated":"2020-03-02 16:20:55.000000000","message":"I don\u0027t know how to call \u0027delete_port\u0027, if I don\u0027t pass port_id","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b88e4e1addbb4cbb34cd817f2bd624b3ddc032de","unresolved":false,"context_lines":[{"line_number":2285,"context_line":""},{"line_number":2286,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2287,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2288,"context_line":"        if dhcp_port:"},{"line_number":2289,"context_line":"            try:"},{"line_number":2290,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2291,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_cd0bbd21","line":2288,"in_reply_to":"1fa4df85_aa0e748a","updated":"2020-03-03 10:04:49.000000000","message":"ahh, right. I somehow missed that You need dhcp_port[\u0027id\u0027] :)","commit_id":"14a8ecca82354caf6ad0dcb9e0a56d486d0bd3b4"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2089c1855eecdb8980b47d058171fc36a8224b7c","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"                    pass"},{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_a7ba0b07","line":1929,"range":{"start_line":1929,"start_character":8,"end_line":1929,"end_character":20},"updated":"2020-03-04 10:11:50.000000000","message":"You can move this to the end of the function, to call it only if subnet[\u0027gateway_ip\u0027] or metadata_port_ip are not available.","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"b559a0ef7f7807d360c40e530fe14309c39fbf0d","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"                    pass"},{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_44a39a01","line":1929,"range":{"start_line":1929,"start_character":8,"end_line":1929,"end_character":20},"in_reply_to":"1fa4df85_a7ba0b07","updated":"2020-03-12 01:39:33.000000000","message":"Done","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"e7ed2149c11dab44e69eb5e4b25b3bfd873ff758","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"                    pass"},{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_b78eb476","line":1929,"range":{"start_line":1929,"start_character":8,"end_line":1929,"end_character":20},"in_reply_to":"1fa4df85_a7ba0b07","updated":"2020-03-04 14:45:26.000000000","message":"yes, You are right!!","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2089c1855eecdb8980b47d058171fc36a8224b7c","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."},{"line_number":1933,"context_line":"        # We will remove this restriction later."},{"line_number":1934,"context_line":"        if not metadata_port_ip:"},{"line_number":1935,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":1936,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or dhcp_port_ip"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_47d47748","line":1933,"range":{"start_line":1930,"start_character":8,"end_line":1933,"end_character":48},"updated":"2020-03-04 10:11:50.000000000","message":"You can remove this TODO.","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"e7ed2149c11dab44e69eb5e4b25b3bfd873ff758","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."},{"line_number":1933,"context_line":"        # We will remove this restriction later."},{"line_number":1934,"context_line":"        if not metadata_port_ip:"},{"line_number":1935,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":1936,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or dhcp_port_ip"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_77ea7c0f","line":1933,"range":{"start_line":1930,"start_character":8,"end_line":1933,"end_character":48},"in_reply_to":"1fa4df85_47d47748","updated":"2020-03-04 14:45:26.000000000","message":"ok!!","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"b559a0ef7f7807d360c40e530fe14309c39fbf0d","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1929,"context_line":"        dhcp_port_ip \u003d self._get_dhcp_port_ip(context, subnet)"},{"line_number":1930,"context_line":"        # TODO(dongj): Currently the metadata port is created only when"},{"line_number":1931,"context_line":"        # ovn_metadata_enabled is true, therefore this is a restriction for"},{"line_number":1932,"context_line":"        # supporting DHCP of subnet without gateway IP."},{"line_number":1933,"context_line":"        # We will remove this restriction later."},{"line_number":1934,"context_line":"        if not metadata_port_ip:"},{"line_number":1935,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":1936,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or dhcp_port_ip"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_64a816db","line":1933,"range":{"start_line":1930,"start_character":8,"end_line":1933,"end_character":48},"in_reply_to":"1fa4df85_77ea7c0f","updated":"2020-03-12 01:39:33.000000000","message":"Done","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2089c1855eecdb8980b47d058171fc36a8224b7c","unresolved":false,"context_lines":[{"line_number":2267,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2268,"context_line":"                          \u0027as gateway or metadata Port or dhcp port exist\u0027,"},{"line_number":2269,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2270,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2271,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2272,"context_line":""},{"line_number":2273,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2274,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_6735f38e","line":2271,"range":{"start_line":2270,"start_character":8,"end_line":2271,"end_character":51},"updated":"2020-03-04 10:11:50.000000000","message":"I don\u0027t think if in \u0027_ensure_dhcp_port()\u0027 the \u0027delete_dhcp_port()\u0027 method should be there.\n\nThe DHCP port should be deleted only if a subnet is deleted or enable_dhcp for subnet switched from True to False.","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"e7ed2149c11dab44e69eb5e4b25b3bfd873ff758","unresolved":false,"context_lines":[{"line_number":2267,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2268,"context_line":"                          \u0027as gateway or metadata Port or dhcp port exist\u0027,"},{"line_number":2269,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2270,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2271,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2272,"context_line":""},{"line_number":2273,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2274,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_376de4cb","line":2271,"range":{"start_line":2270,"start_character":8,"end_line":2271,"end_character":51},"in_reply_to":"1fa4df85_6735f38e","updated":"2020-03-04 14:45:26.000000000","message":"You mean \u0027delete_dhcp_port()\u0027 this method can only be called in \u0027delete_subnet()\u0027 and \u0027update_subnet()\u0027,  \u0027create_subnet()\u0027 can not call \u0027delete_port_port()\u0027 ?  \nbut when \u0027create_subnet()\u0027 method calling \u0027_ensure_dhcp_port()\u0027, the arg \u0027original_subnet_dhcp_option\u0027 will be None, to prevent \u0027_delete_dhcp_port()\u0027 from running","commit_id":"b60925ff0f1d3810805c8b6d21b0bdfc0e3284cc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"                    # Option not present, job done"},{"line_number":1919,"context_line":"                    pass"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1922,"context_line":"        if subnet[\u0027gateway_ip\u0027]:"},{"line_number":1923,"context_line":"            return subnet[\u0027gateway_ip\u0027]"},{"line_number":1924,"context_line":"        if not metadata_port_ip:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_15585354","line":1921,"range":{"start_line":1921,"start_character":8,"end_line":1921,"end_character":22},"updated":"2020-03-13 13:57:14.000000000","message":"This method should be called \u0027_get_dhcp_service_ip()\u0027, as per you\u0027re looking for dhcp_service_ip.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"                    # Option not present, job done"},{"line_number":1919,"context_line":"                    pass"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1922,"context_line":"        if subnet[\u0027gateway_ip\u0027]:"},{"line_number":1923,"context_line":"            return subnet[\u0027gateway_ip\u0027]"},{"line_number":1924,"context_line":"        if not metadata_port_ip:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_b5705fde","line":1921,"range":{"start_line":1921,"start_character":46,"end_line":1921,"end_character":69},"updated":"2020-03-13 13:57:14.000000000","message":"You can remove parameter metadata_port_ip from this function and use _find_metadata_port_ip() in all cases, because you\u0027re using it anyways (_get_ovn_dhcp4_opts and when its not specified).","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"a0267f5bdfc2b7def82620131bce802aa1000ecf","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"                    # Option not present, job done"},{"line_number":1919,"context_line":"                    pass"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1922,"context_line":"        if subnet[\u0027gateway_ip\u0027]:"},{"line_number":1923,"context_line":"            return subnet[\u0027gateway_ip\u0027]"},{"line_number":1924,"context_line":"        if not metadata_port_ip:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_7cc62619","line":1921,"range":{"start_line":1921,"start_character":8,"end_line":1921,"end_character":22},"in_reply_to":"1fa4df85_15585354","updated":"2020-03-17 13:07:01.000000000","message":"Done","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":1921,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1922,"context_line":"        if subnet[\u0027gateway_ip\u0027]:"},{"line_number":1923,"context_line":"            return subnet[\u0027gateway_ip\u0027]"},{"line_number":1924,"context_line":"        if not metadata_port_ip:"},{"line_number":1925,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":1926,"context_line":"        return metadata_port_ip or self._get_dhcp_port_ip(context, subnet)"},{"line_number":1927,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_7572e7e5","line":1924,"range":{"start_line":1924,"start_character":8,"end_line":1924,"end_character":32},"updated":"2020-03-13 13:57:14.000000000","message":"That could be removed.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"a0267f5bdfc2b7def82620131bce802aa1000ecf","unresolved":false,"context_lines":[{"line_number":1921,"context_line":"    def _get_server_id(self, context, subnet, metadata_port_ip\u003dNone):"},{"line_number":1922,"context_line":"        if subnet[\u0027gateway_ip\u0027]:"},{"line_number":1923,"context_line":"            return subnet[\u0027gateway_ip\u0027]"},{"line_number":1924,"context_line":"        if not metadata_port_ip:"},{"line_number":1925,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":1926,"context_line":"        return metadata_port_ip or self._get_dhcp_port_ip(context, subnet)"},{"line_number":1927,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_9cc9a226","line":1924,"range":{"start_line":1924,"start_character":8,"end_line":1924,"end_character":32},"in_reply_to":"1fa4df85_7572e7e5","updated":"2020-03-17 13:07:01.000000000","message":"Done","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"},{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_157ff3ab","line":1930,"range":{"start_line":1930,"start_character":8,"end_line":1930,"end_character":77},"updated":"2020-03-13 13:57:14.000000000","message":"That could be removed.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c8e3258a6c768df5a078d4e5f02a2be19237f15d","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"},{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_d8cae69f","line":1930,"range":{"start_line":1930,"start_character":8,"end_line":1930,"end_character":77},"in_reply_to":"1fa4df85_157ff3ab","updated":"2020-03-14 04:10:45.000000000","message":"\u003e That could be removed.\n\nI should understand what you mean, but I don\u0027t do it here, L1969 still has to do.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"},{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_f8f6c2f9","line":1930,"range":{"start_line":1930,"start_character":8,"end_line":1930,"end_character":77},"in_reply_to":"1fa4df85_157ff3ab","updated":"2020-03-14 03:58:08.000000000","message":"It could not be removed, it will be used at L1969","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"3f0fbef191fdfe0beb60554bf6be378d5726ba83","unresolved":false,"context_lines":[{"line_number":1927,"context_line":""},{"line_number":1928,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"},{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1f493fa4_e02e6e90","line":1930,"range":{"start_line":1930,"start_character":8,"end_line":1930,"end_character":77},"in_reply_to":"1fa4df85_d8cae69f","updated":"2020-04-27 15:01:03.000000000","message":"Ah, you\u0027re right. Sorry.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"},{"line_number":1934,"context_line":"            return {}"},{"line_number":1935,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_d54abb81","line":1932,"range":{"start_line":1932,"start_character":41,"end_line":1932,"end_character":74},"updated":"2020-03-13 13:57:14.000000000","message":"If metadata_port_ip not specified in _get_server_id() the function will look for it anyways, so there is no reason to do it here.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"a0267f5bdfc2b7def82620131bce802aa1000ecf","unresolved":false,"context_lines":[{"line_number":1929,"context_line":"        admin_context \u003d n_context.get_admin_context()"},{"line_number":1930,"context_line":"        metadata_port_ip \u003d self._find_metadata_port_ip(admin_context, subnet)"},{"line_number":1931,"context_line":"        service_id \u003d self._get_server_id(admin_context, subnet,"},{"line_number":1932,"context_line":"                                         metadata_port_ip\u003dmetadata_port_ip)"},{"line_number":1933,"context_line":"        if not service_id:"},{"line_number":1934,"context_line":"            return {}"},{"line_number":1935,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_bce33ea4","line":1932,"range":{"start_line":1932,"start_character":41,"end_line":1932,"end_character":74},"in_reply_to":"1fa4df85_d54abb81","updated":"2020-03-17 13:07:01.000000000","message":"Done","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":1966,"context_line":"                        subnet[\u0027id\u0027])"},{"line_number":1967,"context_line":""},{"line_number":1968,"context_line":"        routes \u003d []"},{"line_number":1969,"context_line":"        if metadata_port_ip:"},{"line_number":1970,"context_line":"            routes.append(\u0027%s/32,%s\u0027 % ("},{"line_number":1971,"context_line":"                ovn_const.METADATA_DEFAULT_IP, metadata_port_ip))"},{"line_number":1972,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_18e87e14","line":1969,"range":{"start_line":1969,"start_character":8,"end_line":1969,"end_character":28},"updated":"2020-03-14 03:58:08.000000000","message":"it will be used at here","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        if subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2110,"context_line":"            if subnet[\u0027ip_version\u0027] \u003d\u003d 4:"},{"line_number":2111,"context_line":"                self.update_metadata_port(admin_context, network[\u0027id\u0027])"},{"line_number":2112,"context_line":"                # When a subnet without gateway enable_dhcp is true"},{"line_number":2113,"context_line":"                # and metadata-agent service is disabled,"},{"line_number":2114,"context_line":"                # we should create a reserved dhcp port for DHCP service."},{"line_number":2115,"context_line":"                self._ensure_dhcp_port(admin_context, subnet)"},{"line_number":2116,"context_line":"            self._add_subnet_dhcp_options(subnet, network)"},{"line_number":2117,"context_line":"        db_rev.bump_revision(admin_context, subnet, ovn_const.TYPE_SUBNETS)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_35f9cf4c","line":2114,"range":{"start_line":2112,"start_character":14,"end_line":2114,"end_character":73},"updated":"2020-03-13 13:57:14.000000000","message":"When subnet has no gateway and the metadata service is disabled we should create dedicated DHCP port if subnet has DHCP enabled.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"a0267f5bdfc2b7def82620131bce802aa1000ecf","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"        if subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2110,"context_line":"            if subnet[\u0027ip_version\u0027] \u003d\u003d 4:"},{"line_number":2111,"context_line":"                self.update_metadata_port(admin_context, network[\u0027id\u0027])"},{"line_number":2112,"context_line":"                # When a subnet without gateway enable_dhcp is true"},{"line_number":2113,"context_line":"                # and metadata-agent service is disabled,"},{"line_number":2114,"context_line":"                # we should create a reserved dhcp port for DHCP service."},{"line_number":2115,"context_line":"                self._ensure_dhcp_port(admin_context, subnet)"},{"line_number":2116,"context_line":"            self._add_subnet_dhcp_options(subnet, network)"},{"line_number":2117,"context_line":"        db_rev.bump_revision(admin_context, subnet, ovn_const.TYPE_SUBNETS)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_7cef0687","line":2114,"range":{"start_line":2112,"start_character":14,"end_line":2114,"end_character":73},"in_reply_to":"1fa4df85_35f9cf4c","updated":"2020-03-17 13:07:01.000000000","message":"Done","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":2131,"context_line":""},{"line_number":2132,"context_line":"        if subnet[\u0027enable_dhcp\u0027] or ovn_subnet:"},{"line_number":2133,"context_line":"            self.update_metadata_port(admin_context, network[\u0027id\u0027])"},{"line_number":2134,"context_line":"            self._ensure_dhcp_port(admin_context, subnet, ovn_subnet)"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"        check_rev_cmd \u003d self._nb_idl.check_revision_number("},{"line_number":2137,"context_line":"            subnet[\u0027id\u0027], subnet, ovn_const.TYPE_SUBNETS)"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_f87322b0","line":2134,"updated":"2020-03-14 03:58:08.000000000","message":"When enable_dhcp for subnet switched from True to False, \u0027ovn_subnet\u0027 is not None, it is the previous dhcp_options of the subnet","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":2247,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2248,"context_line":""},{"line_number":2249,"context_line":"    def _ensure_dhcp_port(self, context, subnet,"},{"line_number":2250,"context_line":"                          original_subnet_dhcp_option\u003dNone):"},{"line_number":2251,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2252,"context_line":"            return"},{"line_number":2253,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_5587abb7","line":2250,"range":{"start_line":2250,"start_character":26,"end_line":2250,"end_character":59},"updated":"2020-03-13 13:57:14.000000000","message":"This parameter is not used anywhere, it could be deleted.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":2247,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2248,"context_line":""},{"line_number":2249,"context_line":"    def _ensure_dhcp_port(self, context, subnet,"},{"line_number":2250,"context_line":"                          original_subnet_dhcp_option\u003dNone):"},{"line_number":2251,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2252,"context_line":"            return"},{"line_number":2253,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_f85a4228","line":2250,"range":{"start_line":2250,"start_character":26,"end_line":2250,"end_character":59},"in_reply_to":"1fa4df85_5587abb7","updated":"2020-03-14 03:58:08.000000000","message":"When enable_dhcp for subnet switched from True to False, it will be  used by L2134","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":2250,"context_line":"                          original_subnet_dhcp_option\u003dNone):"},{"line_number":2251,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2252,"context_line":"            return"},{"line_number":2253,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"},{"line_number":2254,"context_line":"            if not (self._get_server_id(context, subnet)):"},{"line_number":2255,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2256,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_75ad0730","line":2253,"range":{"start_line":2253,"start_character":37,"end_line":2253,"end_character":69},"updated":"2020-03-13 13:57:14.000000000","message":"For now its always true as per original_subnet_dhcp_options are never passed.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":2250,"context_line":"                          original_subnet_dhcp_option\u003dNone):"},{"line_number":2251,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2252,"context_line":"            return"},{"line_number":2253,"context_line":"        if subnet[\u0027enable_dhcp\u0027] and not original_subnet_dhcp_option:"},{"line_number":2254,"context_line":"            if not (self._get_server_id(context, subnet)):"},{"line_number":2255,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2256,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_189abec4","line":2253,"range":{"start_line":2253,"start_character":37,"end_line":2253,"end_character":69},"in_reply_to":"1fa4df85_75ad0730","updated":"2020-03-14 03:58:08.000000000","message":"Same as the comment on L2250, the parameter will be passed when enable_dhcp switched from True to False.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":2254,"context_line":"            if not (self._get_server_id(context, subnet)):"},{"line_number":2255,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2256,"context_line":"            else:"},{"line_number":2257,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2258,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2259,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2260,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2261,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2262,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_352a2f90","line":2259,"range":{"start_line":2257,"start_character":0,"end_line":2259,"end_character":51},"updated":"2020-03-13 13:57:14.000000000","message":"If we\u0027re not able to create a DHCP port you are just silent-passing.\nI think that it should be at least ERROR in the logs.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":2254,"context_line":"            if not (self._get_server_id(context, subnet)):"},{"line_number":2255,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2256,"context_line":"            else:"},{"line_number":2257,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2258,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2259,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2260,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2261,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2262,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_58b7d63b","line":2259,"range":{"start_line":2257,"start_character":0,"end_line":2259,"end_character":51},"in_reply_to":"1fa4df85_352a2f90","updated":"2020-03-14 03:58:08.000000000","message":"This only records that the create_dhcp_port method does not run as dhcp_port already exists. If other reasons cause the dhcp_port creation to fail, these reasons will be logged as error log in the create_dhcp_port method","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ecb28c12253536f90aba56508b1ba17f3dabc3b3","unresolved":false,"context_lines":[{"line_number":2257,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2258,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2259,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2260,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2261,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"    def _create_dhcp_port(self, context, subnet):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_35554f1e","line":2260,"range":{"start_line":2260,"start_character":43,"end_line":2260,"end_character":70},"updated":"2020-03-13 13:57:14.000000000","message":"Its never true.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d3dc5e80f820ac423c1430db05ee54a5f6add2e1","unresolved":false,"context_lines":[{"line_number":2257,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2258,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2259,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2260,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027] and original_subnet_dhcp_option:"},{"line_number":2261,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2262,"context_line":""},{"line_number":2263,"context_line":"    def _create_dhcp_port(self, context, subnet):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_78b41236","line":2260,"range":{"start_line":2260,"start_character":43,"end_line":2260,"end_character":70},"in_reply_to":"1fa4df85_35554f1e","updated":"2020-03-14 03:58:08.000000000","message":"Same as the comment on L2250, It will be True when enable_dhcp switched from True to False.","commit_id":"107e425821653337689f99b235c4e5f442d94b11"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0dfc0c4e9174849ffce4e412d9227a91354b8f44","unresolved":false,"context_lines":[{"line_number":1942,"context_line":"                    # Option not present, job done"},{"line_number":1943,"context_line":"                    pass"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def _get_dhcp_service_id_helper(self, context, subnet, metadata_port_ip):"},{"line_number":1946,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or \\"},{"line_number":1947,"context_line":"               self._get_dhcp_port_ip(context, subnet)"},{"line_number":1948,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"1f493fa4_c0e4123f","line":1945,"range":{"start_line":1945,"start_character":29,"end_line":1945,"end_character":35},"updated":"2020-04-27 15:11:55.000000000","message":"This \u0027helper\u0027 could be removed. Function name `_get_dhcp_service_id()` is ok for me.","commit_id":"a637b8538ba52d3d39db89450644c2e169e37290"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"138d4ee19b9e6627e483267e1934cfe36a114c34","unresolved":false,"context_lines":[{"line_number":1942,"context_line":"                    # Option not present, job done"},{"line_number":1943,"context_line":"                    pass"},{"line_number":1944,"context_line":""},{"line_number":1945,"context_line":"    def _get_dhcp_service_id_helper(self, context, subnet, metadata_port_ip):"},{"line_number":1946,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or \\"},{"line_number":1947,"context_line":"               self._get_dhcp_port_ip(context, subnet)"},{"line_number":1948,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"1f493fa4_792d4745","line":1945,"range":{"start_line":1945,"start_character":29,"end_line":1945,"end_character":35},"in_reply_to":"1f493fa4_c0e4123f","updated":"2020-05-06 10:12:11.000000000","message":"Done","commit_id":"a637b8538ba52d3d39db89450644c2e169e37290"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0dfc0c4e9174849ffce4e412d9227a91354b8f44","unresolved":false,"context_lines":[{"line_number":2272,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":2273,"context_line":"            if not self._get_dhcp_service_id_helper(context, subnet,"},{"line_number":2274,"context_line":"                                                    metadata_port_ip):"},{"line_number":2275,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2276,"context_line":"            else:"},{"line_number":2277,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2278,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1f493fa4_400da2e6","line":2275,"range":{"start_line":2275,"start_character":21,"end_line":2275,"end_character":55},"updated":"2020-04-27 15:11:55.000000000","message":"This is not tested. Can you please add unit test covering this situation? Thanks!","commit_id":"a637b8538ba52d3d39db89450644c2e169e37290"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"138d4ee19b9e6627e483267e1934cfe36a114c34","unresolved":false,"context_lines":[{"line_number":2272,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":2273,"context_line":"            if not self._get_dhcp_service_id_helper(context, subnet,"},{"line_number":2274,"context_line":"                                                    metadata_port_ip):"},{"line_number":2275,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2276,"context_line":"            else:"},{"line_number":2277,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2278,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1f493fa4_99adb39d","line":2275,"range":{"start_line":2275,"start_character":21,"end_line":2275,"end_character":55},"in_reply_to":"1f493fa4_400da2e6","updated":"2020-05-06 10:12:11.000000000","message":"This test case has been added at test_ovn_db_resources.TestNBDbResources.test_dhcp_options","commit_id":"a637b8538ba52d3d39db89450644c2e169e37290"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":1832,"context_line":"                    pass"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def _get_dhcp_service_id(self, context, subnet, metadata_port_ip):"},{"line_number":1835,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or \\"},{"line_number":1836,"context_line":"               self._get_dhcp_port_ip(context, subnet)"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_6830cf9f","line":1835,"range":{"start_line":1835,"start_character":59,"end_line":1835,"end_character":60},"updated":"2020-05-06 14:32:02.000000000","message":"nit: Let\u0027s avoid \\ for line breaks as per PEP8 [0]:\n\n\"Long lines can be broken over multiple lines by wrapping expressions in parentheses. These should be used in preference to using a backslash for line continuation.\"\n\n[0] https://www.python.org/dev/peps/pep-0008/#maximum-line-length","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":1832,"context_line":"                    pass"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def _get_dhcp_service_id(self, context, subnet, metadata_port_ip):"},{"line_number":1835,"context_line":"        return subnet[\u0027gateway_ip\u0027] or metadata_port_ip or \\"},{"line_number":1836,"context_line":"               self._get_dhcp_port_ip(context, subnet)"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":"    def _get_ovn_dhcpv4_opts(self, subnet, network, server_mac\u003dNone):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_54a7600c","line":1835,"range":{"start_line":1835,"start_character":59,"end_line":1835,"end_character":60},"in_reply_to":"1f493fa4_6830cf9f","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":2152,"context_line":"        if dhcp_port:"},{"line_number":2153,"context_line":"            for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2154,"context_line":"                if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2155,"context_line":"                    return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2156,"context_line":""},{"line_number":2157,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2158,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_a89bf763","line":2155,"updated":"2020-05-06 14:32:02.000000000","message":"super nit: Avoiding indentation\n\n dhcp_port \u003d ...\n if not dhcp_port:\n     return\n\n for fixed_ip in ...","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":2152,"context_line":"        if dhcp_port:"},{"line_number":2153,"context_line":"            for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2154,"context_line":"                if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2155,"context_line":"                    return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2156,"context_line":""},{"line_number":2157,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2158,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_b4ad04ec","line":2155,"in_reply_to":"1f493fa4_a89bf763","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":2163,"context_line":"                                             metadata_port_ip):"},{"line_number":2164,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2165,"context_line":"            else:"},{"line_number":2166,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2167,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2168,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2169,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_a8e937b8","line":2166,"range":{"start_line":2166,"start_character":66,"end_line":2166,"end_character":72},"updated":"2020-05-06 14:32:02.000000000","message":"skipped (double p\u0027s)","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":2163,"context_line":"                                             metadata_port_ip):"},{"line_number":2164,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2165,"context_line":"            else:"},{"line_number":2166,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2167,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2168,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2169,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_94a8c8d9","line":2166,"range":{"start_line":2166,"start_character":66,"end_line":2166,"end_character":72},"in_reply_to":"1f493fa4_a8e937b8","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":2164,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2165,"context_line":"            else:"},{"line_number":2166,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2167,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2168,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2169,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2170,"context_line":"            self._delete_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_a8865712","line":2167,"range":{"start_line":2167,"start_character":58,"end_line":2167,"end_character":62},"updated":"2020-05-06 14:32:02.000000000","message":"nit: DHCP","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":2164,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2165,"context_line":"            else:"},{"line_number":2166,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skiped, \u0027"},{"line_number":2167,"context_line":"                          \u0027as gateway or metadata port or dhcp port exist\u0027,"},{"line_number":2168,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2169,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2170,"context_line":"            self._delete_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_f4b78c39","line":2167,"range":{"start_line":2167,"start_character":58,"end_line":2167,"end_character":62},"in_reply_to":"1f493fa4_a8865712","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":2182,"context_line":"        except Exception:"},{"line_number":2183,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2184,"context_line":"                LOG.error(\u0027Create DHCP port for subnet %s failed\u0027,"},{"line_number":2185,"context_line":"                          subnet[\u0027id\u0027])"},{"line_number":2186,"context_line":""},{"line_number":2187,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2188,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_c8aac383","line":2185,"updated":"2020-05-06 14:32:02.000000000","message":"Can we log the actual error here ?\n\ne.g:\n\nexcept Exception as e:\n    with executils...\n        LOG.error(\u0027Create DHCP port for subnet %(sub)s \u0027\n                  \u0027failed. Error: %(error)s\u0027,\n                  {\u0027sub\u0027: subnet[\u0027id\u0027], \u0027error\u0027: %(error)s})","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":2182,"context_line":"        except Exception:"},{"line_number":2183,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2184,"context_line":"                LOG.error(\u0027Create DHCP port for subnet %s failed\u0027,"},{"line_number":2185,"context_line":"                          subnet[\u0027id\u0027])"},{"line_number":2186,"context_line":""},{"line_number":2187,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2188,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_d4b25049","line":2185,"in_reply_to":"1f493fa4_c8aac383","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"aac2a313a4df71ce4b8456260b043752081853c4","unresolved":false,"context_lines":[{"line_number":2190,"context_line":"            try:"},{"line_number":2191,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2192,"context_line":"            except Exception:"},{"line_number":2193,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2194,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2195,"context_line":"                              \u0027subnet %(subnet)s failed\u0027,"},{"line_number":2196,"context_line":"                              {\u0027port\u0027: dhcp_port[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_8889db27","line":2193,"updated":"2020-05-06 14:32:02.000000000","message":"ditto logging the error","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"c490ae841f93d46ccaf0271f1b508b888576e49e","unresolved":false,"context_lines":[{"line_number":2190,"context_line":"            try:"},{"line_number":2191,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2192,"context_line":"            except Exception:"},{"line_number":2193,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2194,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2195,"context_line":"                              \u0027subnet %(subnet)s failed\u0027,"},{"line_number":2196,"context_line":"                              {\u0027port\u0027: dhcp_port[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_3483b458","line":2193,"in_reply_to":"1f493fa4_8889db27","updated":"2020-05-07 03:19:04.000000000","message":"Done","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":1678,"context_line":"        lswitch_params \u003d self._gen_network_parameters(network)"},{"line_number":1679,"context_line":"        lswitch_name \u003d utils.ovn_name(network[\u0027id\u0027])"},{"line_number":1680,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1681,"context_line":"            txn.add(self._nb_idl.ls_add(lswitch_name, may_exist\u003dTrue,"},{"line_number":1682,"context_line":"                                        **lswitch_params))"},{"line_number":1683,"context_line":"            physnet \u003d network.get(pnet.PHYSICAL_NETWORK)"},{"line_number":1684,"context_line":"            if physnet:"},{"line_number":1685,"context_line":"                self._create_provnet_port(txn, network, physnet,"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_bfdb1d7b","line":1682,"range":{"start_line":1681,"start_character":12,"end_line":1682,"end_character":58},"updated":"2020-05-07 05:49:13.000000000","message":"is it related?","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":1678,"context_line":"        lswitch_params \u003d self._gen_network_parameters(network)"},{"line_number":1679,"context_line":"        lswitch_name \u003d utils.ovn_name(network[\u0027id\u0027])"},{"line_number":1680,"context_line":"        with self._nb_idl.transaction(check_error\u003dTrue) as txn:"},{"line_number":1681,"context_line":"            txn.add(self._nb_idl.ls_add(lswitch_name, may_exist\u003dTrue,"},{"line_number":1682,"context_line":"                                        **lswitch_params))"},{"line_number":1683,"context_line":"            physnet \u003d network.get(pnet.PHYSICAL_NETWORK)"},{"line_number":1684,"context_line":"            if physnet:"},{"line_number":1685,"context_line":"                self._create_provnet_port(txn, network, physnet,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_8b51f9db","line":1682,"range":{"start_line":1681,"start_character":12,"end_line":1682,"end_character":58},"in_reply_to":"1f493fa4_bfdb1d7b","updated":"2020-05-12 03:10:29.000000000","message":"reverted. ^v^","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"                \u0027device_id\u0027: [const.DEVICE_ID_RESERVED_DHCP_PORT],"},{"line_number":2146,"context_line":"                \u0027device_owner\u0027: [const.DEVICE_OWNER_DHCP],"},{"line_number":2147,"context_line":"                \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2148,"context_line":"            return dhcp_ports[0] if dhcp_ports else {}"},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"    def _get_dhcp_port_ip(self, context, subnet):"},{"line_number":2151,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_df44294a","line":2148,"range":{"start_line":2148,"start_character":52,"end_line":2148,"end_character":54},"updated":"2020-05-07 05:49:13.000000000","message":"why need empty dict? This is inconsistent with None returned in case subnet[\u0027enable_dhcp\u0027] is False","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2145,"context_line":"                \u0027device_id\u0027: [const.DEVICE_ID_RESERVED_DHCP_PORT],"},{"line_number":2146,"context_line":"                \u0027device_owner\u0027: [const.DEVICE_OWNER_DHCP],"},{"line_number":2147,"context_line":"                \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2148,"context_line":"            return dhcp_ports[0] if dhcp_ports else {}"},{"line_number":2149,"context_line":""},{"line_number":2150,"context_line":"    def _get_dhcp_port_ip(self, context, subnet):"},{"line_number":2151,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_0b5fa9e2","line":2148,"range":{"start_line":2148,"start_character":52,"end_line":2148,"end_character":54},"in_reply_to":"1f493fa4_df44294a","updated":"2020-05-12 03:10:29.000000000","message":"Done","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2164,"context_line":"                                             metadata_port_ip):"},{"line_number":2165,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2166,"context_line":"            else:"},{"line_number":2167,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skipped, \u0027"},{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_1f2a117d","line":2169,"range":{"start_line":2167,"start_character":16,"end_line":2169,"end_character":51},"updated":"2020-05-07 05:49:13.000000000","message":"Consider log once when port is actually created rather than log every time when it\u0027s skipped to decrease chattiness.","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2164,"context_line":"                                             metadata_port_ip):"},{"line_number":2165,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2166,"context_line":"            else:"},{"line_number":2167,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skipped, \u0027"},{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_6b73c581","line":2169,"range":{"start_line":2167,"start_character":16,"end_line":2169,"end_character":51},"in_reply_to":"1f493fa4_1f2a117d","updated":"2020-05-12 03:10:29.000000000","message":"Done","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skipped, \u0027"},{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_5f2499af","line":2170,"range":{"start_line":2170,"start_character":8,"end_line":2170,"end_character":38},"updated":"2020-05-07 05:49:13.000000000","message":"just \u0027else\u0027?","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"                LOG.debug(\u0027Create DHCP port for subnet %(subnet)s skipped, \u0027"},{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_4b708173","line":2170,"range":{"start_line":2170,"start_character":8,"end_line":2170,"end_character":38},"in_reply_to":"1f493fa4_5f2499af","updated":"2020-05-12 03:10:29.000000000","message":"Done","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2174,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_7f6fd5c4","line":2171,"range":{"start_line":2171,"start_character":17,"end_line":2171,"end_character":34},"updated":"2020-05-07 05:49:13.000000000","message":"this will delete nothing as _delete_dhcp_port() can only delete ports returned by _get_dhcp_port() - which will return nothing for subnet with disabled dhcp.","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2168,"context_line":"                          \u0027as gateway or metadata port or DHCP port exist\u0027,"},{"line_number":2169,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027]})"},{"line_number":2170,"context_line":"        elif not subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2171,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2174,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_cb32d1a7","line":2171,"range":{"start_line":2171,"start_character":17,"end_line":2171,"end_character":34},"in_reply_to":"1f493fa4_7f6fd5c4","updated":"2020-05-12 03:10:29.000000000","message":"Is there anything inappropriate here? Efficiency issues?","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2174,"context_line":"        port_dict \u003d {"},{"line_number":2175,"context_line":"            \u0027tenant_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2176,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2177,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2178,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_ff3485e0","line":2175,"range":{"start_line":2175,"start_character":13,"end_line":2175,"end_character":22},"updated":"2020-05-07 05:49:13.000000000","message":"\u0027tenant_id\u0027 is kind of deprecated, isn\u0027t \u0027project_id\u0027 supported here?","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2172,"context_line":""},{"line_number":2173,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2174,"context_line":"        port_dict \u003d {"},{"line_number":2175,"context_line":"            \u0027tenant_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2176,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2177,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT,"},{"line_number":2178,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_2b28ad32","line":2175,"range":{"start_line":2175,"start_character":13,"end_line":2175,"end_character":22},"in_reply_to":"1f493fa4_ff3485e0","updated":"2020-05-12 03:10:29.000000000","message":"Done","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"        except Exception as e:"},{"line_number":2184,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2185,"context_line":"                LOG.error(\u0027Create DHCP port for subnet %(subnet)s \u0027"},{"line_number":2186,"context_line":"                          \u0027failed. Exception:%(exception)s\u0027,"},{"line_number":2187,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027],"},{"line_number":2188,"context_line":"                           \u0027exception\u0027: e})"},{"line_number":2189,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_3f4c2d75","line":2186,"updated":"2020-05-07 05:49:13.000000000","message":"nit: space after Exception:","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"        except Exception as e:"},{"line_number":2184,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":2185,"context_line":"                LOG.error(\u0027Create DHCP port for subnet %(subnet)s \u0027"},{"line_number":2186,"context_line":"                          \u0027failed. Exception:%(exception)s\u0027,"},{"line_number":2187,"context_line":"                          {\u0027subnet\u0027: subnet[\u0027id\u0027],"},{"line_number":2188,"context_line":"                           \u0027exception\u0027: e})"},{"line_number":2189,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_6b21054e","line":2186,"in_reply_to":"1f493fa4_3f4c2d75","updated":"2020-05-12 03:10:29.000000000","message":"Done","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2188,"context_line":"                           \u0027exception\u0027: e})"},{"line_number":2189,"context_line":""},{"line_number":2190,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2191,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2192,"context_line":"        if dhcp_port:"},{"line_number":2193,"context_line":"            try:"},{"line_number":2194,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2195,"context_line":"            except Exception as e:"},{"line_number":2196,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2197,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_7f7d156d","line":2194,"range":{"start_line":2191,"start_character":8,"end_line":2194,"end_character":66},"updated":"2020-05-07 05:49:13.000000000","message":"what if the net has other subnets with enabled dhcp? Seems we shouldn\u0027t delete dhcp port if only one subnet got dhcp disabled","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2188,"context_line":"                           \u0027exception\u0027: e})"},{"line_number":2189,"context_line":""},{"line_number":2190,"context_line":"    def _delete_dhcp_port(self, context, subnet):"},{"line_number":2191,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2192,"context_line":"        if dhcp_port:"},{"line_number":2193,"context_line":"            try:"},{"line_number":2194,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2195,"context_line":"            except Exception as e:"},{"line_number":2196,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2197,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_6bcf457f","line":2194,"range":{"start_line":2191,"start_character":8,"end_line":2194,"end_character":66},"in_reply_to":"1f493fa4_7f7d156d","updated":"2020-05-12 03:10:29.000000000","message":"every subnet without gateway will create this dhcp port, and when a subnet without gateway disable dhcp, just only delete the dhcp port belong to this subnet, other subnet will not do this.","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"94355477dcd2346b43c64905c558cd3d893f3271","unresolved":false,"context_lines":[{"line_number":2194,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2195,"context_line":"            except Exception as e:"},{"line_number":2196,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2197,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2198,"context_line":"                              \u0027subnet %(subnet)s failed. Exception:%(\u0027"},{"line_number":2199,"context_line":"                              \u0027exception)s\u0027,"},{"line_number":2200,"context_line":"                              {\u0027port\u0027: dhcp_port[\u0027id\u0027],"},{"line_number":2201,"context_line":"                               \u0027subnet\u0027: subnet[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"1f493fa4_ff900598","line":2198,"range":{"start_line":2197,"start_character":30,"end_line":2198,"end_character":55},"updated":"2020-05-07 05:49:13.000000000","message":"Not sure it\u0027s fair to say \u0027DHCP port for subnet\u0027 as DHCP port is per net, not per subnet.","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"066d2612be10717a7e28414d90951633f89d0e65","unresolved":false,"context_lines":[{"line_number":2194,"context_line":"                self._plugin.delete_port(context, dhcp_port[\u0027id\u0027])"},{"line_number":2195,"context_line":"            except Exception as e:"},{"line_number":2196,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":2197,"context_line":"                    LOG.error(\u0027Delete DHCP port %(port)s for \u0027"},{"line_number":2198,"context_line":"                              \u0027subnet %(subnet)s failed. Exception:%(\u0027"},{"line_number":2199,"context_line":"                              \u0027exception)s\u0027,"},{"line_number":2200,"context_line":"                              {\u0027port\u0027: dhcp_port[\u0027id\u0027],"},{"line_number":2201,"context_line":"                               \u0027subnet\u0027: subnet[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"ff570b3c_6ba2a59c","line":2198,"range":{"start_line":2197,"start_character":30,"end_line":2198,"end_character":55},"in_reply_to":"1f493fa4_ff900598","updated":"2020-05-12 03:10:29.000000000","message":"One DHCP port per subnet","commit_id":"c0a541f4698a5d0dc27d258db2bdf751639d5437"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d062cfdcbf74f14fed64248de6ea365607dfde6e","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"                                             metadata_port_ip):"},{"line_number":2166,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2167,"context_line":"        else:"},{"line_number":2168,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2169,"context_line":""},{"line_number":2170,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2171,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff570b3c_80ab931b","line":2168,"range":{"start_line":2168,"start_character":12,"end_line":2168,"end_character":51},"updated":"2020-05-12 06:20:55.000000000","message":"I meant this will never delete anything: subnet has \u0027enable_dhcp\u0027 \u003d\u003d False, so _get_dhcp_port() inside _delete_dhcp_port() will always return None. Seems check at #2143 should be removed.","commit_id":"f26623d0ab80413b01608ccb6412630f2ba263cd"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"024cad92510d8b982982d8abf52cbfd0282cc140","unresolved":false,"context_lines":[{"line_number":2165,"context_line":"                                             metadata_port_ip):"},{"line_number":2166,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2167,"context_line":"        else:"},{"line_number":2168,"context_line":"            self._delete_dhcp_port(context, subnet)"},{"line_number":2169,"context_line":""},{"line_number":2170,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2171,"context_line":"        port_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff570b3c_d30d6738","line":2168,"range":{"start_line":2168,"start_character":12,"end_line":2168,"end_character":51},"in_reply_to":"ff570b3c_80ab931b","updated":"2020-05-12 06:45:01.000000000","message":"Yes,you are right.","commit_id":"f26623d0ab80413b01608ccb6412630f2ba263cd"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"68e9370425f7bc7011471bdd7cedfa6380e8013e","unresolved":false,"context_lines":[{"line_number":2138,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2139,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2140,"context_line":""},{"line_number":2141,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2142,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"},{"line_number":2143,"context_line":"            return"},{"line_number":2144,"context_line":"        if subnet[\u0027enable_dhcp\u0027]:"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff570b3c_1fa344a0","line":2141,"updated":"2020-05-13 08:55:59.000000000","message":"+1 to this method, used both in create and update (but the logic is incorrect)","commit_id":"658b6ceb57b547f348a0a275159286017a278671"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"68e9370425f7bc7011471bdd7cedfa6380e8013e","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"            return"},{"line_number":2144,"context_line":"        if subnet[\u0027enable_dhcp\u0027]:"},{"line_number":2145,"context_line":"            metadata_port_ip \u003d self._find_metadata_port_ip(context, subnet)"},{"line_number":2146,"context_line":"            if not self._get_dhcp_service_id(context, subnet,"},{"line_number":2147,"context_line":"                                             metadata_port_ip):"},{"line_number":2148,"context_line":"                self._create_dhcp_port(context, subnet)"},{"line_number":2149,"context_line":"        else:"},{"line_number":2150,"context_line":"            self._delete_dhcp_port(context, subnet)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff570b3c_df0eec8b","line":2147,"range":{"start_line":2146,"start_character":19,"end_line":2147,"end_character":63},"updated":"2020-05-13 08:55:59.000000000","message":"1) if we are creating a subnet, the metadata_port_ip will be None at this point\n2) _get_dhcp_port_ip will return None too, you don\u0027t have any fixed_ip assigned to this port in this subnet.\n\n--\u003e you are creating a new dhcp port for this subnet instead of searching for a DHCP port in this network and assigning the fixed_ips","commit_id":"658b6ceb57b547f348a0a275159286017a278671"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"68e9370425f7bc7011471bdd7cedfa6380e8013e","unresolved":false,"context_lines":[{"line_number":2152,"context_line":"    def _create_dhcp_port(self, context, subnet):"},{"line_number":2153,"context_line":"        port_dict \u003d {"},{"line_number":2154,"context_line":"            \u0027project_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2155,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2156,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT + subnet[\u0027id\u0027],"},{"line_number":2157,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"},{"line_number":2158,"context_line":"            \u0027network_id\u0027: subnet[\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff570b3c_3f73a84f","line":2155,"range":{"start_line":2155,"start_character":30,"end_line":2155,"end_character":35},"updated":"2020-05-13 08:55:59.000000000","message":"Why False?","commit_id":"658b6ceb57b547f348a0a275159286017a278671"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"68e9370425f7bc7011471bdd7cedfa6380e8013e","unresolved":false,"context_lines":[{"line_number":2153,"context_line":"        port_dict \u003d {"},{"line_number":2154,"context_line":"            \u0027project_id\u0027: subnet.get(\u0027project_id\u0027),"},{"line_number":2155,"context_line":"            \u0027admin_state_up\u0027: False,"},{"line_number":2156,"context_line":"            \u0027device_id\u0027: const.DEVICE_ID_RESERVED_DHCP_PORT + subnet[\u0027id\u0027],"},{"line_number":2157,"context_line":"            \u0027device_owner\u0027: const.DEVICE_OWNER_DHCP,"},{"line_number":2158,"context_line":"            \u0027network_id\u0027: subnet[\u0027network_id\u0027],"},{"line_number":2159,"context_line":"            \u0027fixed_ips\u0027: [{\u0027subnet_id\u0027: subnet[\u0027id\u0027]}]}"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff570b3c_ff78102c","line":2156,"range":{"start_line":2156,"start_character":25,"end_line":2156,"end_character":75},"updated":"2020-05-13 08:55:59.000000000","message":"If this is going to be a DHCP reserverd port, the device ID should be DEVICE_ID_RESERVED_DHCP_PORT only, without the subnet ID","commit_id":"658b6ceb57b547f348a0a275159286017a278671"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bdfb54aff729820ae418aba26e44f7e67ad4feaa","unresolved":false,"context_lines":[{"line_number":2051,"context_line":"            \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2052,"context_line":"        return dhcp_ports[0] if dhcp_ports else None"},{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"    def _get_dhcp_port_ip(self, context, subnet):"},{"line_number":2055,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2056,"context_line":"        if not dhcp_port:"},{"line_number":2057,"context_line":"            return"},{"line_number":2058,"context_line":"        for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2059,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2060,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2061,"context_line":""},{"line_number":2062,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2063,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_f66343dc","line":2060,"range":{"start_line":2054,"start_character":0,"end_line":2060,"end_character":45},"updated":"2020-07-20 09:19:10.000000000","message":"This method is not used anywhere.","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"21900e52905367a22d4f23f1d3239c893c2478fd","unresolved":false,"context_lines":[{"line_number":2051,"context_line":"            \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2052,"context_line":"        return dhcp_ports[0] if dhcp_ports else None"},{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"    def _get_dhcp_port_ip(self, context, subnet):"},{"line_number":2055,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2056,"context_line":"        if not dhcp_port:"},{"line_number":2057,"context_line":"            return"},{"line_number":2058,"context_line":"        for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2059,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2060,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2061,"context_line":""},{"line_number":2062,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2063,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_256455e5","line":2060,"range":{"start_line":2054,"start_character":0,"end_line":2060,"end_character":45},"in_reply_to":"bf51134e_f66343dc","updated":"2020-07-21 03:31:47.000000000","message":"Done","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d695768e342ed5914d4fb1701ca7948f3aebfb5e","unresolved":false,"context_lines":[{"line_number":2051,"context_line":"            \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2052,"context_line":"        return dhcp_ports[0] if dhcp_ports else None"},{"line_number":2053,"context_line":""},{"line_number":2054,"context_line":"    def _get_dhcp_port_ip(self, context, subnet):"},{"line_number":2055,"context_line":"        dhcp_port \u003d self._get_dhcp_port(context, subnet)"},{"line_number":2056,"context_line":"        if not dhcp_port:"},{"line_number":2057,"context_line":"            return"},{"line_number":2058,"context_line":"        for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"},{"line_number":2059,"context_line":"            if fixed_ip[\u0027subnet_id\u0027] \u003d\u003d subnet[\u0027id\u0027]:"},{"line_number":2060,"context_line":"                return fixed_ip[\u0027ip_address\u0027]"},{"line_number":2061,"context_line":""},{"line_number":2062,"context_line":"    def _ensure_dhcp_port(self, context, subnet):"},{"line_number":2063,"context_line":"        if not subnet[\u0027ip_version\u0027] \u003d\u003d const.IP_VERSION_4:"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_972c82ad","line":2060,"range":{"start_line":2054,"start_character":0,"end_line":2060,"end_character":45},"in_reply_to":"bf51134e_f66343dc","updated":"2020-07-21 00:59:49.000000000","message":"yes.You are right","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bdfb54aff729820ae418aba26e44f7e67ad4feaa","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"                               \u0027exception\u0027: e})"},{"line_number":2094,"context_line":"        if action \u003d\u003d \u0027update\u0027:"},{"line_number":2095,"context_line":"            fixed_ips \u003d (dhcp_port.get(\u0027fixed_ips\u0027, []).append("},{"line_number":2096,"context_line":"                {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}))"},{"line_number":2097,"context_line":"            port_dict \u003d {\u0027fixed_ips\u0027: fixed_ips}"},{"line_number":2098,"context_line":"            p_utils.update_port_on_error(self._plugin, context,"},{"line_number":2099,"context_line":"                                         dhcp_port[\u0027id\u0027], port_dict)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_b6a70b0c","line":2096,"updated":"2020-07-20 09:19:10.000000000","message":"Why are you doing this? Why are you mixing IPs and subnet in the same list?\n\nThis port has been updated, during the plugin processing, calling the IPAM. The fixed IPs stored in dhcp_port should be enough.","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e7ca851ecbe855109d5ee4aaf5e2de89560373bf","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"                               \u0027exception\u0027: e})"},{"line_number":2094,"context_line":"        if action \u003d\u003d \u0027update\u0027:"},{"line_number":2095,"context_line":"            fixed_ips \u003d (dhcp_port.get(\u0027fixed_ips\u0027, []).append("},{"line_number":2096,"context_line":"                {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}))"},{"line_number":2097,"context_line":"            port_dict \u003d {\u0027fixed_ips\u0027: fixed_ips}"},{"line_number":2098,"context_line":"            p_utils.update_port_on_error(self._plugin, context,"},{"line_number":2099,"context_line":"                                         dhcp_port[\u0027id\u0027], port_dict)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_4fed238a","line":2096,"in_reply_to":"bf51134e_af332613","updated":"2020-07-21 12:09:52.000000000","message":"But as I commented, the port has been updated in the plugin. Any fixed IP belonging to a new subnet, should have been added in the IPAM module.\n\nYou should only get the port fixed_ips, nothing else.\n\n**BTW, this should be tested in a UT** Actually, UTs in test_mech_driver are mocking those new methods. You are not testing them.","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d695768e342ed5914d4fb1701ca7948f3aebfb5e","unresolved":false,"context_lines":[{"line_number":2093,"context_line":"                               \u0027exception\u0027: e})"},{"line_number":2094,"context_line":"        if action \u003d\u003d \u0027update\u0027:"},{"line_number":2095,"context_line":"            fixed_ips \u003d (dhcp_port.get(\u0027fixed_ips\u0027, []).append("},{"line_number":2096,"context_line":"                {\u0027subnet_id\u0027: subnet[\u0027id\u0027]}))"},{"line_number":2097,"context_line":"            port_dict \u003d {\u0027fixed_ips\u0027: fixed_ips}"},{"line_number":2098,"context_line":"            p_utils.update_port_on_error(self._plugin, context,"},{"line_number":2099,"context_line":"                                         dhcp_port[\u0027id\u0027], port_dict)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_af332613","line":2096,"in_reply_to":"bf51134e_b6a70b0c","updated":"2020-07-21 00:59:49.000000000","message":"Here\u0027s what I think.can you help me see this?\nIf a Network already has a subnet and a dhcp_port, but a new subnet is created in this network, this new subnet should have its own dhcp_option (server_id, router_id, etc.), I add this information to the fixed_ips of the existing dhcp_port.","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e7ca851ecbe855109d5ee4aaf5e2de89560373bf","unresolved":false,"context_lines":[{"line_number":2047,"context_line":"    def _get_dhcp_port(self, context, subnet):"},{"line_number":2048,"context_line":"        dhcp_ports \u003d self._plugin.get_ports(context, filters\u003d{"},{"line_number":2049,"context_line":"            \u0027device_id\u0027: [const.DEVICE_ID_RESERVED_DHCP_PORT],"},{"line_number":2050,"context_line":"            \u0027device_owner\u0027: [const.DEVICE_OWNER_DISTRIBUTED],"},{"line_number":2051,"context_line":"            \u0027network_id\u0027: [subnet[\u0027network_id\u0027]]})"},{"line_number":2052,"context_line":"        return dhcp_ports[0] if dhcp_ports else None"},{"line_number":2053,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"bf51134e_af531f6c","line":2050,"updated":"2020-07-21 12:09:52.000000000","message":"+1","commit_id":"db865b7700e52c050a178774b24f6f7293aea66c"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovn_db_resources.py":[{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"138d4ee19b9e6627e483267e1934cfe36a114c34","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        for (cidr, enable_dhcp, gateway_ip) in ["},{"line_number":168,"context_line":"                (\u002750.0.0.0/24\u0027, False, \u002750.0.0.1\u0027),"},{"line_number":169,"context_line":"                (\u002760.0.0.0/24\u0027, True, \u002760.0.0.254\u0027),"},{"line_number":170,"context_line":"                (\u002770.0.0.0/24\u0027, True, None),"},{"line_number":171,"context_line":"                (\u0027cef0::/64\u0027, False, \u0027cef0::1\u0027),"},{"line_number":172,"context_line":"                (\u0027def0::/64\u0027, True, None)]:"},{"line_number":173,"context_line":"            ip_version \u003d netaddr.IPNetwork(cidr).ip.version"}],"source_content_type":"text/x-python","patch_set":23,"id":"1f493fa4_798ee727","line":170,"range":{"start_line":170,"start_character":0,"end_line":170,"end_character":44},"updated":"2020-05-06 10:12:11.000000000","message":"Here is the relevant testcase","commit_id":"269adcb60c05322cdad4d1cf319268aa1b0cc4df"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bdfb54aff729820ae418aba26e44f7e67ad4feaa","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027options\u0027: lsp.dhcpv6_options[0].options}"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            observed_lsp_dhcpv6_options \u003d {}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if expected_lsp_dhcpv6_options is None:"},{"line_number":93,"context_line":"            expected_lsp_dhcpv6_options \u003d {}"},{"line_number":94,"context_line":"        if expected_lsp_dhcpv4_options:"},{"line_number":95,"context_line":"            self.assertEqual(expected_lsp_dhcpv4_options,"},{"line_number":96,"context_line":"                             observed_lsp_dhcpv4_options)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_b65c2bee","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":44},"updated":"2020-07-20 09:19:10.000000000","message":"you don\u0027t need that now","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"21900e52905367a22d4f23f1d3239c893c2478fd","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027options\u0027: lsp.dhcpv6_options[0].options}"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            observed_lsp_dhcpv6_options \u003d {}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if expected_lsp_dhcpv6_options is None:"},{"line_number":93,"context_line":"            expected_lsp_dhcpv6_options \u003d {}"},{"line_number":94,"context_line":"        if expected_lsp_dhcpv4_options:"},{"line_number":95,"context_line":"            self.assertEqual(expected_lsp_dhcpv4_options,"},{"line_number":96,"context_line":"                             observed_lsp_dhcpv4_options)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_655e4d13","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":44},"in_reply_to":"bf51134e_b65c2bee","updated":"2020-07-21 03:31:47.000000000","message":"Done","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":31210,"name":"zhangyuhe","email":"1073258077@qq.com","username":"zhangyuhe"},"change_message_id":"d695768e342ed5914d4fb1701ca7948f3aebfb5e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027options\u0027: lsp.dhcpv6_options[0].options}"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            observed_lsp_dhcpv6_options \u003d {}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if expected_lsp_dhcpv6_options is None:"},{"line_number":93,"context_line":"            expected_lsp_dhcpv6_options \u003d {}"},{"line_number":94,"context_line":"        if expected_lsp_dhcpv4_options:"},{"line_number":95,"context_line":"            self.assertEqual(expected_lsp_dhcpv4_options,"},{"line_number":96,"context_line":"                             observed_lsp_dhcpv4_options)"}],"source_content_type":"text/x-python","patch_set":32,"id":"bf51134e_ef3d1ede","line":93,"range":{"start_line":91,"start_character":0,"end_line":93,"end_character":44},"in_reply_to":"bf51134e_b65c2bee","updated":"2020-07-21 00:59:49.000000000","message":"yes,i will remove it","commit_id":"4b9ce9f6511bfb748e4c740c6faebd92c3bea455"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1c29938cc47b18c1e6fa26039b5423d2fcca256d","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _get_subnet_dhcp_port(self, subnet):"},{"line_number":100,"context_line":"        port_res \u003d self._list_ports(self.fmt, net_id\u003dsubnet[\u0027network_id\u0027],"},{"line_number":101,"context_line":"                                    device_owner\u003dn_const.DEVICE_OWNER_DISTRIBUTED)"},{"line_number":102,"context_line":"        dhcp_ports \u003d self.deserialize(self.fmt, port_res)[\u0027ports\u0027]"},{"line_number":103,"context_line":"        for dhcp_port in dhcp_ports:"},{"line_number":104,"context_line":"            for fixed_ip in dhcp_port.get(\u0027fixed_ips\u0027, []):"}],"source_content_type":"text/x-python","patch_set":34,"id":"bf51134e_00dbff4e","line":101,"updated":"2020-07-21 06:04:09.000000000","message":"pep8: E501 line too long (82 \u003e 79 characters)","commit_id":"d00548577fdf06aeb5c317c1e56af494159d3817"}]}
