)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15435,"name":"Al Bailey","email":"albailey1974@gmail.com","username":"albailey"},"change_message_id":"ba93126e612986f89bf68ccec2dd942f2b4aa2ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8de4947e_2e8d66af","updated":"2023-02-01 22:19:38.000000000","message":"the pylint failures are being addressed by https://review.opendev.org/c/starlingx/nfv/+/872446","commit_id":"4380a874c07fb7dd395f044733cda5b6e8c63ae0"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"15b6ef34e462aa71de0b0d88d40c2510a74960fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"56d7fdc7_674c2d80","in_reply_to":"8de4947e_2e8d66af","updated":"2023-02-02 11:11:32.000000000","message":"Hi Al, thanks for letting me know. I rebased my change on it.","commit_id":"4380a874c07fb7dd395f044733cda5b6e8c63ae0"}],"nfv/nfv-common/nfv_common/selectable.py":[{"author":{"_account_id":33594,"name":"Thales Elero Cervi","display_name":"Thales Cervi","email":"thaleselero.cervi@windriver.com","username":"tcervi"},"change_message_id":"89a616867c2fd633803dbfffa8489454864c5ed3","unresolved":true,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright (c) 2015-2016 Wind River Systems, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# SPDX-License-Identifier: Apache-2.0"},{"line_number":5,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":4,"id":"07825d27_6ca724a0","line":2,"updated":"2023-02-03 11:49:40.000000000","message":"nit: update to 2015-2023, probably good to be done for all updated files","commit_id":"59fe785a6b120ba9433507a74fdde098a010c983"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"27cb29770fcb8f9d09ed1491e4eb8936fb10df12","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#"},{"line_number":2,"context_line":"# Copyright (c) 2015-2016 Wind River Systems, Inc."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# SPDX-License-Identifier: Apache-2.0"},{"line_number":5,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":4,"id":"ddc8b3c5_2ddd9b77","line":2,"in_reply_to":"07825d27_6ca724a0","updated":"2023-02-03 11:55:04.000000000","message":"Done","commit_id":"59fe785a6b120ba9433507a74fdde098a010c983"},{"author":{"_account_id":15435,"name":"Al Bailey","email":"albailey1974@gmail.com","username":"albailey"},"change_message_id":"e2d63dbec66097c030b80b3386b4d0f0ea06c17c","unresolved":true,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"class ThreadQueue(object):"},{"line_number":13,"context_line":"    def __init__(self, queue_id):"},{"line_number":14,"context_line":"        if hasattr(queue_id, \"encode\"):"},{"line_number":15,"context_line":"            queue_id \u003d queue_id.encode()"},{"line_number":16,"context_line":"        self._queue_id \u003d queue_id"},{"line_number":17,"context_line":"        self._send_socket, self._receive_socket \u003d socket.socketpair()"},{"line_number":18,"context_line":"        self._receive_socket.setblocking(False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"4c7d8d3c_5e40ba86","line":15,"range":{"start_line":14,"start_character":7,"end_line":15,"end_character":40},"updated":"2023-02-03 14:22:25.000000000","message":"this change is safe, but I am wondering why you are only seeing this with nova. If there is somewhere else in the code passing a queue_id of a different type.","commit_id":"1e475dca0c3884199b7345b719dea9a05601bc36"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"879f064fc6e8f9deb101fc04bad9de8979247475","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"class ThreadQueue(object):"},{"line_number":13,"context_line":"    def __init__(self, queue_id):"},{"line_number":14,"context_line":"        if hasattr(queue_id, \"encode\"):"},{"line_number":15,"context_line":"            queue_id \u003d queue_id.encode()"},{"line_number":16,"context_line":"        self._queue_id \u003d queue_id"},{"line_number":17,"context_line":"        self._send_socket, self._receive_socket \u003d socket.socketpair()"},{"line_number":18,"context_line":"        self._receive_socket.setblocking(False)"}],"source_content_type":"text/x-python","patch_set":5,"id":"6ccf7b04_79188514","line":15,"range":{"start_line":14,"start_character":7,"end_line":15,"end_character":40},"in_reply_to":"4c7d8d3c_5e40ba86","updated":"2023-02-03 16:55:38.000000000","message":"Good point.\n\nThe only place where there\u0027s a reference to `:class:selectable.ThreadQueue` is in the `:class:rpc_listener.RPCListener` definition:\n\nhttps://opendev.org/starlingx/nfv/src/branch/master/nfv/nfv-plugins/nfv_plugins/nfvi_plugins/openstack/rpc_listener.py#L45\n\nAnd the `:class:rpc_listener.RPCListener` is, in turn, only referenced in the `:class:nfvi_compute_api.NFVIComputeAPI` definition:\n\nhttps://opendev.org/starlingx/nfv/src/branch/master/nfv/nfv-plugins/nfv_plugins/nfvi_plugins/nfvi_compute_api.py#L3388\n\nWhich, apparently, is only related to Nova\u0027s life cycle operations.","commit_id":"1e475dca0c3884199b7345b719dea9a05601bc36"}],"nova-api-proxy/nova-api-proxy/nova_api_proxy/apps/proxy.py":[{"author":{"_account_id":15435,"name":"Al Bailey","email":"albailey1974@gmail.com","username":"albailey"},"change_message_id":"e2d63dbec66097c030b80b3386b4d0f0ea06c17c","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        # or more headers are set to `NoneType`. See:"},{"line_number":45,"context_line":"        # https://github.com/python/cpython/blob/3.9/Lib/http/client.py#L1253"},{"line_number":46,"context_line":"        for key, value in environ.items():"},{"line_number":47,"context_line":"            if key.startswith(\"HTTP_\"):"},{"line_number":48,"context_line":"                if value is None:"},{"line_number":49,"context_line":"                    environ[key] \u003d \"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"dbe12bf7_ad6c6762","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":39},"updated":"2023-02-03 14:22:25.000000000","message":"we probably want to track this down at the source, where its assigning the empty/None HTTP_ headers being added to the env","commit_id":"1e475dca0c3884199b7345b719dea9a05601bc36"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"879f064fc6e8f9deb101fc04bad9de8979247475","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        # or more headers are set to `NoneType`. See:"},{"line_number":45,"context_line":"        # https://github.com/python/cpython/blob/3.9/Lib/http/client.py#L1253"},{"line_number":46,"context_line":"        for key, value in environ.items():"},{"line_number":47,"context_line":"            if key.startswith(\"HTTP_\"):"},{"line_number":48,"context_line":"                if value is None:"},{"line_number":49,"context_line":"                    environ[key] \u003d \"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"f3c1f1e2_5ec82838","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":39},"in_reply_to":"dbe12bf7_ad6c6762","updated":"2023-02-03 16:55:38.000000000","message":"I agree.\n\nWhile searching for some clues in the StarlingX repositories, I discovered that this same problem was found and solved in a similar fashion in starlingx/distributedcloud:\n\nhttps://review.opendev.org/c/starlingx/distcloud/+/852185\n\nAccording to the comments in this review, if we don\u0027t explicitly set these headers to an empty string, the `keystonemiddleware` will automatically inject them in the request with `NoneType` as their values (by default).\n\nIn Python 3\u0027s builtin `http` library these values cause the request to fail this check:\n\nhttps://github.com/python/cpython/blob/044fb4fb53594b37de8188cb36f3ba33ce2d617e/Lib/http/client.py#L1262","commit_id":"1e475dca0c3884199b7345b719dea9a05601bc36"},{"author":{"_account_id":35467,"name":"Luan Utimura","display_name":"Luan Utimura","email":"luan.utimura@luizalabs.com","username":"lutimura"},"change_message_id":"69c3a3716895c23ba0f93c8dfd599d1ce97f064e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # or more headers are set to `NoneType`. See:"},{"line_number":45,"context_line":"        # https://github.com/python/cpython/blob/3.9/Lib/http/client.py#L1253"},{"line_number":46,"context_line":"        for key, value in environ.items():"},{"line_number":47,"context_line":"            if key.startswith(\"HTTP_\"):"},{"line_number":48,"context_line":"                if value is None:"},{"line_number":49,"context_line":"                    environ[key] \u003d \"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"281fcaec_99612ba8","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":39},"in_reply_to":"f3c1f1e2_5ec82838","updated":"2023-02-03 17:04:52.000000000","message":"Done","commit_id":"1e475dca0c3884199b7345b719dea9a05601bc36"}]}
