)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"423390df5aed47c227b27831e78032f99dc3245b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"     enable_metadata_network"},{"line_number":18,"context_line":"TODO do we want an option to disable ipv4 metadata?"},{"line_number":19,"context_line":"     IMO maybe later, not here"},{"line_number":20,"context_line":"TODO tests"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Change-Id: If35f00d1fc9e4ab7e232660362410ce7320c45ba"},{"line_number":23,"context_line":"Partial-Bug: #1460177"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1f493fa4_1d3da28e","line":20,"range":{"start_line":20,"start_character":0,"end_line":20,"end_character":10},"updated":"2020-04-28 16:29:15.000000000","message":"I checked lightly and for me functional tests seems an option to add tests. neutron/tests/functional/agent/test_dhcp_agent.py for this patch is a good candidate, though not sure if you can cover there anything from this change.","commit_id":"8d9363f39c490e8c1a8ec8dddfc0750af4704c44"}],"neutron/agent/dhcp/agent.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"29efe3521b05ae56141a5d37ce7c1f7d0cdf2177","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                        router_ports[0].device_id)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":717,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":718,"context_line":"        else:"},{"line_number":719,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df33271e_ff43b211","line":717,"range":{"start_line":717,"start_character":28,"end_line":717,"end_character":30},"updated":"2020-03-30 12:02:38.000000000","message":"Isn\u0027t it too broad for bind?\nAnyway there is a fancy constant here for this:\nhttps://opendev.org/openstack/neutron-lib/src/branch/master/neutron_lib/constants.py#L97 :-)","commit_id":"fe439e5f01720f8400cdb46eb4af34a32857550a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"07d3e046481a05b1e4881c949244ef1dac64a589","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                        router_ports[0].device_id)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":717,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":718,"context_line":"        else:"},{"line_number":719,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f4c43b2_239377fc","line":717,"range":{"start_line":717,"start_character":28,"end_line":717,"end_character":30},"in_reply_to":"df33271e_47bc226c","updated":"2020-04-16 15:44:45.000000000","message":"The fancy constant is not the same, that\u0027s \u0027::/0\u0027 which haproxy can\u0027t take as and address to bind.","commit_id":"fe439e5f01720f8400cdb46eb4af34a32857550a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"cc9eccd57e27edca72c6538d4b4cc0fd378efcb4","unresolved":false,"context_lines":[{"line_number":714,"context_line":"                        router_ports[0].device_id)"},{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":717,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":718,"context_line":"        else:"},{"line_number":719,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":720,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df33271e_47bc226c","line":717,"range":{"start_line":717,"start_character":28,"end_line":717,"end_character":30},"in_reply_to":"df33271e_ff43b211","updated":"2020-04-03 14:15:07.000000000","message":"TBH I don\u0027t know yet.\n\nThere are a few things in flight here. For now I hope to keep the number of haproxy processes running at 1 per namespace. But we\u0027ll need to fine tune the header mangling too which may or may not force us to switch to 2 per namespace. In the latter case we could narrow the bind.","commit_id":"fe439e5f01720f8400cdb46eb4af34a32857550a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"423390df5aed47c227b27831e78032f99dc3245b","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1f493fa4_a26a8f16","line":720,"range":{"start_line":720,"start_character":27,"end_line":720,"end_character":31},"updated":"2020-04-28 16:29:15.000000000","message":"Would be good to see the opinion of somebody with security view","commit_id":"8d9363f39c490e8c1a8ec8dddfc0750af4704c44"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"372fd2d4b70ae8f378cd498594f8b839b59346b3","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bf51134e_033751b2","line":720,"range":{"start_line":720,"start_character":27,"end_line":720,"end_character":31},"in_reply_to":"1f493fa4_a26a8f16","updated":"2020-07-09 11:04:24.000000000","message":"Now we got rid of this.","commit_id":"8d9363f39c490e8c1a8ec8dddfc0750af4704c44"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b6955ab408d10841d05f66afa17073d925cc450","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_b5749369","line":720,"updated":"2020-06-23 21:28:22.000000000","message":"This will introduce a regression since we\u0027ve been removing the \"any\" address and replacing with a specific one - https://bugs.launchpad.net/neutron/+bug/1745618\n\nIt\u0027s almost like it needs to bind each address separately if IPv6 is enabled.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"372fd2d4b70ae8f378cd498594f8b839b59346b3","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_c30279b4","line":720,"in_reply_to":"bf51134e_57f5ad82","updated":"2020-07-09 11:04:24.000000000","message":"With some help I finally understood the root cause of this problem. IPv6 Duplicate Address Detection made the address unusable (still in tentative state) in the first few seconds after we configured it. That\u0027s why haproxy couldn\u0027t bind(). Now I added code to explicitly wait until DAD completes, so we shouldn\u0027t see this problem again.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"2344ad31f989a75770bcd2c3ade285d575c1e711","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_57f5ad82","line":720,"in_reply_to":"bf51134e_b5749369","updated":"2020-07-03 13:37:34.000000000","message":"Sorry for the slow progress here. After I made the change locally to make haproxy listen explicitly on 169.254.169.254:80 and [fe80::a9fe:a9fe]:80 I started to notice thay haproxy could not start with the error message \"Starting proxy listener: cannot bind socket [fe80::a9fe:a9fe:80]\". It took me quite a lot of time to debug this and now I believe we have a bug either in pyroute2 (or something under pyroute2) or in the way we use pyroute2 (from neutron). For details please see here:\n\nhttps://github.com/svinota/pyroute2/issues/721\n\nUntil that gets solved I think I\u0027ll add some workaround (sleep or waiting until the address appears) to this change series soon, so we can progress here.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d0344d6547d96f3ea13cb58edcdad546b6078883","unresolved":false,"context_lines":[{"line_number":717,"context_line":"                        router_ports[0].device_id)"},{"line_number":718,"context_line":""},{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_02151949","line":720,"in_reply_to":"bf51134e_c30279b4","updated":"2020-07-15 07:53:06.000000000","message":"One more note here: In the router namespace haproxy alywas did and does listen on the wildcard address. At least it definitely cannot listen on the metadata addresses (v4 or v6) since those are not configured in the router namespace. Theoretically it could listen on a concrete IP instead where we DNAT the metadata traffic to.\n\nBut to be honest I never fully understood bug #1745618, because in my understanding we expose the exact same (potentially sensitve) data on all the IPs we bind to. Therefore I don\u0027t see how it is unsafe to read some data over a semi-random IP when the same data is safe to read over the metadata IP (where the reader is identified the same way in both cases).\n\nI understand that giving wider-than-necessary access to potentially sensitive data is not good practice, but I don\u0027t see how this is a security bug in itself.\n\nI wanted to mention this, but please note that this change series didn\u0027t change this behavior in the router namespace. If we think haproxy listening on a wildcard address in the router namespace is a bug, maybe we better handle that as a standalone bug and change.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b6955ab408d10841d05f66afa17073d925cc450","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        metadata_driver.MetadataDriver.spawn_monitored_metadata_proxy("},{"line_number":725,"context_line":"            self._process_monitor, network.namespace, dhcp.METADATA_PORT,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_5511b703","line":722,"updated":"2020-06-23 21:28:22.000000000","message":"Should move this to neutron-lib constants, or _constants for now.\n\nThe OVN code defines the same thing too and doesn\u0027t need to.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"2f877775061c52e47aca041ab85cb2c80ac9a41c","unresolved":false,"context_lines":[{"line_number":719,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":720,"context_line":"            bind_address \u003d \u0027::\u0027"},{"line_number":721,"context_line":"        else:"},{"line_number":722,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"        metadata_driver.MetadataDriver.spawn_monitored_metadata_proxy("},{"line_number":725,"context_line":"            self._process_monitor, network.namespace, dhcp.METADATA_PORT,"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_3216a44a","line":722,"in_reply_to":"bf51134e_5511b703","updated":"2020-06-26 13:37:06.000000000","message":"Please see https://review.opendev.org/738205.","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                                          self.plugin_rpc)"},{"line_number":179,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":180,"context_line":"                return getattr(driver, action)("},{"line_number":181,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":182,"context_line":"            else:"},{"line_number":183,"context_line":"                getattr(driver, action)(**action_kwargs)"},{"line_number":184,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_61a257fe","line":181,"updated":"2020-07-09 18:28:58.000000000","message":"Is this for backwards-compat?  Maybe we need to add this method to DhcpBase class as abstract method?","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                                          self.plugin_rpc)"},{"line_number":179,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":180,"context_line":"                return getattr(driver, action)("},{"line_number":181,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":182,"context_line":"            else:"},{"line_number":183,"context_line":"                getattr(driver, action)(**action_kwargs)"},{"line_number":184,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_ad47391d","line":181,"in_reply_to":"bf51134e_61a257fe","updated":"2020-07-14 13:03:33.000000000","message":"No, not for backwards-compat.\n\nWe must add the interface name to the haproxy config since a link-local address must be bound with a scope. But the interface name was private to the dhcp driver. And normally we throw away the return value of the driver call in line 183. So I had to make the interface name public (at least available to the metadata proxy configurator). This is violating the plugin structure here somewhat. Let me know if you see a less hacky solution.\n\nI have never seen an actual dhcp driver that inherited from DhcpBase but not from DhcpLocalProcess. However sharing an interface between the dhcp server and the metadata proxy I believe only makes sense if they are both running as local processes. Thefore I think we don\u0027t need \u0027get_metadata_bind_interface\u0027 higher in the inheritance hierarchy than DhcpLocalProcess.\n\nOn the other hand in this patch set I missed handling the case when a driver does not implement get_metadata_bind_interface(). Added an error log for that.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                    \u0027get_metadata_bind_interface\u0027, network, port\u003dp)"},{"line_number":727,"context_line":"                for p in network.ports"},{"line_number":728,"context_line":"                if p.device_owner \u003d\u003d \u0027network:dhcp\u0027 and p.admin_state_up"},{"line_number":729,"context_line":"            ]"},{"line_number":730,"context_line":"            if len(dhcp_ifaces) \u003d\u003d 1:"},{"line_number":731,"context_line":"                kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"},{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_6f2523c2","line":729,"updated":"2020-07-09 18:28:58.000000000","message":"This isn\u0027t filtering by IPv6, don\u0027t know if that was intended.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":726,"context_line":"                    \u0027get_metadata_bind_interface\u0027, network, port\u003dp)"},{"line_number":727,"context_line":"                for p in network.ports"},{"line_number":728,"context_line":"                if p.device_owner \u003d\u003d \u0027network:dhcp\u0027 and p.admin_state_up"},{"line_number":729,"context_line":"            ]"},{"line_number":730,"context_line":"            if len(dhcp_ifaces) \u003d\u003d 1:"},{"line_number":731,"context_line":"                kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"},{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_d8cb4950","line":729,"in_reply_to":"bf51134e_6f2523c2","updated":"2020-07-14 13:03:33.000000000","message":"To my understanding the dhcp agent needs only one dhcp port per network independently of the number of subnets on that network (to access the network). We only need the interface name if we have to bind on ipv6, but the port itself is not ip version specific.\n\nBut if my understanding is wrong or limited and you know any use case that triggers the warning below (especially len(dhcp_ifaces) \u003e 1) then please let me know becaues then we need some logic to pick one of those interfaces.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \u0027unexpected number of DHCP interfaces for metadata\u0027"},{"line_number":736,"context_line":"                    \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":737,"context_line":"                )"},{"line_number":738,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_6f608302","line":735,"range":{"start_line":735,"start_character":69,"end_line":735,"end_character":70},"updated":"2020-07-09 18:28:58.000000000","message":"missing trailing space","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \u0027unexpected number of DHCP interfaces for metadata\u0027"},{"line_number":736,"context_line":"                    \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":737,"context_line":"                )"},{"line_number":738,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_2f432b6e","line":735,"range":{"start_line":735,"start_character":21,"end_line":735,"end_character":22},"updated":"2020-07-09 18:28:58.000000000","message":"s/U","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \u0027unexpected number of DHCP interfaces for metadata\u0027"},{"line_number":736,"context_line":"                    \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":737,"context_line":"                )"},{"line_number":738,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_d83b49ce","line":735,"range":{"start_line":735,"start_character":21,"end_line":735,"end_character":22},"in_reply_to":"bf51134e_2f432b6e","updated":"2020-07-14 13:03:33.000000000","message":"Done","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":732,"context_line":"                kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":733,"context_line":"            else:"},{"line_number":734,"context_line":"                LOG.warning("},{"line_number":735,"context_line":"                    \u0027unexpected number of DHCP interfaces for metadata\u0027"},{"line_number":736,"context_line":"                    \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":737,"context_line":"                )"},{"line_number":738,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_b83815d3","line":735,"range":{"start_line":735,"start_character":69,"end_line":735,"end_character":70},"in_reply_to":"bf51134e_6f608302","updated":"2020-07-14 13:03:33.000000000","message":"Done","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7d92355fb524f27bc290945f1f2799db947aab3b","unresolved":false,"context_lines":[{"line_number":743,"context_line":"                    self.call_driver("},{"line_number":744,"context_line":"                        \u0027get_metadata_bind_interface\u0027, network, port\u003dp)"},{"line_number":745,"context_line":"                    for p in network.ports"},{"line_number":746,"context_line":"                    if p.device_owner \u003d\u003d \u0027network:dhcp\u0027 and p.admin_state_up"},{"line_number":747,"context_line":"                ]"},{"line_number":748,"context_line":"                if len(dhcp_ifaces) \u003d\u003d 1:"},{"line_number":749,"context_line":"                    kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf51134e_aa2502c4","line":746,"range":{"start_line":746,"start_character":41,"end_line":746,"end_character":55},"updated":"2020-07-16 21:36:06.000000000","message":"constants.DEVICE_OWNER_DHCP","commit_id":"1adecedcb13e054e35677ec7cee85f1468017254"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"8bcedf5eb0c4229caf50ed62c746b4e29a243e16","unresolved":false,"context_lines":[{"line_number":743,"context_line":"                    self.call_driver("},{"line_number":744,"context_line":"                        \u0027get_metadata_bind_interface\u0027, network, port\u003dp)"},{"line_number":745,"context_line":"                    for p in network.ports"},{"line_number":746,"context_line":"                    if p.device_owner \u003d\u003d \u0027network:dhcp\u0027 and p.admin_state_up"},{"line_number":747,"context_line":"                ]"},{"line_number":748,"context_line":"                if len(dhcp_ifaces) \u003d\u003d 1:"},{"line_number":749,"context_line":"                    kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf51134e_a71ed471","line":746,"range":{"start_line":746,"start_character":41,"end_line":746,"end_character":55},"in_reply_to":"bf51134e_aa2502c4","updated":"2020-07-17 13:33:16.000000000","message":"Done","commit_id":"1adecedcb13e054e35677ec7cee85f1468017254"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6f33266b6bba76704c433cf88769496821747e26","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        # second because (unless we temporarily disable the monitor too)"},{"line_number":131,"context_line":"        # we could race with the monitor restarting the process. See also"},{"line_number":132,"context_line":"        # method update_isolated_metadata_proxy()."},{"line_number":133,"context_line":"        self.restarted_metadata_proxy \u003d {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def init_host(self):"},{"line_number":136,"context_line":"        self.sync_state()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_823a42c1","line":133,"range":{"start_line":133,"start_character":40,"end_line":133,"end_character":42},"updated":"2020-07-23 07:05:11.000000000","message":"seems this could be just set()","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"321ce4080bfaa191fd9fb104ad21ddf5050578e0","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        # second because (unless we temporarily disable the monitor too)"},{"line_number":131,"context_line":"        # we could race with the monitor restarting the process. See also"},{"line_number":132,"context_line":"        # method update_isolated_metadata_proxy()."},{"line_number":133,"context_line":"        self.restarted_metadata_proxy \u003d {}"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def init_host(self):"},{"line_number":136,"context_line":"        self.sync_state()"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_190b4024","line":133,"range":{"start_line":133,"start_character":40,"end_line":133,"end_character":42},"in_reply_to":"bf51134e_823a42c1","updated":"2020-07-29 14:31:34.000000000","message":"Done","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6f33266b6bba76704c433cf88769496821747e26","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                          self.dhcp_version,"},{"line_number":191,"context_line":"                                          self.plugin_rpc)"},{"line_number":192,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":193,"context_line":"                return getattr(driver, action)("},{"line_number":194,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":195,"context_line":"            else:"},{"line_number":196,"context_line":"                getattr(driver, action)(**action_kwargs)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_5f400308","line":193,"range":{"start_line":193,"start_character":23,"end_line":193,"end_character":46},"updated":"2020-07-23 07:05:11.000000000","message":"why not driver.get_metadata_bind_interface()?","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"321ce4080bfaa191fd9fb104ad21ddf5050578e0","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                                          self.dhcp_version,"},{"line_number":191,"context_line":"                                          self.plugin_rpc)"},{"line_number":192,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":193,"context_line":"                return getattr(driver, action)("},{"line_number":194,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":195,"context_line":"            else:"},{"line_number":196,"context_line":"                getattr(driver, action)(**action_kwargs)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_d977089f","line":193,"range":{"start_line":193,"start_character":23,"end_line":193,"end_character":46},"in_reply_to":"bf51134e_5f400308","updated":"2020-07-29 14:31:34.000000000","message":"After not passing \u0027network\u0027 simplified differently.","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6f33266b6bba76704c433cf88769496821747e26","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                          self.plugin_rpc)"},{"line_number":192,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":193,"context_line":"                return getattr(driver, action)("},{"line_number":194,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":195,"context_line":"            else:"},{"line_number":196,"context_line":"                getattr(driver, action)(**action_kwargs)"},{"line_number":197,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_024f526a","line":194,"range":{"start_line":194,"start_character":20,"end_line":194,"end_character":35},"updated":"2020-07-23 07:05:11.000000000","message":"network is provided to driver class on init (#188) - do we really need to provide it again in this method?","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"321ce4080bfaa191fd9fb104ad21ddf5050578e0","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                                          self.plugin_rpc)"},{"line_number":192,"context_line":"            if action \u003d\u003d \u0027get_metadata_bind_interface\u0027:"},{"line_number":193,"context_line":"                return getattr(driver, action)("},{"line_number":194,"context_line":"                    network\u003dnetwork, **action_kwargs)"},{"line_number":195,"context_line":"            else:"},{"line_number":196,"context_line":"                getattr(driver, action)(**action_kwargs)"},{"line_number":197,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_f982cc51","line":194,"range":{"start_line":194,"start_character":20,"end_line":194,"end_character":35},"in_reply_to":"bf51134e_024f526a","updated":"2020-07-29 14:31:34.000000000","message":"Done","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6f33266b6bba76704c433cf88769496821747e26","unresolved":false,"context_lines":[{"line_number":704,"context_line":"        if should_enable_metadata:"},{"line_number":705,"context_line":"            if not self.restarted_metadata_proxy.get(network.id):"},{"line_number":706,"context_line":"                self.disable_isolated_metadata_proxy(network)"},{"line_number":707,"context_line":"                self.restarted_metadata_proxy[network.id] \u003d True"},{"line_number":708,"context_line":"            self.enable_isolated_metadata_proxy(network)"},{"line_number":709,"context_line":"        else:"},{"line_number":710,"context_line":"            self.disable_isolated_metadata_proxy(network)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_c2443a4a","line":707,"range":{"start_line":707,"start_character":16,"end_line":707,"end_character":64},"updated":"2020-07-23 07:05:11.000000000","message":"Can this ever be False?","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"321ce4080bfaa191fd9fb104ad21ddf5050578e0","unresolved":false,"context_lines":[{"line_number":704,"context_line":"        if should_enable_metadata:"},{"line_number":705,"context_line":"            if not self.restarted_metadata_proxy.get(network.id):"},{"line_number":706,"context_line":"                self.disable_isolated_metadata_proxy(network)"},{"line_number":707,"context_line":"                self.restarted_metadata_proxy[network.id] \u003d True"},{"line_number":708,"context_line":"            self.enable_isolated_metadata_proxy(network)"},{"line_number":709,"context_line":"        else:"},{"line_number":710,"context_line":"            self.disable_isolated_metadata_proxy(network)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bf51134e_b9497461","line":707,"range":{"start_line":707,"start_character":16,"end_line":707,"end_character":64},"in_reply_to":"bf51134e_c2443a4a","updated":"2020-07-29 14:31:34.000000000","message":"Done","commit_id":"cb95d68d75e4233822041f7af6d8259e736edf0b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0bedf72bd9bbefbbc82665b725cd2903089880d","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        # second because (unless we temporarily disable the monitor too)"},{"line_number":131,"context_line":"        # we could race with the monitor restarting the process. See also"},{"line_number":132,"context_line":"        # method update_isolated_metadata_proxy()."},{"line_number":133,"context_line":"        self.restarted_metadata_proxy_set \u003d set()"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def init_host(self):"},{"line_number":136,"context_line":"        self.sync_state()"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_ecca656c","line":133,"updated":"2020-08-12 12:47:59.000000000","message":"so we should be able to get rid of that in e.g. Wallaby or next cycle, right?","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"937d879ce6851481ad2117342727f41077252657","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        # second because (unless we temporarily disable the monitor too)"},{"line_number":131,"context_line":"        # we could race with the monitor restarting the process. See also"},{"line_number":132,"context_line":"        # method update_isolated_metadata_proxy()."},{"line_number":133,"context_line":"        self.restarted_metadata_proxy_set \u003d set()"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def init_host(self):"},{"line_number":136,"context_line":"        self.sync_state()"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_65a3dab2","line":133,"in_reply_to":"9f560f44_ecca656c","updated":"2020-08-17 09:25:18.000000000","message":"At the price of breaking fast-forward upgrades, yes.","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0bedf72bd9bbefbbc82665b725cd2903089880d","unresolved":false,"context_lines":[{"line_number":749,"context_line":"                    kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"},{"line_number":750,"context_line":"                    kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":751,"context_line":"                else:"},{"line_number":752,"context_line":"                    LOG.warning("},{"line_number":753,"context_line":"                        \u0027Unexpected number of DHCP interfaces for metadata \u0027"},{"line_number":754,"context_line":"                        \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":755,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_4cc8b173","line":752,"updated":"2020-08-12 12:47:59.000000000","message":"this sounds more like Error for me :)","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"937d879ce6851481ad2117342727f41077252657","unresolved":false,"context_lines":[{"line_number":749,"context_line":"                    kwargs[\u0027bind_interface\u0027] \u003d dhcp_ifaces[0]"},{"line_number":750,"context_line":"                    kwargs[\u0027bind_address_v6\u0027] \u003d dhcp.METADATA_V6_IP"},{"line_number":751,"context_line":"                else:"},{"line_number":752,"context_line":"                    LOG.warning("},{"line_number":753,"context_line":"                        \u0027Unexpected number of DHCP interfaces for metadata \u0027"},{"line_number":754,"context_line":"                        \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":755,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_a5869212","line":752,"in_reply_to":"9f560f44_4cc8b173","updated":"2020-08-17 09:25:18.000000000","message":"Done","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0bedf72bd9bbefbbc82665b725cd2903089880d","unresolved":false,"context_lines":[{"line_number":754,"context_line":"                        \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":755,"context_line":"                    )"},{"line_number":756,"context_line":"            except AttributeError:"},{"line_number":757,"context_line":"                LOG.error("},{"line_number":758,"context_line":"                    \u0027Cannot serve metadata on IPv6 because DHCP driver \u0027"},{"line_number":759,"context_line":"                    \u0027does not implement method \u0027"},{"line_number":760,"context_line":"                    \u0027get_metadata_bind_interface(): %s\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_2cc57d5c","line":757,"updated":"2020-08-12 12:47:59.000000000","message":"IMO that can be warning or info, ERROR can be a bit too high maybe","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"937d879ce6851481ad2117342727f41077252657","unresolved":false,"context_lines":[{"line_number":754,"context_line":"                        \u0027proxy, expected 1, got %s\u0027, len(dhcp_ifaces)"},{"line_number":755,"context_line":"                    )"},{"line_number":756,"context_line":"            except AttributeError:"},{"line_number":757,"context_line":"                LOG.error("},{"line_number":758,"context_line":"                    \u0027Cannot serve metadata on IPv6 because DHCP driver \u0027"},{"line_number":759,"context_line":"                    \u0027does not implement method \u0027"},{"line_number":760,"context_line":"                    \u0027get_metadata_bind_interface(): %s\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_e577ea3a","line":757,"in_reply_to":"9f560f44_2cc57d5c","updated":"2020-08-17 09:25:18.000000000","message":"Done","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"}],"neutron/agent/linux/dhcp.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fc9406ee2fdfeab7c5c7a22f6c1e137b8b9806ea","unresolved":false,"context_lines":[{"line_number":1310,"context_line":"    def has_metadata_subnet(subnets):"},{"line_number":1311,"context_line":"        \"\"\"Check if the subnets has a metadata subnet.\"\"\""},{"line_number":1312,"context_line":"        meta_cidr \u003d netaddr.IPNetwork(METADATA_DEFAULT_CIDR)"},{"line_number":1313,"context_line":"        if any(netaddr.IPNetwork(s.cidr) in meta_cidr"},{"line_number":1314,"context_line":"               for s in subnets):"},{"line_number":1315,"context_line":"            return True"},{"line_number":1316,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_7d05e145","side":"PARENT","line":1313,"range":{"start_line":1313,"start_character":44,"end_line":1313,"end_character":53},"updated":"2020-06-22 15:40:06.000000000","message":"This could be (meta_cidr_v4, meta_cidr_v6), to simplify the check (as in base PS).","commit_id":"b1dba996b52f14a1405800cf2e90485beaeb50d3"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"372fd2d4b70ae8f378cd498594f8b839b59346b3","unresolved":false,"context_lines":[{"line_number":1310,"context_line":"    def has_metadata_subnet(subnets):"},{"line_number":1311,"context_line":"        \"\"\"Check if the subnets has a metadata subnet.\"\"\""},{"line_number":1312,"context_line":"        meta_cidr \u003d netaddr.IPNetwork(METADATA_DEFAULT_CIDR)"},{"line_number":1313,"context_line":"        if any(netaddr.IPNetwork(s.cidr) in meta_cidr"},{"line_number":1314,"context_line":"               for s in subnets):"},{"line_number":1315,"context_line":"            return True"},{"line_number":1316,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_c3b8b92b","side":"PARENT","line":1313,"range":{"start_line":1313,"start_character":44,"end_line":1313,"end_character":53},"in_reply_to":"bf51134e_7d05e145","updated":"2020-07-09 11:04:24.000000000","message":"Unless I\u0027m misunderstanding your intent, I believe that would not mean the same:\n\nnetaddr overloads the in operator so we can have easy subnet-contains-another checks.\n\nBut if we replace this with \u0027subnet in (meta_cidr_v4, meta_cidr_v6)\u0027 then we will check if subnet is the same as meta_cidr_v4 or meta_cidr_v6, but not if any of those cidrs contains our subnet.","commit_id":"b1dba996b52f14a1405800cf2e90485beaeb50d3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"DNS_PORT \u003d 53"},{"line_number":51,"context_line":"DHCPV4_PORT \u003d 67"},{"line_number":52,"context_line":"DHCPV6_PORT \u003d 547"},{"line_number":53,"context_line":"# TODO(bence romsics): use the rehomed constants when they get merged"},{"line_number":54,"context_line":"# and released: https://review.opendev.org/738205"},{"line_number":55,"context_line":"METADATA_DEFAULT_IP \u003d \u0027169.254.169.254\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_4f22dfba","line":52,"updated":"2020-07-09 18:28:58.000000000","message":"These should be fixed now in neutron-lib so aren\u0027t necessary.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"DNS_PORT \u003d 53"},{"line_number":51,"context_line":"DHCPV4_PORT \u003d 67"},{"line_number":52,"context_line":"DHCPV6_PORT \u003d 547"},{"line_number":53,"context_line":"# TODO(bence romsics): use the rehomed constants when they get merged"},{"line_number":54,"context_line":"# and released: https://review.opendev.org/738205"},{"line_number":55,"context_line":"METADATA_DEFAULT_IP \u003d \u0027169.254.169.254\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_584d7970","line":52,"in_reply_to":"bf51134e_4f22dfba","updated":"2020-07-14 13:03:33.000000000","message":"Oops, I resolved the merge conflict in the wrong way. Thanks for catching it.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"        for s in subnets:"},{"line_number":1324,"context_line":"            subnet \u003d netaddr.IPNetwork(s.cidr)"},{"line_number":1325,"context_line":"            if subnet in meta_cidr_v4 or subnet in meta_cidr_v6:"},{"line_number":1326,"context_line":"                return True"},{"line_number":1327,"context_line":"        return False"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_6f0ec33b","line":1326,"updated":"2020-07-09 18:28:58.000000000","message":"I actually don\u0027t know if we need an IPv6 metadata subnet, and I would think for the v6 address this would just be fe80 which I don\u0027t think is what we want.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"        for s in subnets:"},{"line_number":1324,"context_line":"            subnet \u003d netaddr.IPNetwork(s.cidr)"},{"line_number":1325,"context_line":"            if subnet in meta_cidr_v4 or subnet in meta_cidr_v6:"},{"line_number":1326,"context_line":"                return True"},{"line_number":1327,"context_line":"        return False"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_f3d3ceff","line":1326,"in_reply_to":"bf51134e_6f0ec33b","updated":"2020-07-14 13:03:33.000000000","message":"Done","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"ba2f0b0a3181cfff234a023334e6214569c33d81","unresolved":false,"context_lines":[{"line_number":48,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"DNS_PORT \u003d 53"},{"line_number":51,"context_line":"# TODO(bence romsics): use the rehomed constants when they get released:"},{"line_number":52,"context_line":"# https://review.opendev.org/738205"},{"line_number":53,"context_line":"METADATA_DEFAULT_IP \u003d \u0027169.254.169.254\u0027"},{"line_number":54,"context_line":"METADATA_SUBNET_CIDR \u003d \u0027169.254.0.0/16\u0027"},{"line_number":55,"context_line":"METADATA_V6_IP \u003d \u0027fe80::a9fe:a9fe\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_56ea38d7","line":52,"range":{"start_line":51,"start_character":0,"end_line":52,"end_character":35},"updated":"2020-08-07 06:34:58.000000000","message":"seems release 2.5.0 of neutron-lib includes this","commit_id":"86a53aa5cf0965ab8306bf04092c8ef42a5e4915"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"1f5a115efd9117d39a74de1ff5ab5b09bee23459","unresolved":false,"context_lines":[{"line_number":48,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"DNS_PORT \u003d 53"},{"line_number":51,"context_line":"# TODO(bence romsics): use the rehomed constants when they get released:"},{"line_number":52,"context_line":"# https://review.opendev.org/738205"},{"line_number":53,"context_line":"METADATA_DEFAULT_IP \u003d \u0027169.254.169.254\u0027"},{"line_number":54,"context_line":"METADATA_SUBNET_CIDR \u003d \u0027169.254.0.0/16\u0027"},{"line_number":55,"context_line":"METADATA_V6_IP \u003d \u0027fe80::a9fe:a9fe\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f560f44_661160ad","line":52,"range":{"start_line":51,"start_character":0,"end_line":52,"end_character":35},"in_reply_to":"9f560f44_56ea38d7","updated":"2020-08-11 15:55:48.000000000","message":"Please see the change on top of this series.","commit_id":"86a53aa5cf0965ab8306bf04092c8ef42a5e4915"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b3d00e22fcdba4cb8918331c49cec73ed189114a","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_196e2cc8","line":145,"updated":"2020-08-26 10:02:14.000000000","message":"pep8: E1120: No value for argument \u0027bases\u0027 in classmethod call (no-value-for-parameter)","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5e234425ea39c5301afbfccecb4a9d0245e7da63","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_467a69f0","line":145,"updated":"2020-08-27 13:56:49.000000000","message":"pep8: E1120: No value for argument \u0027bases\u0027 in classmethod call (no-value-for-parameter)","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5e234425ea39c5301afbfccecb4a9d0245e7da63","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_267db5e6","line":145,"updated":"2020-08-27 13:56:49.000000000","message":"pep8: E1120: No value for argument \u0027namespace\u0027 in classmethod call (no-value-for-parameter)","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"b3d00e22fcdba4cb8918331c49cec73ed189114a","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_f97098a6","line":145,"updated":"2020-08-26 10:02:14.000000000","message":"pep8: E1120: No value for argument \u0027namespace\u0027 in classmethod call (no-value-for-parameter)","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3a84c04f5ccc51a89a607887c2625ec5880ef05e","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):  # pylint: disable\u003dno-value-for-parameter"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_9f25a50d","line":145,"updated":"2020-09-01 10:42:56.000000000","message":"pep8: E1120: No value for argument \u0027bases\u0027 in classmethod call (no-value-for-parameter)","commit_id":"a0b18d553d75977fa48c6a64904b19c8fcd1b6de"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"3a84c04f5ccc51a89a607887c2625ec5880ef05e","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __deepcopy__(self, memo):  # pylint: disable\u003dno-value-for-parameter"},{"line_number":144,"context_line":"        cls \u003d self.__class__"},{"line_number":145,"context_line":"        result \u003d cls.__new__(cls)"},{"line_number":146,"context_line":"        memo[id(self)] \u003d result"},{"line_number":147,"context_line":"        result._dictmodel_internal_storage \u003d copy.deepcopy("},{"line_number":148,"context_line":"            self._dictmodel_internal_storage)"}],"source_content_type":"text/x-python","patch_set":22,"id":"9f560f44_7f225103","line":145,"updated":"2020-09-01 10:42:56.000000000","message":"pep8: E1120: No value for argument \u0027namespace\u0027 in classmethod call (no-value-for-parameter)","commit_id":"a0b18d553d75977fa48c6a64904b19c8fcd1b6de"}],"neutron/agent/metadata/driver.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        }"},{"line_number":138,"context_line":"        if self.host_v6 and self.bind_interface:"},{"line_number":139,"context_line":"            cfg_info[\u0027bind_v6_line\u0027] \u003d ("},{"line_number":140,"context_line":"                \u0027bind %s:%s interface %s\u0027 % ("},{"line_number":141,"context_line":"                    self.host_v6, self.port, self.bind_interface)"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        # If using the network ID, delete any spurious router ID that might"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_e119477a","line":140,"updated":"2020-07-09 18:28:58.000000000","message":"Ah yes, the binding of a link-local will require the interface","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            cfg_info[\u0027bind_v6_line\u0027] \u003d ("},{"line_number":140,"context_line":"                \u0027bind %s:%s interface %s\u0027 % ("},{"line_number":141,"context_line":"                    self.host_v6, self.port, self.bind_interface)"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        # If using the network ID, delete any spurious router ID that might"},{"line_number":144,"context_line":"        # have been in the request, same for network ID when using router ID."},{"line_number":145,"context_line":"        if self.network_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_81396bd8","line":142,"updated":"2020-07-09 18:28:58.000000000","message":"Another way to do this is to have the caller provide a list of tuples - [(ip, port, interface), (ipv6, port, interface)]\nThen there wouldn\u0027t be special cases for IPv6 and it should simplify the below as well.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d0344d6547d96f3ea13cb58edcdad546b6078883","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            cfg_info[\u0027bind_v6_line\u0027] \u003d ("},{"line_number":140,"context_line":"                \u0027bind %s:%s interface %s\u0027 % ("},{"line_number":141,"context_line":"                    self.host_v6, self.port, self.bind_interface)"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        # If using the network ID, delete any spurious router ID that might"},{"line_number":144,"context_line":"        # have been in the request, same for network ID when using router ID."},{"line_number":145,"context_line":"        if self.network_id:"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_a27eedab","line":142,"in_reply_to":"bf51134e_81396bd8","updated":"2020-07-15 07:53:06.000000000","message":"The v4 bind does not need an interface. The v6 info is not present in every call. With a large number of parameters (some of them optional) I usually find named parameters easier to handle than positional parameters. But let me know if I\u0027m missing your point.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"855d083a0467c338152256aa2d9a16553504d16d","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # HAProxy cannot bind() until IPv6 Duplicate Address Detection"},{"line_number":264,"context_line":"        # completes. We must wait until the address leaves its \u0027tentative\u0027"},{"line_number":265,"context_line":"        # state."},{"line_number":266,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":267,"context_line":"            ip_lib.IpAddrCommand("},{"line_number":268,"context_line":"                parent\u003dip_lib.IPDevice(name\u003dbind_interface, namespace\u003dns_name)"},{"line_number":269,"context_line":"            ).wait_until_address_ready(address\u003dbind_address_v6)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_2f3e8b8a","line":266,"updated":"2020-07-09 17:25:22.000000000","message":"pep8: F821 undefined name \u0027netutils\u0027","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # HAProxy cannot bind() until IPv6 Duplicate Address Detection"},{"line_number":264,"context_line":"        # completes. We must wait until the address leaves its \u0027tentative\u0027"},{"line_number":265,"context_line":"        # state."},{"line_number":266,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":267,"context_line":"            ip_lib.IpAddrCommand("},{"line_number":268,"context_line":"                parent\u003dip_lib.IPDevice(name\u003dbind_interface, namespace\u003dns_name)"},{"line_number":269,"context_line":"            ).wait_until_address_ready(address\u003dbind_address_v6)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_3368a6f3","line":266,"in_reply_to":"bf51134e_2f3e8b8a","updated":"2020-07-14 13:03:33.000000000","message":"I squashed the import into the wrong change. Moved it.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"79a497dccd34aeaac80d823ba52880b0eb350217","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # HAProxy cannot bind() until IPv6 Duplicate Address Detection"},{"line_number":264,"context_line":"        # completes. We must wait until the address leaves its \u0027tentative\u0027"},{"line_number":265,"context_line":"        # state."},{"line_number":266,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":267,"context_line":"            ip_lib.IpAddrCommand("},{"line_number":268,"context_line":"                parent\u003dip_lib.IPDevice(name\u003dbind_interface, namespace\u003dns_name)"},{"line_number":269,"context_line":"            ).wait_until_address_ready(address\u003dbind_address_v6)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_8167abe9","line":266,"in_reply_to":"bf51134e_2f3e8b8a","updated":"2020-07-09 18:28:58.000000000","message":"Should also check that the address being bound is IPv6 as well, or not None.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"7a2090dfd778479c17ba245a2a15122d63b1cce7","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # HAProxy cannot bind() until IPv6 Duplicate Address Detection"},{"line_number":264,"context_line":"        # completes. We must wait until the address leaves its \u0027tentative\u0027"},{"line_number":265,"context_line":"        # state."},{"line_number":266,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":267,"context_line":"            ip_lib.IpAddrCommand("},{"line_number":268,"context_line":"                parent\u003dip_lib.IPDevice(name\u003dbind_interface, namespace\u003dns_name)"},{"line_number":269,"context_line":"            ).wait_until_address_ready(address\u003dbind_address_v6)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_b3ae762b","line":266,"in_reply_to":"bf51134e_8167abe9","updated":"2020-07-14 13:03:33.000000000","message":"Done","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d0344d6547d96f3ea13cb58edcdad546b6078883","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        # HAProxy cannot bind() until IPv6 Duplicate Address Detection"},{"line_number":264,"context_line":"        # completes. We must wait until the address leaves its \u0027tentative\u0027"},{"line_number":265,"context_line":"        # state."},{"line_number":266,"context_line":"        if netutils.is_ipv6_enabled():"},{"line_number":267,"context_line":"            ip_lib.IpAddrCommand("},{"line_number":268,"context_line":"                parent\u003dip_lib.IPDevice(name\u003dbind_interface, namespace\u003dns_name)"},{"line_number":269,"context_line":"            ).wait_until_address_ready(address\u003dbind_address_v6)"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_0247d978","line":266,"in_reply_to":"bf51134e_8167abe9","updated":"2020-07-15 07:53:06.000000000","message":"I hope nobody passes us a non-v6 address in a parameter called bind_address_v6.","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"7d92355fb524f27bc290945f1f2799db947aab3b","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        pm \u003d cls._get_metadata_proxy_process_manager(uuid, conf,"},{"line_number":262,"context_line":"                                                     ns_name\u003dns_name,"},{"line_number":263,"context_line":"                                                     callback\u003dcallback)"},{"line_number":264,"context_line":"        if (netutils.is_ipv6_enabled() and"},{"line_number":265,"context_line":"                bind_interface is not None and"},{"line_number":266,"context_line":"                bind_address_v6 is not None):"},{"line_number":267,"context_line":"            # HAProxy cannot bind() until IPv6 Duplicate Address Detection"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf51134e_b866f9ed","line":264,"updated":"2020-07-16 21:36:06.000000000","message":"nit: this check probably isn\u0027t necessary as the caller will have done it, right?","commit_id":"1adecedcb13e054e35677ec7cee85f1468017254"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"8bcedf5eb0c4229caf50ed62c746b4e29a243e16","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        pm \u003d cls._get_metadata_proxy_process_manager(uuid, conf,"},{"line_number":262,"context_line":"                                                     ns_name\u003dns_name,"},{"line_number":263,"context_line":"                                                     callback\u003dcallback)"},{"line_number":264,"context_line":"        if (netutils.is_ipv6_enabled() and"},{"line_number":265,"context_line":"                bind_interface is not None and"},{"line_number":266,"context_line":"                bind_address_v6 is not None):"},{"line_number":267,"context_line":"            # HAProxy cannot bind() until IPv6 Duplicate Address Detection"}],"source_content_type":"text/x-python","patch_set":14,"id":"bf51134e_67167c58","line":264,"in_reply_to":"bf51134e_b866f9ed","updated":"2020-07-17 13:33:16.000000000","message":"Sounds right. I guess we can assume that when somebody passes us a v6 address to bind to then he already checked for v6 enabled in the environment.","commit_id":"1adecedcb13e054e35677ec7cee85f1468017254"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"09cabffce4932c9b6e90742dc7f7e716d98df6a4","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron_lib import exceptions"},{"line_number":26,"context_line":"from oslo_config import cfg"},{"line_number":27,"context_line":"from oslo_log import log as logging"},{"line_number":28,"context_line":"from oslo_utils import netutils"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from neutron._i18n import _"},{"line_number":31,"context_line":"from neutron.agent.l3 import ha_router"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf51134e_e4aeff2d","line":28,"updated":"2020-07-17 17:42:22.000000000","message":"pep8: F401 \u0027oslo_utils.netutils\u0027 imported but unused","commit_id":"2460eaa472ee5f883bdce3e382b570aaac63e885"}],"neutron/tests/unit/agent/dhcp/test_agent.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2948ad3632d3ba989a22d248b6172bfab7f06241","unresolved":false,"context_lines":[{"line_number":568,"context_line":""},{"line_number":569,"context_line":"        with mock.patch.object(metadata_driver,"},{"line_number":570,"context_line":"                               \u0027MetadataDriver\u0027) as md_cls, \\"},{"line_number":571,"context_line":"             mock.patch.object("},{"line_number":572,"context_line":"                 netutils, \u0027is_ipv6_enabled\u0027) as mock_is_ipv6_enabled:"},{"line_number":573,"context_line":"            mock_is_ipv6_enabled.return_value \u003d is_ipv6_enabled"},{"line_number":574,"context_line":"            dhcp \u003d dhcp_agent.DhcpAgent(HOSTNAME)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_a7dc0547","line":571,"updated":"2020-04-21 01:16:07.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"375c939ab310e298a893528ca311315450de05ca"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2948ad3632d3ba989a22d248b6172bfab7f06241","unresolved":false,"context_lines":[{"line_number":984,"context_line":"            bind_address \u003d dhcp.METADATA_DEFAULT_IP"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"        with mock.patch(method_path) as spawn, \\"},{"line_number":987,"context_line":"             mock.patch.object("},{"line_number":988,"context_line":"                 netutils, \u0027is_ipv6_enabled\u0027) as mock_is_ipv6_enabled:"},{"line_number":989,"context_line":"                mock_is_ipv6_enabled.return_value \u003d is_ipv6_enabled"},{"line_number":990,"context_line":"                self.dhcp.enable_isolated_metadata_proxy(network)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_87e10902","line":987,"updated":"2020-04-21 01:16:07.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"375c939ab310e298a893528ca311315450de05ca"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2948ad3632d3ba989a22d248b6172bfab7f06241","unresolved":false,"context_lines":[{"line_number":986,"context_line":"        with mock.patch(method_path) as spawn, \\"},{"line_number":987,"context_line":"             mock.patch.object("},{"line_number":988,"context_line":"                 netutils, \u0027is_ipv6_enabled\u0027) as mock_is_ipv6_enabled:"},{"line_number":989,"context_line":"                mock_is_ipv6_enabled.return_value \u003d is_ipv6_enabled"},{"line_number":990,"context_line":"                self.dhcp.enable_isolated_metadata_proxy(network)"},{"line_number":991,"context_line":"                spawn.assert_called_once_with(self.dhcp._process_monitor,"},{"line_number":992,"context_line":"                                              network.namespace,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f493fa4_e7e56d0c","line":989,"updated":"2020-04-21 01:16:07.000000000","message":"pep8: E117 over-indented","commit_id":"375c939ab310e298a893528ca311315450de05ca"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"9078fd18bb9339e09fe2cda57f4300659509b7d8","unresolved":false,"context_lines":[{"line_number":976,"context_line":"        cfg.CONF.set_override(\u0027log_file\u0027, \u0027test.log\u0027)"},{"line_number":977,"context_line":"        method_path \u003d (\u0027neutron.agent.metadata.driver.MetadataDriver\u0027"},{"line_number":978,"context_line":"                       \u0027.spawn_monitored_metadata_proxy\u0027)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        with mock.patch(method_path) as spawn:"},{"line_number":981,"context_line":"            self.dhcp.enable_isolated_metadata_proxy(network)"},{"line_number":982,"context_line":"            metadata_ip \u003d dhcp.METADATA_DEFAULT_IP"}],"source_content_type":"text/x-python","patch_set":12,"id":"bf51134e_f3b10e46","line":979,"updated":"2020-07-10 13:39:28.000000000","message":"nit: unrelated","commit_id":"46b8133304c9bc603cc69ea357d172b35131b62f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0bedf72bd9bbefbbc82665b725cd2903089880d","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        with mock.patch("},{"line_number":566,"context_line":"                \u0027neutron.agent.linux.ip_lib.\u0027"},{"line_number":567,"context_line":"                \u0027IpAddrCommand.wait_until_address_ready\u0027"},{"line_number":568,"context_line":"             ) as mock_wait:"},{"line_number":569,"context_line":"            mock_wait.return_value \u003d True"},{"line_number":570,"context_line":"            dhcp \u003d dhcp_agent.DhcpAgent(HOSTNAME)"},{"line_number":571,"context_line":"            self.assertEqual(set(), dhcp.dhcp_ready_ports)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_8c9f6964","line":568,"updated":"2020-08-12 12:47:59.000000000","message":"nit: I think indentation here is a bit wrong","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"937d879ce6851481ad2117342727f41077252657","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        with mock.patch("},{"line_number":566,"context_line":"                \u0027neutron.agent.linux.ip_lib.\u0027"},{"line_number":567,"context_line":"                \u0027IpAddrCommand.wait_until_address_ready\u0027"},{"line_number":568,"context_line":"             ) as mock_wait:"},{"line_number":569,"context_line":"            mock_wait.return_value \u003d True"},{"line_number":570,"context_line":"            dhcp \u003d dhcp_agent.DhcpAgent(HOSTNAME)"},{"line_number":571,"context_line":"            self.assertEqual(set(), dhcp.dhcp_ready_ports)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_e59c0a5d","line":568,"in_reply_to":"9f560f44_8c9f6964","updated":"2020-08-17 09:25:18.000000000","message":"Done","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"9c43d50052ec933183111f4bde8c7bcafcb0562b","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"            expected_ips \u003d [\u0027172.9.9.9/24\u0027, const.METADATA_CIDR]"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"        if ipv6_enabled:"},{"line_number":1898,"context_line":"            expected_ips.append(\u0027fe80::a9fe:a9fe/64\u0027)"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"        expected \u003d [mock.call.get_device_name(port)]"},{"line_number":1901,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_1067ff26","line":1898,"range":{"start_line":1898,"start_character":32,"end_line":1898,"end_character":52},"updated":"2020-08-27 19:21:02.000000000","message":"nit: should use the constant from dhcp.py, but can fix later when we bump neutron-lib","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"38109b551ca758cb6415db9bff1ae317d832be99","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"            expected_ips \u003d [\u0027172.9.9.9/24\u0027, const.METADATA_CIDR]"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"        if ipv6_enabled:"},{"line_number":1898,"context_line":"            expected_ips.append(\u0027fe80::a9fe:a9fe/64\u0027)"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"        expected \u003d [mock.call.get_device_name(port)]"},{"line_number":1901,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9f560f44_874a92a9","line":1898,"range":{"start_line":1898,"start_character":32,"end_line":1898,"end_character":52},"in_reply_to":"9f560f44_1067ff26","updated":"2020-08-31 11:03:57.000000000","message":"Done","commit_id":"f070242d54b041f5f86c407fc04cd0b91d51463a"}],"neutron/tests/unit/agent/l3/test_agent.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a0bedf72bd9bbefbbc82665b725cd2903089880d","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        with mock.patch("},{"line_number":288,"context_line":"                \u0027neutron.agent.linux.ip_lib.\u0027"},{"line_number":289,"context_line":"                \u0027IpAddrCommand.wait_until_address_ready\u0027"},{"line_number":290,"context_line":"             ) as mock_wait:"},{"line_number":291,"context_line":"            mock_wait.return_value \u003d True"},{"line_number":292,"context_line":"            agent.enqueue_state_change(router.id, \u0027master\u0027)"},{"line_number":293,"context_line":"            eventlet.sleep(self.conf.ha_vrrp_advert_int + 2)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9f560f44_6ca495ba","line":290,"updated":"2020-08-12 12:47:59.000000000","message":"same nit here","commit_id":"a0f20c81493d2ff51854975f1c719a9a2cf364a9"}],"neutron/tests/unit/agent/linux/test_dhcp.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"423390df5aed47c227b27831e78032f99dc3245b","unresolved":false,"context_lines":[{"line_number":3078,"context_line":"            if enable_isolated_metadata or force_metadata:"},{"line_number":3079,"context_line":"                expect_ips.extend(["},{"line_number":3080,"context_line":"                    dhcp.METADATA_DEFAULT_CIDR,"},{"line_number":3081,"context_line":"                    \u0027fe80::a9fe:a9fe/64\u0027])"},{"line_number":3082,"context_line":"            mgr.driver.init_l3.assert_called_with(\u0027ns-XXX\u0027,"},{"line_number":3083,"context_line":"                                                  expect_ips,"},{"line_number":3084,"context_line":"                                                  namespace\u003d\u0027qdhcp-ns\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f493fa4_429c6bbf","line":3081,"range":{"start_line":3081,"start_character":20,"end_line":3081,"end_character":40},"updated":"2020-04-28 16:29:15.000000000","message":"nit: dhcp.METADATA_V6_DEFAULT_CIDR","commit_id":"8d9363f39c490e8c1a8ec8dddfc0750af4704c44"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"372fd2d4b70ae8f378cd498594f8b839b59346b3","unresolved":false,"context_lines":[{"line_number":3078,"context_line":"            if enable_isolated_metadata or force_metadata:"},{"line_number":3079,"context_line":"                expect_ips.extend(["},{"line_number":3080,"context_line":"                    dhcp.METADATA_DEFAULT_CIDR,"},{"line_number":3081,"context_line":"                    \u0027fe80::a9fe:a9fe/64\u0027])"},{"line_number":3082,"context_line":"            mgr.driver.init_l3.assert_called_with(\u0027ns-XXX\u0027,"},{"line_number":3083,"context_line":"                                                  expect_ips,"},{"line_number":3084,"context_line":"                                                  namespace\u003d\u0027qdhcp-ns\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf51134e_c3e6f944","line":3081,"range":{"start_line":3081,"start_character":20,"end_line":3081,"end_character":40},"in_reply_to":"1f493fa4_429c6bbf","updated":"2020-07-09 11:04:24.000000000","message":"Done","commit_id":"8d9363f39c490e8c1a8ec8dddfc0750af4704c44"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fc9406ee2fdfeab7c5c7a22f6c1e137b8b9806ea","unresolved":false,"context_lines":[{"line_number":3158,"context_line":"            if enable_isolated_metadata or force_metadata:"},{"line_number":3159,"context_line":"                expect_ips.extend(["},{"line_number":3160,"context_line":"                    dhcp.METADATA_DEFAULT_CIDR,"},{"line_number":3161,"context_line":"                    \u0027fe80::a9fe:a9fe/64\u0027])"},{"line_number":3162,"context_line":"            mgr.driver.init_l3.assert_called_with(\u0027ns-XXX\u0027,"},{"line_number":3163,"context_line":"                                                  expect_ips,"},{"line_number":3164,"context_line":"                                                  namespace\u003d\u0027qdhcp-ns\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_8014cc45","line":3161,"updated":"2020-06-22 15:40:06.000000000","message":"could be METADATA_V6_DEFAULT_CIDR?","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"372fd2d4b70ae8f378cd498594f8b839b59346b3","unresolved":false,"context_lines":[{"line_number":3158,"context_line":"            if enable_isolated_metadata or force_metadata:"},{"line_number":3159,"context_line":"                expect_ips.extend(["},{"line_number":3160,"context_line":"                    dhcp.METADATA_DEFAULT_CIDR,"},{"line_number":3161,"context_line":"                    \u0027fe80::a9fe:a9fe/64\u0027])"},{"line_number":3162,"context_line":"            mgr.driver.init_l3.assert_called_with(\u0027ns-XXX\u0027,"},{"line_number":3163,"context_line":"                                                  expect_ips,"},{"line_number":3164,"context_line":"                                                  namespace\u003d\u0027qdhcp-ns\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf51134e_63456d15","line":3161,"in_reply_to":"bf51134e_8014cc45","updated":"2020-07-09 11:04:24.000000000","message":"Done","commit_id":"b2347bbe56e61e31d83e4eaa2e38d577f4b7e007"}]}
