)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"6e7d13a356e0e63e73f2fae7489c67a071d7a48c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003ci@liuyulong.me\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-10-11 17:30:54 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Forbiden some L3 related port type change IP address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Some L3 ports can directly modify the IP address now,"},{"line_number":10,"context_line":"but there are some types of device_owner, for instance"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_65fcbf0c","line":7,"range":{"start_line":7,"start_character":3,"end_line":7,"end_character":8},"updated":"2018-10-15 18:33:40.000000000","message":"bidden","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"25d3e227c88c1ce3d94b7d1cbe237de48763a982","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LIU Yulong \u003ci@liuyulong.me\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-10-11 17:30:54 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Forbiden some L3 related port type change IP address"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Some L3 ports can directly modify the IP address now,"},{"line_number":10,"context_line":"but there are some types of device_owner, for instance"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_d743f73e","line":7,"range":{"start_line":7,"start_character":3,"end_line":7,"end_character":8},"in_reply_to":"3f79a3b5_65fcbf0c","updated":"2018-10-16 09:43:48.000000000","message":"Done","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"6e7d13a356e0e63e73f2fae7489c67a071d7a48c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"allow the gateway port to update the IP address"},{"line_number":19,"context_line":"directly, aka device_owner network:router_gateway."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The following l3 router ports will not allow directly"},{"line_number":22,"context_line":"port IP address updating:"},{"line_number":23,"context_line":"  network:ha_router_replicated_interface"},{"line_number":24,"context_line":"  network:router_centralized_snat"},{"line_number":25,"context_line":"  network:router_ha_interface"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_2829be87","line":22,"range":{"start_line":21,"start_character":35,"end_line":22,"end_character":25},"updated":"2018-10-15 18:33:40.000000000","message":"not be allowed to directly update the IP address.","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"25d3e227c88c1ce3d94b7d1cbe237de48763a982","unresolved":false,"context_lines":[{"line_number":18,"context_line":"allow the gateway port to update the IP address"},{"line_number":19,"context_line":"directly, aka device_owner network:router_gateway."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"The following l3 router ports will not allow directly"},{"line_number":22,"context_line":"port IP address updating:"},{"line_number":23,"context_line":"  network:ha_router_replicated_interface"},{"line_number":24,"context_line":"  network:router_centralized_snat"},{"line_number":25,"context_line":"  network:router_ha_interface"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_f73e33b4","line":22,"range":{"start_line":21,"start_character":35,"end_line":22,"end_character":25},"in_reply_to":"3f79a3b5_2829be87","updated":"2018-10-16 09:43:48.000000000","message":"Done","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"6e7d13a356e0e63e73f2fae7489c67a071d7a48c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"  network:router_interface"},{"line_number":27,"context_line":"  network:router_interface_distributed"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Remove one unit test case since it will not occur in"},{"line_number":30,"context_line":"neutron."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: I2890a71abc82cb781b601afb879bdcca10e39257"},{"line_number":33,"context_line":"Closes-Bug: #1796824"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_68581624","line":30,"range":{"start_line":29,"start_character":0,"end_line":30,"end_character":8},"updated":"2018-10-15 18:33:40.000000000","message":"May be you should decouple this change from this patch and make your patch dependent on this patch.","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"25d3e227c88c1ce3d94b7d1cbe237de48763a982","unresolved":false,"context_lines":[{"line_number":26,"context_line":"  network:router_interface"},{"line_number":27,"context_line":"  network:router_interface_distributed"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Remove one unit test case since it will not occur in"},{"line_number":30,"context_line":"neutron."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: I2890a71abc82cb781b601afb879bdcca10e39257"},{"line_number":33,"context_line":"Closes-Bug: #1796824"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3f79a3b5_17672fec","line":30,"range":{"start_line":29,"start_character":0,"end_line":30,"end_character":8},"in_reply_to":"3f79a3b5_68581624","updated":"2018-10-16 09:43:48.000000000","message":"IMO, it is related to this patch, and we can save time to review it, so \n it\u0027s not so much necessary to add a new patch set, : )","commit_id":"71da19421266980ff754f20a536c48b8a0fc0050"}],"neutron/common/constants.py":[{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"edc77fa55e465c86643df9965ba5b34dbb1fbcb6","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# The following L3 router ports will not be allowed to"},{"line_number":258,"context_line":"# directly update the IP address:"},{"line_number":259,"context_line":"L3_IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":260,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":261,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":262,"context_line":"    lib_constants.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":263,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_67787fc1","line":267,"range":{"start_line":259,"start_character":0,"end_line":267,"end_character":65},"updated":"2018-10-25 23:54:41.000000000","message":"functionality wise its still same and is forcing this list on to all L3 backends regardless, I suggested to make it part of l3 plugin, and then check self.l3_plugin.IP_UPDATE_NOT_ALLOWED_LIST, by doing it this way L3 plugins if used out of neutron tree can override this behavior simply end easily.\n\nNOTE: -1 won\u0027t be related to this patch if given","commit_id":"1c9f93e55be332f0cb54d32929b59e5a98e12316"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"dad33de73c54d21a2fb4e6c6b5e05f6398adb793","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# The following L3 router ports will not be allowed to"},{"line_number":258,"context_line":"# directly update the IP address:"},{"line_number":259,"context_line":"L3_IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":260,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":261,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":262,"context_line":"    lib_constants.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":263,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_c01fd6b5","line":267,"range":{"start_line":259,"start_character":0,"end_line":267,"end_character":65},"in_reply_to":"3f79a3b5_67787fc1","updated":"2018-10-26 03:06:03.000000000","message":"Done, thanks","commit_id":"1c9f93e55be332f0cb54d32929b59e5a98e12316"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"a765e28a2b87735d5e4c55055089562d13d73161","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# The following L3 router ports will not be allowed to"},{"line_number":258,"context_line":"# directly update the IP address:"},{"line_number":259,"context_line":"L3_IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":260,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":261,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":262,"context_line":"    lib_constants.DEVICE_OWNER_HA_REPLICATED_INT,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_ac4dfbc5","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":29},"updated":"2018-10-25 22:14:43.000000000","message":"May be since we are dealing with the RTR DEVICE OWNER, if it is ok with you, can I suggest that you use this constant name.\n\nRTR_DEV_OWNER_LIST_IP_UPDATE_RESTRICTED","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"dad33de73c54d21a2fb4e6c6b5e05f6398adb793","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"# The following L3 router ports will not be allowed to"},{"line_number":258,"context_line":"# directly update the IP address:"},{"line_number":259,"context_line":"L3_IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":260,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":261,"context_line":"    lib_constants.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":262,"context_line":"    lib_constants.DEVICE_OWNER_HA_REPLICATED_INT,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_a0241a0f","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":29},"in_reply_to":"3f79a3b5_ac4dfbc5","updated":"2018-10-26 03:06:03.000000000","message":"Move to l3 plugin, and that `RTR` prefix seems not needed anymore.","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"a765e28a2b87735d5e4c55055089562d13d73161","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_2c2b2bea","line":267,"updated":"2018-10-25 22:14:43.000000000","message":"Why do we need two constant declaration for the same list.\nCan\u0027t we use the \u0027L3_IP_UPDATE_NOT_ALLOWED_LIST\u0027 in IPAM.","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"dad33de73c54d21a2fb4e6c6b5e05f6398adb793","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_b2055017","line":267,"in_reply_to":"3f79a3b5_2c2b2bea","updated":"2018-10-26 03:06:03.000000000","message":"@Swaminathan, L2 port types not defined here because we do not need it now. But maybe it will someday.","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"edc77fa55e465c86643df9965ba5b34dbb1fbcb6","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_d29d6cba","line":267,"in_reply_to":"3f79a3b5_2c2b2bea","updated":"2018-10-25 23:54:41.000000000","message":"wouldn\u0027t it be better if we get it from l3_plugin that\u0027ll provide the ability to different plugins to choose not allowed devices, but having constant here or in ipam is like forcing it on all l3 plugins.","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"dad33de73c54d21a2fb4e6c6b5e05f6398adb793","unresolved":false,"context_lines":[{"line_number":264,"context_line":"    lib_constants.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":265,"context_line":"# The following list is for IPAM to prevent directly update port"},{"line_number":266,"context_line":"# IP address. Currently it only has some L3 related types."},{"line_number":267,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L3_IP_UPDATE_NOT_ALLOWED_LIST"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_2011eaaf","line":267,"in_reply_to":"3f79a3b5_d29d6cba","updated":"2018-10-26 03:06:03.000000000","message":"Done, thanks","commit_id":"e84f3f887c6492ad27486883ff04bd7f898cef3e"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"9f436d9a1a6b32b313efdb2228f5ce478b3f4a79","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"                # back to sanity."},{"line_number":1379,"context_line":"                raise os_db_exc.RetryRequest(e)"},{"line_number":1380,"context_line":"            except ipam_exc.IPAddressChangeNotAllowed as e:"},{"line_number":1381,"context_line":"                raise exc.BadRequest(resource\u003d\u0027ports\u0027, msg\u003de)"},{"line_number":1382,"context_line":"        return self._make_port_dict(db_port)"},{"line_number":1383,"context_line":""},{"line_number":1384,"context_line":"    @lib_db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_1effff66","line":1381,"range":{"start_line":1381,"start_character":46,"end_line":1381,"end_character":53},"updated":"2018-10-19 01:05:42.000000000","message":"I\u0027m pretty sure constant exist for this and can be used.","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e6e83ca97d9d2fe75ddf3afeeb648012cb115818","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"                # back to sanity."},{"line_number":1379,"context_line":"                raise os_db_exc.RetryRequest(e)"},{"line_number":1380,"context_line":"            except ipam_exc.IPAddressChangeNotAllowed as e:"},{"line_number":1381,"context_line":"                raise exc.BadRequest(resource\u003d\u0027ports\u0027, msg\u003de)"},{"line_number":1382,"context_line":"        return self._make_port_dict(db_port)"},{"line_number":1383,"context_line":""},{"line_number":1384,"context_line":"    @lib_db_api.retry_if_session_inactive()"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_3989b51d","line":1381,"range":{"start_line":1381,"start_character":46,"end_line":1381,"end_character":53},"in_reply_to":"3f79a3b5_1effff66","updated":"2018-10-19 03:22:52.000000000","message":"Seems that resources.PORTS should only be used for the notification and callbacks, but here is an API exception. For instance, the \u0027subnets\u0027 in this file, all the BadRequest\u0027s resource is directly using such str. All the notify(s) for subnet are using that resources.SUBNET.","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"}],"neutron/db/ipam_pluggable_backend.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9dc58aa013f6fc4e1ecfa5ae719cdbec360095f9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_DENY_LIST \u003d (constants.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":41,"context_line":"                       constants.DEVICE_OWNER_DVR_INTERFACE)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_f840f434","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":19},"updated":"2018-10-09 14:48:49.000000000","message":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST ?  It\u0027s a really long name...","commit_id":"2a1877196a394568d2761fa89f28448469888a29"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"da119d0196ce627cd95e4f94a7915bdcaab57631","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":43,"context_line":"    constants.DEVICE_OWNER_DVR_INTERFACE)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_e45fbf4a","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":33},"updated":"2018-10-11 10:07:47.000000000","message":"I think router_ha_interface port should also needs to be considered.","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"92b72c479db88947e4fa9e4fb82826f32481f7de","unresolved":false,"context_lines":[{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":43,"context_line":"    constants.DEVICE_OWNER_DVR_INTERFACE)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_b26c709d","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":33},"in_reply_to":"3f79a3b5_e45fbf4a","updated":"2018-10-14 08:39:50.000000000","message":"Done","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"839dfe2d4a7b990fa404dea9d5d50c590800ef8e","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        return fixed_ip_list"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def _check_ip_version(self, context, ip_list):"},{"line_number":292,"context_line":"        for ip in ip_list:"},{"line_number":293,"context_line":"            ip_address \u003d ip.get(\u0027ip_address\u0027)"},{"line_number":294,"context_line":"            if ip_address:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_ae5ccb1a","line":291,"updated":"2018-10-18 00:49:17.000000000","message":"How about add a param \"ip_version\" here, we can pass any ip version if we also need to check ipv6 version. And pass constants.IP_VERSION_4 in L315 and L318.","commit_id":"8a92b5eb39de53ee5efe395bd9608f6d9608742d"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a6e8d7fdb9f7cd7021a87999bfe171589207c31","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        return fixed_ip_list"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def _check_ip_version(self, context, ip_list):"},{"line_number":292,"context_line":"        for ip in ip_list:"},{"line_number":293,"context_line":"            ip_address \u003d ip.get(\u0027ip_address\u0027)"},{"line_number":294,"context_line":"            if ip_address:"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_dbf1ab02","line":291,"in_reply_to":"3f79a3b5_ae5ccb1a","updated":"2018-10-18 10:47:38.000000000","message":"Future use should be done in future, since the suggestion is really smple and not cause any review complexity, so let\u0027s mark this here, and refactor it. Done","commit_id":"8a92b5eb39de53ee5efe395bd9608f6d9608742d"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"9f436d9a1a6b32b313efdb2228f5ce478b3f4a79","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_HA_INTF,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_de350745","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":65},"updated":"2018-10-19 01:05:42.000000000","message":"or may be not, since these very neutronic IMO, diffferent backends may want to handle it differently, say x L3 backend wants to have its own set of devices which it wouldn\u0027t want to update PC, each backend can maintain this ? would making this part of L3 plugin make sense ? it won\u0027t force devices on backends.","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fb062af5015dcce350825bfb870d44f7b729a3a3","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_HA_INTF,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_f9c57d91","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":65},"in_reply_to":"3f79a3b5_de350745","updated":"2018-10-19 01:39:31.000000000","message":"Thanks for the comment. We are going to update the port IP directly by l2 API. It\u0027s something like L3 plugin has requirements to L2: \"don\u0027t let it change IP, I can not handle it\". And furthermore, put the list here is more generic, because someday maybe some L2 port types also want to limit the IP change. And put the code change here is really simple and easy to review. What do you think?\n\nOr I can refactor this list to such style:\nL3_IP_UPDATE_NOT_ALLOWED_LIST \u003d [...]\nIP_UPDATE_NOT_ALLOWED_DEVICE_LIST +\u003d L3_IP_UPDATE_NOT_ALLOWED_LIST","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"988802c38204f8e309d17c89f60d883b983c037b","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_HA_INTF,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_de4c27cb","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":65},"in_reply_to":"3f79a3b5_de350745","updated":"2018-10-19 01:06:26.000000000","message":"update IP** instead of PC in previous comment","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"57d51dca14703cf4214c1d02adcd71d7741d1a9d","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_HA_INTF,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_a8b5587f","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":65},"in_reply_to":"3f79a3b5_eb983577","updated":"2018-10-20 14:04:32.000000000","message":"Just directly defined into the constants, patch set 10 already done that.","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"0263d30b4711fb891072f32a8f92a6d649064ba2","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"# TODO(liuyulong): This list can be moved to neutron-lib someday."},{"line_number":40,"context_line":"IP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d ("},{"line_number":41,"context_line":"    constants.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":42,"context_line":"    constants.DEVICE_OWNER_ROUTER_HA_INTF,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_eb983577","line":39,"range":{"start_line":39,"start_character":0,"end_line":39,"end_character":65},"in_reply_to":"3f79a3b5_f9c57d91","updated":"2018-10-19 17:14:06.000000000","message":"this will not add much its still  the same thing. just separating L2 from L3 might be a good idea. so essentially\nIP_UPDATE_NOT_ALLOWED_DEVICE_LIST \u003d L2_IP_UPDATES_NOT_ALLOWED + L3_IP_UPDATES_NOT_ALLOWED ? and\n\nL2_IP_UPDATES_NOT_ALLOWED can be fetched from enabled L2 plugin and likewise L3_IP_UPDATES_NOT_ALLOWED can be fetched from enabled L3 plugin ? how does that sound ?","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"1d7cb8128ab20ca494714f273215bb260e3ff16c","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                ip_addr \u003d netaddr.IPAddress(ip_address)"},{"line_number":289,"context_line":"                if ip_addr.version \u003d\u003d version:"},{"line_number":290,"context_line":"                    return True"},{"line_number":291,"context_line":"            subnet_id \u003d ip.get(\u0027subnet_id\u0027)"},{"line_number":292,"context_line":"            if subnet_id:"},{"line_number":293,"context_line":"                subnet \u003d obj_subnet.Subnet.get_object(context, id\u003dsubnet_id)"},{"line_number":294,"context_line":"                if subnet and subnet.ip_version \u003d\u003d version:"},{"line_number":295,"context_line":"                    return True"},{"line_number":296,"context_line":"        return False"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def _update_ips_for_port(self, context, port, host,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_1cf1d9de","line":295,"range":{"start_line":291,"start_character":0,"end_line":295,"end_character":31},"updated":"2018-10-24 21:36:35.000000000","message":"Nit: if the ip_address is a v6 address, we can skip the check on the subnet, so suggest to do the following change:\n\n    if ip_address:\n        ...\n    elif ip.get(\u0027subnet_id\u0027):\n        subnet \u003d obj_subnet.Subnet.get_object(context, id\u003dip[\u0027subnet_id\u0027])\n        ...","commit_id":"1c9f93e55be332f0cb54d32929b59e5a98e12316"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"83fade184ac4ebcabc6956851e1c653ecab4f06e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_f4c36d39","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":32},"updated":"2018-11-13 18:15:51.000000000","message":"get_ip_update_not_allowed_list","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3f551d57de856e2014fa4772ee81a91e21d14c65","unresolved":false,"context_lines":[{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_900a3727","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":32},"in_reply_to":"3f79a3b5_f4c36d39","updated":"2018-11-30 02:03:03.000000000","message":"Done","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"83fade184ac4ebcabc6956851e1c653ecab4f06e","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."},{"line_number":47,"context_line":"    # L2 plugin can add the same list here, but for now it is not required."},{"line_number":48,"context_line":"    return getattr(l3plugin, \u0027IP_UPDATE_NOT_ALLOWED_LIST\u0027, [])"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_94b559d2","line":45,"range":{"start_line":45,"start_character":48,"end_line":45,"end_character":63},"updated":"2018-11-13 18:15:51.000000000","message":"nit: direct update of port","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3f551d57de856e2014fa4772ee81a91e21d14c65","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."},{"line_number":47,"context_line":"    # L2 plugin can add the same list here, but for now it is not required."},{"line_number":48,"context_line":"    return getattr(l3plugin, \u0027IP_UPDATE_NOT_ALLOWED_LIST\u0027, [])"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_b00f3337","line":45,"range":{"start_line":45,"start_character":48,"end_line":45,"end_character":63},"in_reply_to":"3f79a3b5_94b559d2","updated":"2018-11-30 02:03:03.000000000","message":"Done","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6eca6f5fa6636db385b40e9772c1b05627dfae8d","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            context, original_ips, new_ips, port[\u0027device_owner\u0027])"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if port[\u0027device_owner\u0027] in get_ip_update_not_allow_list():"},{"line_number":317,"context_line":"            ip_v4_removed \u003d ("},{"line_number":318,"context_line":"                changes.remove and self._check_ip_changed_by_version("},{"line_number":319,"context_line":"                    context, changes.remove, constants.IP_VERSION_4))"},{"line_number":320,"context_line":"            ip_v4_added \u003d ("},{"line_number":321,"context_line":"                changes.add and self._check_ip_changed_by_version("},{"line_number":322,"context_line":"                    context, changes.add, constants.IP_VERSION_4))"},{"line_number":323,"context_line":"            if (ip_v4_removed or ip_v4_added):"},{"line_number":324,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_009d5508","line":322,"range":{"start_line":317,"start_character":0,"end_line":322,"end_character":66},"updated":"2018-11-01 21:40:58.000000000","message":"Why not just one call:\n\nip_v4_changed \u003d self._check_ip_changed_by_version(context, changes.remove + changes.add,\n    constants.IP_VERSION_4)","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fdb4a4879848aad0a6bc46ae32e0e896948042d3","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            context, original_ips, new_ips, port[\u0027device_owner\u0027])"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        if port[\u0027device_owner\u0027] in get_ip_update_not_allow_list():"},{"line_number":317,"context_line":"            ip_v4_removed \u003d ("},{"line_number":318,"context_line":"                changes.remove and self._check_ip_changed_by_version("},{"line_number":319,"context_line":"                    context, changes.remove, constants.IP_VERSION_4))"},{"line_number":320,"context_line":"            ip_v4_added \u003d ("},{"line_number":321,"context_line":"                changes.add and self._check_ip_changed_by_version("},{"line_number":322,"context_line":"                    context, changes.add, constants.IP_VERSION_4))"},{"line_number":323,"context_line":"            if (ip_v4_removed or ip_v4_added):"},{"line_number":324,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":325,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_39b3a337","line":322,"range":{"start_line":317,"start_character":0,"end_line":322,"end_character":66},"in_reply_to":"3f79a3b5_009d5508","updated":"2018-11-06 11:27:20.000000000","message":"Done","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6eca6f5fa6636db385b40e9772c1b05627dfae8d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            ip_v4_added \u003d ("},{"line_number":321,"context_line":"                changes.add and self._check_ip_changed_by_version("},{"line_number":322,"context_line":"                    context, changes.add, constants.IP_VERSION_4))"},{"line_number":323,"context_line":"            if (ip_v4_removed or ip_v4_added):"},{"line_number":324,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_e03e19e2","line":323,"range":{"start_line":323,"start_character":1,"end_line":323,"end_character":46},"updated":"2018-11-01 21:40:58.000000000","message":"An the here just:\n\nif ip_v4_changed:","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fdb4a4879848aad0a6bc46ae32e0e896948042d3","unresolved":false,"context_lines":[{"line_number":320,"context_line":"            ip_v4_added \u003d ("},{"line_number":321,"context_line":"                changes.add and self._check_ip_changed_by_version("},{"line_number":322,"context_line":"                    context, changes.add, constants.IP_VERSION_4))"},{"line_number":323,"context_line":"            if (ip_v4_removed or ip_v4_added):"},{"line_number":324,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_d9314fbd","line":323,"range":{"start_line":323,"start_character":1,"end_line":323,"end_character":46},"in_reply_to":"3f79a3b5_e03e19e2","updated":"2018-11-06 11:27:20.000000000","message":"Done","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"16fca14d0dea51c2ec61c861f3bf811bbbb0f32d","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        if port[\u0027device_owner\u0027] in get_ip_update_not_allow_list():"},{"line_number":317,"context_line":"            ip_v4_changed \u003d self._check_ip_changed_by_version("},{"line_number":318,"context_line":"                context, changes.remove + changes.add,"},{"line_number":319,"context_line":"                constants.IP_VERSION_4)"},{"line_number":320,"context_line":"            if ip_v4_changed:"},{"line_number":321,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_5bb2c232","line":319,"updated":"2018-11-09 11:32:17.000000000","message":"so IPv6 can be changed on same port? Can You explain why it\u0027s like that?","commit_id":"9a92651f413764ee40dec3851212d9042452adc5"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"67033cda64cb1ac73d1ea8774dbc64cc219fc271","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        if port[\u0027device_owner\u0027] in get_ip_update_not_allow_list():"},{"line_number":317,"context_line":"            ip_v4_changed \u003d self._check_ip_changed_by_version("},{"line_number":318,"context_line":"                context, changes.remove + changes.add,"},{"line_number":319,"context_line":"                constants.IP_VERSION_4)"},{"line_number":320,"context_line":"            if ip_v4_changed:"},{"line_number":321,"context_line":"                raise ipam_exc.IPAddressChangeNotAllowed(port_id\u003dport[\u0027id\u0027])"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_f4007bb3","line":319,"in_reply_to":"3f79a3b5_5bb2c232","updated":"2018-11-09 14:46:02.000000000","message":"Adding IPv6 interface (subnet) to router has a different procedure from ipv4, it adds a new v6 IP address (from the different v6 subnet) to the existing router port:\nhttps://github.com/openstack/neutron/blob/master/neutron/db/l3_db.py#L837\n\nSo if we restrict port change IPv6 address here, such behavior will not work.","commit_id":"9a92651f413764ee40dec3851212d9042452adc5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7c4957a44d56859b857ba6cb91fb7c75f8cac656","unresolved":false,"context_lines":[{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_6333d0c4","line":43,"range":{"start_line":43,"start_character":22,"end_line":43,"end_character":27},"updated":"2018-11-19 22:42:34.000000000","message":"nit: allowed\n\nAlso, the name doesn\u0027t exactly make it obvious what it\u0027s returning, \u0027get_ip_update_not_allowed_device_owner_list\u0027 is a little better.","commit_id":"46aeaa08e2de1faab79bdef0d178f664b02b9c6a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3f551d57de856e2014fa4772ee81a91e21d14c65","unresolved":false,"context_lines":[{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"def get_ip_update_not_allow_list():"},{"line_number":44,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":45,"context_line":"    # The following list is for IPAM to prevent directly update port"},{"line_number":46,"context_line":"    # IP address. Currently it only has some L3 related types."}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_70019b08","line":43,"range":{"start_line":43,"start_character":22,"end_line":43,"end_character":27},"in_reply_to":"3f79a3b5_6333d0c4","updated":"2018-11-30 02:03:03.000000000","message":"Done","commit_id":"46aeaa08e2de1faab79bdef0d178f664b02b9c6a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5af1d4bfeb6dad6e645f21c9def63882b4d4e8f5","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    if l3plugin and l3plugin.router_supports_scheduling(context, router_id):"},{"line_number":54,"context_line":"        return True"},{"line_number":55,"context_line":"    return False"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_9f5a1f5b","line":53,"updated":"2018-12-03 09:33:17.000000000","message":"nit: You can do:\n\n    return bool(l3plugin and l3plugin.router_supports_scheduling(context, router_id))","commit_id":"c3934e3aff8931606293035a1cee919643e7cbea"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"b30af797cad94a795b02887395ba2d3395bd3927","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    if l3plugin and l3plugin.router_supports_scheduling(context, router_id):"},{"line_number":54,"context_line":"        return True"},{"line_number":55,"context_line":"    return False"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_a3a3329c","line":53,"in_reply_to":"3f79a3b5_9f5a1f5b","updated":"2018-12-04 04:26:47.000000000","message":"Done","commit_id":"c3934e3aff8931606293035a1cee919643e7cbea"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5af1d4bfeb6dad6e645f21c9def63882b4d4e8f5","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    if l3plugin and l3plugin.router_supports_scheduling(context, router_id):"},{"line_number":54,"context_line":"        return True"},{"line_number":55,"context_line":"    return False"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_9f11bf62","line":55,"range":{"start_line":52,"start_character":4,"end_line":55,"end_character":16},"updated":"2018-12-03 09:33:17.000000000","message":"You can also do some caching here, something like:\n\n    _IS_NEUTRON_BUILT_IN_ROUTER \u003d None\n    def is_neutron_built_in_router(context, router_id):\n        global _IS_NEUTRON_BUILT_IN_ROUTER\n        if _IS_NEUTRON_BUILT_IN_ROUTER is None:\n            _IS_NEUTRON_BUILT_IN_ROUTER \u003d bool(l3plugin and l3plugin.router_supports_scheduling(context, router_id))\n        return  _IS_NEUTRON_BUILT_IN_ROUTER\n\nThen You will not need to do this check in every API call","commit_id":"c3934e3aff8931606293035a1cee919643e7cbea"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"f1445132d25e7cd032f60c2e94dd12c07e96ba47","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    if l3plugin and l3plugin.router_supports_scheduling(context, router_id):"},{"line_number":54,"context_line":"        return True"},{"line_number":55,"context_line":"    return False"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_ddd16dcd","line":55,"range":{"start_line":52,"start_character":4,"end_line":55,"end_character":16},"in_reply_to":"3f79a3b5_9f11bf62","updated":"2018-12-04 03:30:55.000000000","message":"router can be different, right? If a built-in router set this to True first, then for those X-drivers routers, it will also be True? I think here needs to check it everytime.","commit_id":"c3934e3aff8931606293035a1cee919643e7cbea"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f854de426a6205f1bae6c3329abf2f4fe4c928f3","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    if l3plugin and l3plugin.router_supports_scheduling(context, router_id):"},{"line_number":54,"context_line":"        return True"},{"line_number":55,"context_line":"    return False"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_8be72caf","line":55,"range":{"start_line":52,"start_character":4,"end_line":55,"end_character":16},"in_reply_to":"3f79a3b5_ddd16dcd","updated":"2018-12-04 07:48:25.000000000","message":"right. I don\u0027t know why I missed that router_id is passed as parameter :) Sorry","commit_id":"c3934e3aff8931606293035a1cee919643e7cbea"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"c8e4eeee8ebbb94f103249881d113b284be0be73","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    return bool(l3plugin and"},{"line_number":54,"context_line":"        l3plugin.router_supports_scheduling(context, router_id))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_5b78e9c0","line":54,"range":{"start_line":54,"start_character":17,"end_line":54,"end_character":43},"updated":"2018-12-04 23:17:20.000000000","message":"I am not sure this part. In particular, if a router supports scheduling, then it is a build-in router? In theory, it seems any plugin can override \u0027router_supports_scheduling\u0027 and claim this support so I am a bit struggling to understand it.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0ef81c0f3af1a2f2b0b8bfcf220266238e7b2acb","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    return bool(l3plugin and"},{"line_number":54,"context_line":"        l3plugin.router_supports_scheduling(context, router_id))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_6d6e4400","line":54,"range":{"start_line":54,"start_character":17,"end_line":54,"end_character":43},"in_reply_to":"3f79a3b5_5b78e9c0","updated":"2018-12-05 07:31:50.000000000","message":"This is the doc may have some useful information:\nhttps://specs.openstack.org/openstack/neutron-specs/specs/newton/multi-l3-backends.html\n\nI\u0027ve searched some code and base on that doc, currently, such method is the critical code path. No matter the schedule is enable or not, this check is always be the mainly condition. Here are some example.\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/l3_agentschedulers_db.py#L159\nhttps://github.com/openstack/neutron/blob/master/neutron/db/l3_db.py#L341\n\nFor that override issue, here are some code search, IMO, and again this method seems the main part of the multi-backends L3 service. The custom l3 router will not define the l3 plugin someday, only use the notification to deal with router.\nhttps://github.com/search?q\u003dorg%3Aopenstack+router_supports_scheduling\u0026type\u003dCode\nThis is the main concern from YAMAMOTO Takashi.\nAnd if the custom l3 router is really needed to redefine, then override that `IP_UPDATE_NOT_ALLOWED_LIST` may be the more proper way.\n\nThanks.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"7a1d553ff805c297fe71c8872a871de834cf5b0d","unresolved":false,"context_lines":[{"line_number":51,"context_line":"def is_neutron_built_in_router(context, router_id):"},{"line_number":52,"context_line":"    l3plugin \u003d directory.get_plugin(plugin_consts.L3)"},{"line_number":53,"context_line":"    return bool(l3plugin and"},{"line_number":54,"context_line":"        l3plugin.router_supports_scheduling(context, router_id))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IpamPluggableBackend(ipam_backend_mixin.IpamBackendMixin):"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_9f69748e","line":54,"range":{"start_line":54,"start_character":17,"end_line":54,"end_character":43},"in_reply_to":"3f79a3b5_6d6e4400","updated":"2018-12-05 18:14:03.000000000","message":"ACK. This approach sounds a bit hacky but I have no objection for that :) My -1 is mainly about the extension not listed issue that I commented in another file.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"}],"neutron/extensions/_l3_port_ip_change_not_allowed_lib.py":[{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"bb7a0f1b62a571596ac34bb3a1dea8c209767615","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"ALIAS \u003d \u0027l3-port-ip-change-not-allowed\u0027"},{"line_number":22,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":23,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":24,"context_line":"NAME \u003d \u0027Router Ports IP Change Forbidden Shim Extension\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_01a146a8","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":5},"updated":"2018-10-26 15:32:24.000000000","message":"Need to update this file as well: https://github.com/openstack/neutron/blob/master/neutron/tests/contrib/hooks/api_all_extensions","commit_id":"ab807f67ac3a9761b981ff7799536269730fa94e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52cc24cec63fc147b950b3339fba550a54593ee6","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"ALIAS \u003d \u0027l3-port-ip-change-not-allowed\u0027"},{"line_number":22,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":23,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":24,"context_line":"NAME \u003d \u0027Router Ports IP Change Forbidden Shim Extension\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_3fe32708","line":21,"range":{"start_line":21,"start_character":0,"end_line":21,"end_character":5},"in_reply_to":"3f79a3b5_01a146a8","updated":"2018-10-29 03:07:00.000000000","message":"Done","commit_id":"ab807f67ac3a9761b981ff7799536269730fa94e"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"6eca6f5fa6636db385b40e9772c1b05627dfae8d","unresolved":false,"context_lines":[{"line_number":21,"context_line":"ALIAS \u003d \u0027l3-port-ip-change-not-allowed\u0027"},{"line_number":22,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":23,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":24,"context_line":"NAME \u003d \u0027Router Ports IP Change Forbidden Shim Extension\u0027"},{"line_number":25,"context_line":"DESCRIPTION \u003d \u0027Forbidden some L3 related port type change IP address\u0027"},{"line_number":26,"context_line":"UPDATED_TIMESTAMP \u003d \u00272018-10-09T10:00:00-00:00\u0027"},{"line_number":27,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_c01afd7e","line":24,"updated":"2018-11-01 21:40:58.000000000","message":"Please see the changes I suggested in the neutron-lib patch","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fdb4a4879848aad0a6bc46ae32e0e896948042d3","unresolved":false,"context_lines":[{"line_number":21,"context_line":"ALIAS \u003d \u0027l3-port-ip-change-not-allowed\u0027"},{"line_number":22,"context_line":"IS_SHIM_EXTENSION \u003d True"},{"line_number":23,"context_line":"IS_STANDARD_ATTR_EXTENSION \u003d False"},{"line_number":24,"context_line":"NAME \u003d \u0027Router Ports IP Change Forbidden Shim Extension\u0027"},{"line_number":25,"context_line":"DESCRIPTION \u003d \u0027Forbidden some L3 related port type change IP address\u0027"},{"line_number":26,"context_line":"UPDATED_TIMESTAMP \u003d \u00272018-10-09T10:00:00-00:00\u0027"},{"line_number":27,"context_line":"RESOURCE_ATTRIBUTE_MAP \u003d {}"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_993757af","line":24,"in_reply_to":"3f79a3b5_c01afd7e","updated":"2018-11-06 11:27:20.000000000","message":"Done","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"c8e4eeee8ebbb94f103249881d113b284be0be73","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"TODO(liuyulong): This module should be deleted once neutron-lib containing"},{"line_number":15,"context_line":"I3578ef48432792aca25acf7c30413d79a0fd4065 change is released."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_fb7d35e5","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":41},"updated":"2018-12-04 23:17:20.000000000","message":"This is released now (neutron-lib 1.21.0)","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a45e4ce02b234073056446f9a3d6fda7a3853062","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"TODO(liuyulong): This module should be deleted once neutron-lib containing"},{"line_number":15,"context_line":"I3578ef48432792aca25acf7c30413d79a0fd4065 change is released."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_b61a4b16","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":41},"in_reply_to":"3f79a3b5_4d9ee8fa","updated":"2018-12-06 11:07:20.000000000","message":"Done","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0ef81c0f3af1a2f2b0b8bfcf220266238e7b2acb","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"\"\"\""},{"line_number":14,"context_line":"TODO(liuyulong): This module should be deleted once neutron-lib containing"},{"line_number":15,"context_line":"I3578ef48432792aca25acf7c30413d79a0fd4065 change is released."},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron_lib.api.definitions import l3"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_4d9ee8fa","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":41},"in_reply_to":"3f79a3b5_fb7d35e5","updated":"2018-12-05 07:31:50.000000000","message":"Will rebase on it.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"}],"neutron/ipam/exceptions.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9dc58aa013f6fc4e1ecfa5ae719cdbec360095f9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                \"%(reason)s\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllow(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"Port %(port_id)s change IP address not allow.\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_9515094f","line":57,"range":{"start_line":57,"start_character":24,"end_line":57,"end_character":29},"updated":"2018-10-09 14:48:49.000000000","message":"s/Allowed","commit_id":"2a1877196a394568d2761fa89f28448469888a29"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9dc58aa013f6fc4e1ecfa5ae719cdbec360095f9","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllow(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"Port %(port_id)s change IP address not allow.\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class AllocationOnAutoAddressSubnet(exceptions.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_550f7138","line":58,"range":{"start_line":58,"start_character":56,"end_line":58,"end_character":61},"updated":"2018-10-09 14:48:49.000000000","message":"s/allowed","commit_id":"2a1877196a394568d2761fa89f28448469888a29"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"9f436d9a1a6b32b313efdb2228f5ce478b3f4a79","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"Port %(port_id)s change IP address not allow\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class AllocationOnAutoAddressSubnet(exceptions.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_be660b56","line":58,"range":{"start_line":58,"start_character":17,"end_line":58,"end_character":61},"updated":"2018-10-19 01:05:42.000000000","message":"\"IP updates for port %(port_id)s are not allowed\"","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e6e83ca97d9d2fe75ddf3afeeb648012cb115818","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"Port %(port_id)s change IP address not allow\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class AllocationOnAutoAddressSubnet(exceptions.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_99bc89b6","line":58,"range":{"start_line":58,"start_character":17,"end_line":58,"end_character":61},"in_reply_to":"3f79a3b5_be660b56","updated":"2018-10-19 03:22:52.000000000","message":"Done","commit_id":"fbc5c74af941b9a962ebe52983baa07213cdf4ab"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"25f13634cd581bdbefdefcea23a404781ebeb567","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                \"%(reason)s\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"IP updates for port %(port_id)s are not allowed\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_6b523713","line":57,"range":{"start_line":57,"start_character":6,"end_line":57,"end_character":31},"updated":"2018-10-29 19:00:42.000000000","message":"Is this an exception we\u0027d expect consumers to use/throw?\nIf so I\u0027m wondering if it should go into neutron-lib?","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6338bbc1031b28d4dae95340bb81b710e8a9e8c8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                \"%(reason)s\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"IP updates for port %(port_id)s are not allowed\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_2c0772ca","line":57,"range":{"start_line":57,"start_character":6,"end_line":57,"end_character":31},"in_reply_to":"3f79a3b5_6b523713","updated":"2018-10-30 02:41:40.000000000","message":"OK, I will add this exception to https://review.openstack.org/#/c/612969/.\n\nAnd refactor this when someday the neutron-lib released.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":5367,"name":"boden","email":"bodenvmw@gmail.com","username":"boden"},"change_message_id":"25f13634cd581bdbefdefcea23a404781ebeb567","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"IP updates for port %(port_id)s are not allowed\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class AllocationOnAutoAddressSubnet(exceptions.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_2b38bfc8","line":58,"range":{"start_line":58,"start_character":57,"end_line":58,"end_character":64},"updated":"2018-10-29 19:00:42.000000000","message":"Nit: period at the end.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"6338bbc1031b28d4dae95340bb81b710e8a9e8c8","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class IPAddressChangeNotAllowed(exceptions.BadRequest):"},{"line_number":58,"context_line":"    message \u003d _(\"IP updates for port %(port_id)s are not allowed\")"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"class AllocationOnAutoAddressSubnet(exceptions.InvalidInput):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_4c23ce57","line":58,"range":{"start_line":58,"start_character":57,"end_line":58,"end_character":64},"in_reply_to":"3f79a3b5_2b38bfc8","updated":"2018-10-30 02:41:40.000000000","message":"IMO, add period here some api function or process will double it, then user will see something like this \"xxxxx xxxx..\"","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"}],"neutron/services/l3_router/l3_router_plugin.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0f3748fa0ded12f311dfeead96b4de4c5e8e7ce0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    __native_sorting_support \u003d True"},{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_8086175f","line":93,"range":{"start_line":93,"start_character":4,"end_line":93,"end_character":30},"updated":"2018-11-05 09:11:49.000000000","message":"https://github.com/openstack/networking-odl/blob/master/networking_odl/l3/l3_flavor.py\n\nFor this file here, there is no resources.PORT subscription, so that will be OK to add the following port types into the built-in L3 plugin.\nAnd, this project also has it\u0027s own L3 plugin definition.\nhttps://github.com/openstack/networking-odl/blob/master/networking_odl/l3/l3_odl_v2.py#L48","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0f3748fa0ded12f311dfeead96b4de4c5e8e7ce0","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_a0a8f3d9","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":41},"updated":"2018-11-05 09:11:49.000000000","message":"https://github.com/openstack/networking-midonet/blob/master/midonet/neutron/services/l3/l3_midonet.py\n\nSince networking-midonet has it\u0027s own L3 plugin, this type will have no effect on it.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"2e23acffa4f8a32a4b76e215720ee12d5af5421b","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_586a8118","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":41},"in_reply_to":"3f79a3b5_1143376d","updated":"2018-11-30 10:14:47.000000000","message":"this plan. https://specs.openstack.org/openstack/neutron-specs/specs/newton/multi-l3-backends.html\nsee \"vendor X driver\" in the diagram.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"ded4628660940a689c4912e89ea9403cc913fb71","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_6db9b9c3","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":41},"in_reply_to":"3f79a3b5_586a8118","updated":"2018-11-30 16:37:33.000000000","message":"Thanks for pointing out, for built-int L3 service drivers, we check the device_owner, for other X drivers no check.\nhttps://review.openstack.org/#/c/608909/21/neutron/db/ipam_pluggable_backend.py@45","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"96753cc99039e6e6543bfc4e9bf0c8632d3bf045","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_b177e33c","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":41},"in_reply_to":"3f79a3b5_a0a8f3d9","updated":"2018-11-05 09:44:54.000000000","message":"but the plan is to make it an l3 service driver.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"779d35e76b420514689cb7052f3ecc49f8460703","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    __filter_validation_support \u003d True"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    IP_UPDATE_NOT_ALLOWED_LIST \u003d ["},{"line_number":94,"context_line":"        n_const.DEVICE_OWNER_ROUTER_INTF,"},{"line_number":95,"context_line":"        n_const.DEVICE_OWNER_ROUTER_HA_INTF,"},{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_1143376d","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":41},"in_reply_to":"3f79a3b5_b177e33c","updated":"2018-11-05 10:12:59.000000000","message":"Which plan? Did you mean midonet have a plan to implement a L3 without a plugin, or somthing just uses notification? Such l3 service driver seems also out of neutron scope, (sorry for the lack of knowledge), is there any l3 service driver in neutron-server side?\n\nSo, here is my opinion:\nThis list is provided to L2 IPAM during the ``PORT`` update API, so if midonet does not have l3 plugin any more, then for L2 IPAM will not get an empty list [1], aka no L3 port updating will be limited.\n[1] https://review.openstack.org/#/c/608909/15/neutron/db/ipam_pluggable_backend.py@43\n\nDoes this make sense to you? Thanks.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0f3748fa0ded12f311dfeead96b4de4c5e8e7ce0","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        n_const.DEVICE_OWNER_HA_REPLICATED_INT,"},{"line_number":97,"context_line":"        n_const.DEVICE_OWNER_ROUTER_SNAT,"},{"line_number":98,"context_line":"        n_const.DEVICE_OWNER_DVR_INTERFACE]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @resource_registry.tracked_resources(router\u003dl3_models.Router,"},{"line_number":101,"context_line":"                                         floatingip\u003dl3_models.FloatingIP)"},{"line_number":102,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_16324d5e","line":99,"updated":"2018-11-05 09:11:49.000000000","message":"FYI: After some code search, I don\u0027t think I will change the L3 port types here, because there is no subproject get effects by this list.\n\nBut, because everyone has limitation on research scope, so I will wait a while to see people\u0027s opinion. Until then, I will submit the new patch set.","commit_id":"124c73917d60b413fa42a0d6dd94a69f15f09e34"}],"neutron/tests/contrib/hooks/api_all_extensions":[{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"c13a507aae4c3856ca48335b1333d63f19cf7cdf","unresolved":false,"context_lines":[{"line_number":25,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-flavors\""},{"line_number":26,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-ha\""},{"line_number":27,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3_agent_scheduler\""},{"line_number":28,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-port-ip-change-not-allowed\""},{"line_number":29,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",logging\""},{"line_number":30,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",metering\""},{"line_number":31,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",multi-provider\""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"3f79a3b5_db0b992a","line":28,"range":{"start_line":28,"start_character":26,"end_line":28,"end_character":55},"updated":"2018-12-04 23:23:39.000000000","message":"I couldn\u0027t list this extension when running \"openstack extension list --network\". Should we add this extension to a plugin?","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a45e4ce02b234073056446f9a3d6fda7a3853062","unresolved":false,"context_lines":[{"line_number":25,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-flavors\""},{"line_number":26,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-ha\""},{"line_number":27,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3_agent_scheduler\""},{"line_number":28,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-port-ip-change-not-allowed\""},{"line_number":29,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",logging\""},{"line_number":30,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",metering\""},{"line_number":31,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",multi-provider\""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"3f79a3b5_960dcfdc","line":28,"range":{"start_line":28,"start_character":26,"end_line":28,"end_character":55},"in_reply_to":"3f79a3b5_888aae63","updated":"2018-12-06 11:07:20.000000000","message":"Done","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0ef81c0f3af1a2f2b0b8bfcf220266238e7b2acb","unresolved":false,"context_lines":[{"line_number":25,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-flavors\""},{"line_number":26,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-ha\""},{"line_number":27,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3_agent_scheduler\""},{"line_number":28,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",l3-port-ip-change-not-allowed\""},{"line_number":29,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",logging\""},{"line_number":30,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",metering\""},{"line_number":31,"context_line":"NETWORK_API_EXTENSIONS+\u003d\",multi-provider\""}],"source_content_type":"application/octet-stream","patch_set":23,"id":"3f79a3b5_888aae63","line":28,"range":{"start_line":28,"start_character":26,"end_line":28,"end_character":55},"in_reply_to":"3f79a3b5_db0b992a","updated":"2018-12-05 07:31:50.000000000","message":"Nice catch, my bad.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"}],"neutron/tests/unit/db/test_l3_dvr_db.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"da119d0196ce627cd95e4f94a7915bdcaab57631","unresolved":false,"context_lines":[{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def _test_update_router_interface_port_ip_not_allowed(self, device_owner):"},{"line_number":666,"context_line":"        router, subnet_v4, subnet_v6 \u003d self._setup_router_with_v4_and_v6()"},{"line_number":667,"context_line":"        csnat_filters \u003d {\u0027device_owner\u0027:"},{"line_number":668,"context_line":"                         [device_owner]}"},{"line_number":669,"context_line":"        csnat_ports \u003d self.core_plugin.get_ports("},{"line_number":670,"context_line":"            self.ctx, filters\u003dcsnat_filters)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_4476b3d7","line":667,"range":{"start_line":667,"start_character":8,"end_line":667,"end_character":21},"updated":"2018-10-11 10:07:47.000000000","message":"Rename port_filter would be better.","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"92b72c479db88947e4fa9e4fb82826f32481f7de","unresolved":false,"context_lines":[{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def _test_update_router_interface_port_ip_not_allowed(self, device_owner):"},{"line_number":666,"context_line":"        router, subnet_v4, subnet_v6 \u003d self._setup_router_with_v4_and_v6()"},{"line_number":667,"context_line":"        csnat_filters \u003d {\u0027device_owner\u0027:"},{"line_number":668,"context_line":"                         [device_owner]}"},{"line_number":669,"context_line":"        csnat_ports \u003d self.core_plugin.get_ports("},{"line_number":670,"context_line":"            self.ctx, filters\u003dcsnat_filters)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_f25668cd","line":667,"range":{"start_line":667,"start_character":8,"end_line":667,"end_character":21},"in_reply_to":"3f79a3b5_4476b3d7","updated":"2018-10-14 08:39:50.000000000","message":"Done","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"da119d0196ce627cd95e4f94a7915bdcaab57631","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        router, subnet_v4, subnet_v6 \u003d self._setup_router_with_v4_and_v6()"},{"line_number":667,"context_line":"        csnat_filters \u003d {\u0027device_owner\u0027:"},{"line_number":668,"context_line":"                         [device_owner]}"},{"line_number":669,"context_line":"        csnat_ports \u003d self.core_plugin.get_ports("},{"line_number":670,"context_line":"            self.ctx, filters\u003dcsnat_filters)"},{"line_number":671,"context_line":"        self.assertRaises("},{"line_number":672,"context_line":"            exceptions.BadRequest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_841e0b72","line":669,"range":{"start_line":669,"start_character":8,"end_line":669,"end_character":19},"updated":"2018-10-11 10:07:47.000000000","message":"Rename ports would be better.","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"92b72c479db88947e4fa9e4fb82826f32481f7de","unresolved":false,"context_lines":[{"line_number":666,"context_line":"        router, subnet_v4, subnet_v6 \u003d self._setup_router_with_v4_and_v6()"},{"line_number":667,"context_line":"        csnat_filters \u003d {\u0027device_owner\u0027:"},{"line_number":668,"context_line":"                         [device_owner]}"},{"line_number":669,"context_line":"        csnat_ports \u003d self.core_plugin.get_ports("},{"line_number":670,"context_line":"            self.ctx, filters\u003dcsnat_filters)"},{"line_number":671,"context_line":"        self.assertRaises("},{"line_number":672,"context_line":"            exceptions.BadRequest,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_9271347a","line":669,"range":{"start_line":669,"start_character":8,"end_line":669,"end_character":19},"in_reply_to":"3f79a3b5_841e0b72","updated":"2018-10-14 08:39:50.000000000","message":"Done","commit_id":"439c16966ac6544eeda840614ae5c7261af6ce6e"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"6e7d13a356e0e63e73f2fae7489c67a071d7a48c","unresolved":false,"context_lines":[{"line_number":796,"context_line":"            self.ctx, filters\u003ddvr_filters)"},{"line_number":797,"context_line":"        self.assertEqual(1, len(dvr_ports))"},{"line_number":798,"context_line":""},{"line_number":799,"context_line":"    def test_remove_router_interface_csnat_port_missing_ip(self):"},{"line_number":800,"context_line":"        # NOTE(kevinbenton): this is a contrived scenario to reproduce"},{"line_number":801,"context_line":"        # a condition observed in bug/1609540. Once we figure out why"},{"line_number":802,"context_line":"        # these ports lose their IP we can remove this test."}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_289c5ebd","side":"PARENT","line":799,"range":{"start_line":799,"start_character":8,"end_line":799,"end_character":64},"updated":"2018-10-15 18:33:40.000000000","message":"See my comment on the commit message.","commit_id":"c232f3686c76827da27ace4799d848d786fdb59f"}],"neutron/tests/unit/db/test_l3_hamode_db.py":[{"author":{"_account_id":12860,"name":"Dongcan Ye","email":"yedongcan@yeah.net","username":"yedongcan"},"change_message_id":"839dfe2d4a7b990fa404dea9d5d50c590800ef8e","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"        self.assertEqual(2, len(bindings))"},{"line_number":1111,"context_line":""},{"line_number":1112,"context_line":"    def test_update_ha_router_replicated_interface_port_ip_not_allowed(self):"},{"line_number":1113,"context_line":"        router \u003d self._create_router(ha\u003dTrue)"},{"line_number":1114,"context_line":"        network_id \u003d self._create_network(self.core_plugin, self.admin_ctx)"},{"line_number":1115,"context_line":"        subnet \u003d self._create_subnet(self.core_plugin, self.admin_ctx,"},{"line_number":1116,"context_line":"                                     network_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_b0cad39d","line":1113,"range":{"start_line":1113,"start_character":37,"end_line":1113,"end_character":44},"updated":"2018-10-18 00:49:17.000000000","message":"nit: not necessary","commit_id":"8a92b5eb39de53ee5efe395bd9608f6d9608742d"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a6e8d7fdb9f7cd7021a87999bfe171589207c31","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"        self.assertEqual(2, len(bindings))"},{"line_number":1111,"context_line":""},{"line_number":1112,"context_line":"    def test_update_ha_router_replicated_interface_port_ip_not_allowed(self):"},{"line_number":1113,"context_line":"        router \u003d self._create_router(ha\u003dTrue)"},{"line_number":1114,"context_line":"        network_id \u003d self._create_network(self.core_plugin, self.admin_ctx)"},{"line_number":1115,"context_line":"        subnet \u003d self._create_subnet(self.core_plugin, self.admin_ctx,"},{"line_number":1116,"context_line":"                                     network_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_9b6a5380","line":1113,"range":{"start_line":1113,"start_character":37,"end_line":1113,"end_character":44},"in_reply_to":"3f79a3b5_b0cad39d","updated":"2018-10-18 10:47:38.000000000","message":"Done","commit_id":"8a92b5eb39de53ee5efe395bd9608f6d9608742d"}],"neutron/tests/unit/extensions/test_l3.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f6df5a122d6605483376d27eebadb1229810f11e","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    supported_extension_aliases \u003d [\"external-net\", \"router\", \"dns-integration\"]"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def router_supports_scheduling(self, context, router_id):"},{"line_number":309,"context_line":"        return True"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"# This plugin class is for tests with plugin that integrates L3 and L3 agent"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_565be5f6","line":309,"updated":"2018-12-04 18:24:38.000000000","message":"If this was in the Base plugin class above, would you need to define it in all the sub-classes below?  Just wondering if it was left-over from an earlier change and can be cleaned-up.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"0ef81c0f3af1a2f2b0b8bfcf220266238e7b2acb","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    supported_extension_aliases \u003d [\"external-net\", \"router\", \"dns-integration\"]"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def router_supports_scheduling(self, context, router_id):"},{"line_number":309,"context_line":"        return True"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"# This plugin class is for tests with plugin that integrates L3 and L3 agent"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_cdb2f895","line":309,"in_reply_to":"3f79a3b5_565be5f6","updated":"2018-12-05 07:31:50.000000000","message":"Yes I noticed that, that TestL3NatBasePlugin is a common base class. But TestL3NatBasePlugin is more like a L2 plugin. I do not want to make confusion to it with a L3 method. The following classes with this new method are the real testing L3 plugin.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"a45e4ce02b234073056446f9a3d6fda7a3853062","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    supported_extension_aliases \u003d [\"external-net\", \"router\", \"dns-integration\"]"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def router_supports_scheduling(self, context, router_id):"},{"line_number":309,"context_line":"        return True"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"# This plugin class is for tests with plugin that integrates L3 and L3 agent"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_16221f54","line":309,"in_reply_to":"3f79a3b5_cdb2f895","updated":"2018-12-06 11:07:20.000000000","message":"Move to that base class I defined there.","commit_id":"a5cb59c2b770b41ca1456cda08896ec156c42399"}]}
