)]}'
{"nova/cmd/baseproxy.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"83a15d4e9cdb6772c5cdb3f0d9a23c44d8af4103","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        web\u003dCONF.web,"},{"line_number":75,"context_line":"        file_only\u003dTrue,"},{"line_number":76,"context_line":"        RequestHandlerClass\u003dwebsocketproxy.NovaProxyRequestHandler,"},{"line_number":77,"context_line":"        security_proxy\u003dsecurity_proxy,"},{"line_number":78,"context_line":"    ).start_server()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_895bc0f5","line":77,"range":{"start_line":77,"start_character":37,"end_line":77,"end_character":38},"updated":"2016-11-09 19:37:58.000000000","message":"nit: unnecessary \",\"","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"860676bed10ff8146a04b9d087c495f942f6da58","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        web\u003dCONF.web,"},{"line_number":75,"context_line":"        file_only\u003dTrue,"},{"line_number":76,"context_line":"        RequestHandlerClass\u003dwebsocketproxy.NovaProxyRequestHandler,"},{"line_number":77,"context_line":"        security_proxy\u003dsecurity_proxy,"},{"line_number":78,"context_line":"    ).start_server()"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d1e547a4","line":77,"range":{"start_line":77,"start_character":37,"end_line":77,"end_character":38},"in_reply_to":"9a629dbe_895bc0f5","updated":"2016-11-17 17:35:44.000000000","message":"This is intentional - when someone adds yet another parameter to this later, we don\u0027t needlessly get a diff that modifies two lines.","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"94646c33d452c283889887f877185910ea03777c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    Setup a proxy listening on @host:@port. If the"},{"line_number":50,"context_line":"    @security_proxy parameter is not None, this instance"},{"line_number":51,"context_line":"    is used to negotiate security layer with the proxy target"},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    if CONF.ssl_only and not os.path.exists(CONF.cert):"},{"line_number":55,"context_line":"        exit_with_error(\"SSL only and %s not found\" % CONF.cert)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_9c034b0e","line":52,"updated":"2017-10-19 23:56:03.000000000","message":"This is a weirdly formatted docstring. The first line is supposed to be a brief description of the method, then a blank line, then the params, another blank line, and any additional details.","commit_id":"2a04b4dadfb40f4802018e5fa197259d894ed1b9"}],"nova/console/securityproxy/base.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dfff666ad10fdf2e57bfddba8f81403b87ae2b93","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def connect(self, tenant_sock, compute_sock):"},{"line_number":35,"context_line":"        \"\"\"Initiate the console connection"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        :param tenant_sock: socket connected to the remote tenant user"},{"line_number":38,"context_line":"        :param compute_sock: socket connected to the compute node instance"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        This method performs the protocol specific"},{"line_number":41,"context_line":"        negotiation, and returns the socket-like"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_3c2215ba","line":38,"range":{"start_line":37,"start_character":0,"end_line":38,"end_character":74},"updated":"2016-11-16 15:28:04.000000000","message":"nit: parameters after body of docstring [1]\n\nhttps://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"81f15f4efb8608008fc44a21633654c9e48e47e5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014-2016 Red Hat, Inc"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_c6762e05","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":21},"updated":"2016-11-18 21:18:42.000000000","message":"New file - just 2016","commit_id":"5b3cd7cd8645ddaa0e1c4717ccd9725027336f8b"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"145e1df129623122a65f08eed1bb3f9f59faeecf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014-2016 Red Hat, Inc"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a77a97e_ebb2f105","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":21},"in_reply_to":"7a77a97e_c6762e05","updated":"2016-11-21 09:45:42.000000000","message":"Nope, this date reflects the creation of the code correctly as is.","commit_id":"5b3cd7cd8645ddaa0e1c4717ccd9725027336f8b"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"de19d3df672f380ce6bd9c98d69f133ab7f15d69","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class SecurityProxy(object):"},{"line_number":23,"context_line":"    \"\"\"A console security Proxy Helper"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Console security proxy helpers should sublclass"},{"line_number":26,"context_line":"    this class and implement a generic `connect`"},{"line_number":27,"context_line":"    for the particular protocol being used."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_e7050646","line":25,"range":{"start_line":25,"start_character":42,"end_line":25,"end_character":51},"updated":"2016-11-28 16:43:19.000000000","message":"nit: typo: s/sublclass/subclass","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class SecurityProxy(object):"},{"line_number":23,"context_line":"    \"\"\"A console security Proxy Helper"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Console security proxy helpers should sublclass"},{"line_number":26,"context_line":"    this class and implement a generic `connect`"},{"line_number":27,"context_line":"    for the particular protocol being used."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_25bd9668","line":25,"range":{"start_line":25,"start_character":42,"end_line":25,"end_character":51},"in_reply_to":"5a74a57a_e7050646","updated":"2017-01-04 14:46:54.000000000","message":"Done","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"07125bbb58c1cf33b168f9c9c28b53b047102538","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        object to use to communicate with the server"},{"line_number":40,"context_line":"        securely."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :param tenant_sock: socket connected to the remote tenant user"},{"line_number":43,"context_line":"        :param compute_sock: socket connected to the compute node instance"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :returns: a new compute_sock for the instance"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_7c4f9633","line":42,"range":{"start_line":42,"start_character":52,"end_line":42,"end_character":70},"updated":"2016-11-29 15:19:25.000000000","message":"Not sure if I get the intention of the \"tenant_sock\". That\u0027s the \"entry point\" the websocketproxy will use, right?","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        object to use to communicate with the server"},{"line_number":40,"context_line":"        securely."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        :param tenant_sock: socket connected to the remote tenant user"},{"line_number":43,"context_line":"        :param compute_sock: socket connected to the compute node instance"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :returns: a new compute_sock for the instance"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_451c5a77","line":42,"range":{"start_line":42,"start_character":52,"end_line":42,"end_character":70},"in_reply_to":"5a74a57a_7c4f9633","updated":"2017-01-04 14:46:54.000000000","message":"If I understand correctly, this is the socket on the controller node where the novnc proxy is running, right?","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"}],"nova/console/websocketproxy.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dfff666ad10fdf2e57bfddba8f81403b87ae2b93","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    the tenant user. It is used with the security proxy classes."},{"line_number":48,"context_line":"    \"\"\""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def __init__(self, ws):"},{"line_number":51,"context_line":"        self.ws \u003d ws"},{"line_number":52,"context_line":"        self.queue \u003d []"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_d70ada20","line":50,"range":{"start_line":50,"start_character":23,"end_line":50,"end_character":25},"updated":"2016-11-16 15:28:04.000000000","message":"A better name would be appreciated for future readability","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dfff666ad10fdf2e57bfddba8f81403b87ae2b93","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                tsock.close()"},{"line_number":210,"context_line":"                raise"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            tenant_sock.finish_up()"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        # Start proxying"},{"line_number":215,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_979ce2c1","line":212,"range":{"start_line":212,"start_character":24,"end_line":212,"end_character":33},"updated":"2016-11-16 15:28:04.000000000","message":"should this be \u0027close\u0027 to ensure the socket isn\u0027t left open?","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"860676bed10ff8146a04b9d087c495f942f6da58","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                tsock.close()"},{"line_number":210,"context_line":"                raise"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            tenant_sock.finish_up()"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        # Start proxying"},{"line_number":215,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_74fe21af","line":212,"range":{"start_line":212,"start_character":24,"end_line":212,"end_character":33},"in_reply_to":"7a77a97e_979ce2c1","updated":"2016-11-17 17:35:44.000000000","message":"The \u0027close\u0027 method on TenantSock doesn\u0027t actually close the underlying socket - it just triggers sending on further websockets frames to terminate the websocket connection, which we don\u0027t want here. finish-up just flushes outstanding I/O frames, before we start proxying the VNC payload.","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"07125bbb58c1cf33b168f9c9c28b53b047102538","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            new_frames, closed \u003d self.reqhandler.recv_frames()"},{"line_number":60,"context_line":"            # flatten frames onto queue"},{"line_number":61,"context_line":"            for frame in new_frames:"},{"line_number":62,"context_line":"                self.queue.extend([ord(c) for c in frame])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"            if closed:"},{"line_number":65,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_1ca6a2ad","line":62,"updated":"2016-11-29 15:19:25.000000000","message":"I don\u0027t understand why we cast the char to an Integer here and cast it then back to a char in line 67. Probably I\u0027m missing background/context about sockets here, would be great to have a short reasoning/comment here.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            new_frames, closed \u003d self.reqhandler.recv_frames()"},{"line_number":60,"context_line":"            # flatten frames onto queue"},{"line_number":61,"context_line":"            for frame in new_frames:"},{"line_number":62,"context_line":"                self.queue.extend([ord(c) for c in frame])"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"            if closed:"},{"line_number":65,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_70e91a80","line":62,"in_reply_to":"5a74a57a_1ca6a2ad","updated":"2017-01-04 14:46:54.000000000","message":"Looking at the Python docs, \u0027chr\u0027 is the exact opposite of the \u0027ord\u0027 function [1]. Seeing as the contents of self.queue are always cast back to \u0027chr\u0027 here and are not used anywhere else, I think it\u0027s safe to drop this.\n\n[1] https://docs.python.org/2/library/functions.html#chr","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"07125bbb58c1cf33b168f9c9c28b53b047102538","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                break"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        popped \u003d [chr(c) for c in self.queue[0:cnt]]"},{"line_number":68,"context_line":"        del self.queue[0:cnt]"},{"line_number":69,"context_line":"        return \u0027\u0027.join(popped)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def sendall(self, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_d7db254d","line":68,"updated":"2016-11-29 15:19:25.000000000","message":"Why do we remove the elements like this? Why not just do `self.queue \u003d []` or `del self.queue[:]`? Or will there be situations where the queue has more elements? Again, probably I know too little about sockets.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                break"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        popped \u003d [chr(c) for c in self.queue[0:cnt]]"},{"line_number":68,"context_line":"        del self.queue[0:cnt]"},{"line_number":69,"context_line":"        return \u0027\u0027.join(popped)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def sendall(self, data):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_d03646e6","line":68,"in_reply_to":"5a74a57a_d7db254d","updated":"2017-01-04 14:46:54.000000000","message":"The latter - we\u0027re only receiving up to \u0027cnt\u0027 characters but there may be many more still to be received.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"94646c33d452c283889887f877185910ea03777c","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        Create a new web socket proxy, optionally using the"},{"line_number":252,"context_line":"        @security_proxy instance to negotiate security layer"},{"line_number":253,"context_line":"        with the compute node."},{"line_number":254,"context_line":"        \"\"\""},{"line_number":255,"context_line":"        self.security_proxy \u003d kwargs.pop(\u0027security_proxy\u0027, None)"},{"line_number":256,"context_line":"        super(NovaWebSocketProxy, self).__init__(*args, **kwargs)"},{"line_number":257,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3f4b6375_9fbc5dbc","line":254,"updated":"2017-10-19 23:56:03.000000000","message":"Another wonky docstring.","commit_id":"2a04b4dadfb40f4802018e5fa197259d894ed1b9"}],"nova/exception.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"83a15d4e9cdb6772c5cdb3f0d9a23c44d8af4103","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"                \"than the maximum allowed by flavor %(max_vram)d.\")"},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"class SecurityProxyNegotiationFailed(NovaException):"},{"line_number":1820,"context_line":"    msg_fmt \u003d _(\"Failed to negotiate security type with server: %(reason)s\")"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a629dbe_4938c8ef","line":1819,"updated":"2016-11-09 19:37:58.000000000","message":"Where this new exception raises?\nThe handling place is found in this patch, but the raising place could not be found.","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"860676bed10ff8146a04b9d087c495f942f6da58","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"                \"than the maximum allowed by flavor %(max_vram)d.\")"},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"class SecurityProxyNegotiationFailed(NovaException):"},{"line_number":1820,"context_line":"    msg_fmt \u003d _(\"Failed to negotiate security type with server: %(reason)s\")"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_741541e3","line":1819,"in_reply_to":"7a77a97e_57e96a13","updated":"2016-11-17 17:35:44.000000000","message":"Yep, the reason it is defined here, is that this commit is defining the API contract and the exception is part of that contract. Its only used later when we add an impl of the API contract","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dfff666ad10fdf2e57bfddba8f81403b87ae2b93","unresolved":false,"context_lines":[{"line_number":1816,"context_line":"                \"than the maximum allowed by flavor %(max_vram)d.\")"},{"line_number":1817,"context_line":""},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"class SecurityProxyNegotiationFailed(NovaException):"},{"line_number":1820,"context_line":"    msg_fmt \u003d _(\"Failed to negotiate security type with server: %(reason)s\")"},{"line_number":1821,"context_line":""},{"line_number":1822,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a77a97e_57e96a13","line":1819,"in_reply_to":"9a629dbe_4938c8ef","updated":"2016-11-16 15:28:04.000000000","message":"It\u0027s added in a later patch where implementations of ``SecurityProxy`` are provided","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"}],"nova/tests/unit/console/test_websocketproxy.py":[{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"de19d3df672f380ce6bd9c98d69f133ab7f15d69","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                                              \u0027allowed-origin-example-2.net\u0027])"},{"line_number":33,"context_line":"        self.server \u003d websocketproxy.NovaWebSocketProxy()"},{"line_number":34,"context_line":"        self.wh \u003d websocketproxy.NovaProxyRequestHandlerBase()"},{"line_number":35,"context_line":"        self.wh.server \u003d self.server"},{"line_number":36,"context_line":"        self.wh.socket \u003d mock.MagicMock()"},{"line_number":37,"context_line":"        self.wh.msg \u003d mock.MagicMock()"},{"line_number":38,"context_line":"        self.wh.do_proxy \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_f623f953","line":35,"range":{"start_line":35,"start_character":13,"end_line":35,"end_character":22},"updated":"2016-11-28 16:43:19.000000000","message":"nit: Maybe it makes sense to note down that this is an attribute of the \"ProxyRequestHandler\" in the \"websockify\" package? https://github.com/kanaka/websockify/blob/72ce5c1ae8abbcd3f8bb5f4e93915f61a1047704/websockify/websocketproxy.py#L51 \nI was confused at the beginning and looked into the proxy handlers of Nova and didn\u0027t find this \"server\" attribute.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"07125bbb58c1cf33b168f9c9c28b53b047102538","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                spec\u003dbase.SecurityProxy)"},{"line_number":417,"context_line":"        )"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        self.wh \u003d websocketproxy.NovaProxyRequestHandlerBase()"},{"line_number":420,"context_line":"        self.wh.server \u003d self.server"},{"line_number":421,"context_line":"        self.wh.path \u003d \"http://127.0.0.1/?token\u003d123-456-789\""},{"line_number":422,"context_line":"        self.wh.socket \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_21b33799","line":419,"range":{"start_line":419,"start_character":13,"end_line":419,"end_character":15},"updated":"2016-11-29 15:19:25.000000000","message":"nit: I would have been more readable to have here \"handler\" or \"websocket_handler\" instead of \"wh\", but that\u0027s just my personal preference.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                spec\u003dbase.SecurityProxy)"},{"line_number":417,"context_line":"        )"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"        self.wh \u003d websocketproxy.NovaProxyRequestHandlerBase()"},{"line_number":420,"context_line":"        self.wh.server \u003d self.server"},{"line_number":421,"context_line":"        self.wh.path \u003d \"http://127.0.0.1/?token\u003d123-456-789\""},{"line_number":422,"context_line":"        self.wh.socket \u003d mock.MagicMock()"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_0b1a636e","line":419,"range":{"start_line":419,"start_character":13,"end_line":419,"end_character":15},"in_reply_to":"5a74a57a_21b33799","updated":"2017-01-04 14:46:54.000000000","message":"As would I, but the rest of the tests use \u0027ws\u0027 so local consistency would be preferred, IMO","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"07125bbb58c1cf33b168f9c9c28b53b047102538","unresolved":false,"context_lines":[{"line_number":463,"context_line":"    @mock.patch(\u0027nova.consoleauth.rpcapi.ConsoleAuthAPI.check_token\u0027,"},{"line_number":464,"context_line":"                return_value\u003dTrue)"},{"line_number":465,"context_line":"    def test_proxy_connect_err(self, check_token, mock_finish, mock_close):"},{"line_number":466,"context_line":"        check_token.return_value \u003d {"},{"line_number":467,"context_line":"            \u0027host\u0027: \u0027node1\u0027,"},{"line_number":468,"context_line":"            \u0027port\u0027: \u002710000\u0027,"},{"line_number":469,"context_line":"            \u0027console_type\u0027: \u0027novnc\u0027,"},{"line_number":470,"context_line":"            \u0027access_url\u0027: \u0027https://example.net:6080\u0027"},{"line_number":471,"context_line":"        }"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        ex \u003d exception.SecurityProxyNegotiationFailed(\"Wibble\")"},{"line_number":474,"context_line":"        self.server.security_proxy.connect.side_effect \u003d ex"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a74a57a_c14fe38f","line":471,"range":{"start_line":466,"start_character":0,"end_line":471,"end_character":9},"updated":"2016-11-29 15:19:25.000000000","message":"nit: duplicates to lines 444-449; could be refactored into an attribute.","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7ba90da5982f2e081b1d7a1877e0c46fea9a54a4","unresolved":false,"context_lines":[{"line_number":463,"context_line":"    @mock.patch(\u0027nova.consoleauth.rpcapi.ConsoleAuthAPI.check_token\u0027,"},{"line_number":464,"context_line":"                return_value\u003dTrue)"},{"line_number":465,"context_line":"    def test_proxy_connect_err(self, check_token, mock_finish, mock_close):"},{"line_number":466,"context_line":"        check_token.return_value \u003d {"},{"line_number":467,"context_line":"            \u0027host\u0027: \u0027node1\u0027,"},{"line_number":468,"context_line":"            \u0027port\u0027: \u002710000\u0027,"},{"line_number":469,"context_line":"            \u0027console_type\u0027: \u0027novnc\u0027,"},{"line_number":470,"context_line":"            \u0027access_url\u0027: \u0027https://example.net:6080\u0027"},{"line_number":471,"context_line":"        }"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        ex \u003d exception.SecurityProxyNegotiationFailed(\"Wibble\")"},{"line_number":474,"context_line":"        self.server.security_proxy.connect.side_effect \u003d ex"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba5201f7_6b7daf6d","line":471,"range":{"start_line":466,"start_character":0,"end_line":471,"end_character":9},"in_reply_to":"5a74a57a_c14fe38f","updated":"2017-01-04 14:46:54.000000000","message":"True, but that would make the test a little less readable IMO. In this case I think the duplication is worth it","commit_id":"8e8a55a4e50ffd514c335166e72a24483917951c"}],"tests-py3.txt":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"dfff666ad10fdf2e57bfddba8f81403b87ae2b93","unresolved":false,"context_lines":[{"line_number":35,"context_line":"nova.tests.unit.compute.test_compute_cells.CellsComputeAPITestCase.test_create_with_base64_user_data"},{"line_number":36,"context_line":"nova.tests.unit.compute.test_compute_mgr.ComputeManagerUnitTestCase.test_run_pending_deletes"},{"line_number":37,"context_line":"nova.tests.unit.compute.test_host_api.ComputeHostAPICellsTestCase"},{"line_number":38,"context_line":"nova.tests.unit.console.test_websocketproxy.NovaProxyRequestHandlerBaseTestCase"},{"line_number":39,"context_line":"nova.tests.unit.console.test_websocketproxy.NovaWebsocketSecurityProxyTestCase"},{"line_number":40,"context_line":"nova.tests.unit.network.test_manager.LdapDNSTestCase"},{"line_number":41,"context_line":"nova.tests.unit.test_bdm.BlockDeviceMappingEc2CloudTestCase"},{"line_number":42,"context_line":"nova.tests.unit.test_configdrive2.ConfigDriveTestCase"}],"source_content_type":"text/plain","patch_set":5,"id":"7a77a97e_9706a2cc","line":39,"range":{"start_line":38,"start_character":0,"end_line":39,"end_character":78},"updated":"2016-11-16 15:28:04.000000000","message":"This seems a bit regressive. Why can these tests not run against Python 3?","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"860676bed10ff8146a04b9d087c495f942f6da58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"nova.tests.unit.compute.test_compute_cells.CellsComputeAPITestCase.test_create_with_base64_user_data"},{"line_number":36,"context_line":"nova.tests.unit.compute.test_compute_mgr.ComputeManagerUnitTestCase.test_run_pending_deletes"},{"line_number":37,"context_line":"nova.tests.unit.compute.test_host_api.ComputeHostAPICellsTestCase"},{"line_number":38,"context_line":"nova.tests.unit.console.test_websocketproxy.NovaProxyRequestHandlerBaseTestCase"},{"line_number":39,"context_line":"nova.tests.unit.console.test_websocketproxy.NovaWebsocketSecurityProxyTestCase"},{"line_number":40,"context_line":"nova.tests.unit.network.test_manager.LdapDNSTestCase"},{"line_number":41,"context_line":"nova.tests.unit.test_bdm.BlockDeviceMappingEc2CloudTestCase"},{"line_number":42,"context_line":"nova.tests.unit.test_configdrive2.ConfigDriveTestCase"}],"source_content_type":"text/plain","patch_set":5,"id":"7a77a97e_d4da954a","line":39,"range":{"start_line":38,"start_character":0,"end_line":39,"end_character":78},"in_reply_to":"7a77a97e_9706a2cc","updated":"2016-11-17 17:35:44.000000000","message":"We used to ski all the console tests, but I see the rest have been fixed now, so we can likely remove this block too.","commit_id":"4915caba6e9d40bb4dc38db822b8ae94f8764105"}]}
