)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"e90a5af6f69b1a94b4fc3fbda7fab0e31934f95b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    zun start test0"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"5.Run attach command:"},{"line_number":25,"context_line":"    zun attach test0"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"6.Once connected, you can see the output info from screen service \"zun-wsproxy\""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5ff73747_7d1f856b","line":25,"range":{"start_line":25,"start_character":4,"end_line":25,"end_character":20},"updated":"2017-05-02 00:52:26.000000000","message":"I tried these steps, and successfully attached to the container, which is great. What didn\u0027t work is when I typed \"exit\" inside the container, the zun-wsproxy process die. I guess this can be fixed by handling some disconnected exception and let the process continue.","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"}],"zun/cmd/wsproxy.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"18cc07ca96bd72224b022dd5e2c7fa756d02dee1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        parse \u003d urlparse.urlparse(self.request.path)"},{"line_number":47,"context_line":"        query \u003d parse.query"},{"line_number":48,"context_line":"        token \u003d urlparse.parse_qs(query).get(\"token\", [\"\"]).pop()"},{"line_number":49,"context_line":"        if token \u003d\u003d container.token:"},{"line_number":50,"context_line":"            if container.websocketurl:"},{"line_number":51,"context_line":"                target_url \u003d container.websocketurl"},{"line_number":52,"context_line":"                escape \u003d \"~\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5ff73747_fd85d5ad","line":49,"range":{"start_line":49,"start_character":11,"end_line":49,"end_character":16},"updated":"2017-05-02 00:43:41.000000000","message":"A bonus is sending a error response if token is not matched.","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def exit_with_error(msg, errno\u003d-1):"},{"line_number":28,"context_line":"    sys.stderr.write(msg + \u0027\\n\u0027)"},{"line_number":29,"context_line":"    sys.exit(errno)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_c91da0be","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":19},"updated":"2017-05-15 00:56:00.000000000","message":"This method is unused?","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def exit_with_error(msg, errno\u003d-1):"},{"line_number":28,"context_line":"    sys.stderr.write(msg + \u0027\\n\u0027)"},{"line_number":29,"context_line":"    sys.exit(errno)"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_4c6634f0","line":27,"range":{"start_line":27,"start_character":4,"end_line":27,"end_character":19},"in_reply_to":"1f013ff3_c91da0be","updated":"2017-05-15 10:05:06.000000000","message":"Yes, I\u0027ve removed it.","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"a39392f1a0e182048c5d63c813522a244a32644c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"from zun.common import config"},{"line_number":18,"context_line":"from zun.common import service as zun_service"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f013ff3_0b820950","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":10},"updated":"2017-05-17 10:05:31.000000000","message":"after this there should be new line, i am not sure why pep8 does not catch this.","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"370702c3c24ebcf33d85ceef6fed2c4cd3082f03","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from oslo_log import log as logging"},{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"from zun.common import config"},{"line_number":18,"context_line":"from zun.common import service as zun_service"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_eb45d571","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":10},"in_reply_to":"1f013ff3_0b820950","updated":"2017-05-18 10:48:30.000000000","message":"Done","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"a39392f1a0e182048c5d63c813522a244a32644c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"from zun.common import config"},{"line_number":18,"context_line":"from zun.common import service as zun_service"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import zun.conf"},{"line_number":21,"context_line":"from zun.websocket import websocketproxy"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f013ff3_cbaae1d0","line":19,"updated":"2017-05-17 10:05:31.000000000","message":"i think this new line should not be here.","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"370702c3c24ebcf33d85ceef6fed2c4cd3082f03","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sys"},{"line_number":17,"context_line":"from zun.common import config"},{"line_number":18,"context_line":"from zun.common import service as zun_service"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import zun.conf"},{"line_number":21,"context_line":"from zun.websocket import websocketproxy"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_cb4a117f","line":19,"in_reply_to":"1f013ff3_cbaae1d0","updated":"2017-05-18 10:48:30.000000000","message":"Done","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"}],"zun/conf/websocket_proxy.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\")"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"wsproxy_opts \u003d ["},{"line_number":25,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027, default\u003dTrue,"},{"line_number":26,"context_line":"                help\u003d\"\"\""},{"line_number":27,"context_line":"Enable the websocket proxy feature."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_897d58e9","line":25,"range":{"start_line":25,"start_character":17,"end_line":25,"end_character":24},"updated":"2017-05-15 00:56:00.000000000","message":"It seems this config is unused?","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"\"\"\")"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"wsproxy_opts \u003d ["},{"line_number":25,"context_line":"    cfg.BoolOpt(\u0027enabled\u0027, default\u003dTrue,"},{"line_number":26,"context_line":"                help\u003d\"\"\""},{"line_number":27,"context_line":"Enable the websocket proxy feature."},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_cc512411","line":25,"range":{"start_line":25,"start_character":17,"end_line":25,"end_character":24},"in_reply_to":"1f013ff3_897d58e9","updated":"2017-05-15 10:05:06.000000000","message":"Yes, it is unused now.\n\nDo you think this flags is a must one? If yes, I will submit another patch to make the service enable or disable according to this params. If not, I just remove the flags here.","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"a39392f1a0e182048c5d63c813522a244a32644c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"wsproxy_opts \u003d ["},{"line_number":25,"context_line":"    cfg.URIOpt(\u0027base_url\u0027,"},{"line_number":26,"context_line":"               default\u003d\u0027ws://127.0.0.1:6784/\u0027,"},{"line_number":27,"context_line":"               help\u003d\"\"\""},{"line_number":28,"context_line":"The URL an end user would use to connect to the ``zun-wsproxy`` service."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f013ff3_ab49d5d0","line":26,"range":{"start_line":26,"start_character":15,"end_line":26,"end_character":46},"updated":"2017-05-17 10:05:31.000000000","message":"can we derive this from host and port itself, rather than writing it again. Something like https://github.com/openstack/zun/blob/bbb0be3df17c28dbbd04d5d8af29a4fecbe397b7/zun/conf/path.py#L28","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"370702c3c24ebcf33d85ceef6fed2c4cd3082f03","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"wsproxy_opts \u003d ["},{"line_number":25,"context_line":"    cfg.URIOpt(\u0027base_url\u0027,"},{"line_number":26,"context_line":"               default\u003d\u0027ws://127.0.0.1:6784/\u0027,"},{"line_number":27,"context_line":"               help\u003d\"\"\""},{"line_number":28,"context_line":"The URL an end user would use to connect to the ``zun-wsproxy`` service."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_88d54abc","line":26,"range":{"start_line":26,"start_character":15,"end_line":26,"end_character":46},"in_reply_to":"1f013ff3_ab49d5d0","updated":"2017-05-18 10:48:30.000000000","message":"Done","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"}],"zun/db/sqlalchemy/alembic/versions/f1d58cbb8a07_websocketurl_and_token.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"18cc07ca96bd72224b022dd5e2c7fa756d02dee1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                  sa.Column(\u0027websocketurl\u0027, sa.String(length\u003d255),"},{"line_number":35,"context_line":"                            nullable\u003dTrue))"},{"line_number":36,"context_line":"    op.add_column(\u0027container\u0027,"},{"line_number":37,"context_line":"                  sa.Column(\u0027token\u0027, sa.String(length\u003d255),"},{"line_number":38,"context_line":"                            nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ff73747_1a6c07cc","line":37,"range":{"start_line":37,"start_character":29,"end_line":37,"end_character":34},"updated":"2017-05-02 00:43:41.000000000","message":"nit: consider renaming to websocket_token for consistency.","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"}],"zun/websocket/exceptions.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class WebSocketException(Exception):"},{"line_number":17,"context_line":"    \u0027base for all ContainerWebSocket interactive generated exceptions\u0027"},{"line_number":18,"context_line":"    def __init__(self, wrapped\u003dNone, message\u003dNone):"},{"line_number":19,"context_line":"        self.wrapped \u003d wrapped"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_c9724012","line":16,"range":{"start_line":16,"start_character":6,"end_line":16,"end_character":24},"updated":"2017-05-15 00:56:00.000000000","message":"How about putting these exceptions in https://github.com/openstack/zun/blob/master/zun/common/exception.py , and make them inherit from ZunException ?","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# limitations under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class WebSocketException(Exception):"},{"line_number":17,"context_line":"    \u0027base for all ContainerWebSocket interactive generated exceptions\u0027"},{"line_number":18,"context_line":"    def __init__(self, wrapped\u003dNone, message\u003dNone):"},{"line_number":19,"context_line":"        self.wrapped \u003d wrapped"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_accb78a3","line":16,"range":{"start_line":16,"start_character":6,"end_line":16,"end_character":24},"in_reply_to":"1f013ff3_c9724012","updated":"2017-05-15 10:05:06.000000000","message":"Good idea, done","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"}],"zun/websocket/websocketclient.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"DEFAULT_API_VERSION \u003d \u00271\u0027"},{"line_number":25,"context_line":"DEFAULT_ENDPOINT_TYPE \u003d \u0027publicURL\u0027"},{"line_number":26,"context_line":"DEFAULT_SERVICE_TYPE \u003d \u0027container\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class WebSocketClient(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_c9fec0ad","line":26,"range":{"start_line":24,"start_character":0,"end_line":26,"end_character":20},"updated":"2017-05-15 00:56:00.000000000","message":"It seems this constants are declared but unused?","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"DEFAULT_API_VERSION \u003d \u00271\u0027"},{"line_number":25,"context_line":"DEFAULT_ENDPOINT_TYPE \u003d \u0027publicURL\u0027"},{"line_number":26,"context_line":"DEFAULT_SERVICE_TYPE \u003d \u0027container\u0027"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class WebSocketClient(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_ec3620b5","line":26,"range":{"start_line":24,"start_character":0,"end_line":26,"end_character":20},"in_reply_to":"1f013ff3_c9fec0ad","updated":"2017-05-15 10:05:06.000000000","message":"Done","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"}],"zun/websocket/websocketproxy.py":[{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"18cc07ca96bd72224b022dd5e2c7fa756d02dee1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            conn.handleClose()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _handlerList(self, rList):"},{"line_number":52,"context_line":"        for ready in rList:"},{"line_number":53,"context_line":"            if isinstance(ready, websocket._core.WebSocket):"},{"line_number":54,"context_line":"                for fileno in self.listeners:"},{"line_number":55,"context_line":"                    if isinstance(fileno, int):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ff73747_baf6335c","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":17},"updated":"2017-05-02 00:43:41.000000000","message":"The name is not quite descriptive. Consider a better name if you can think of any. What I confused is about what is being ready, so perhaps adding the \"what\" to the variable name would be better.","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"18cc07ca96bd72224b022dd5e2c7fa756d02dee1","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                        writers.append(fileno)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            try:"},{"line_number":129,"context_line":"                rList, wList, xList \u003d select(self.listeners, writers,"},{"line_number":130,"context_line":"                                             [], self.selectInterval)"},{"line_number":131,"context_line":"            except (select.error, OSError):"},{"line_number":132,"context_line":"                exc \u003d sys.exc_info()[1]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5ff73747_3ae8e3b0","line":129,"range":{"start_line":129,"start_character":16,"end_line":129,"end_character":21},"updated":"2017-05-02 00:43:41.000000000","message":"Suggest to follow the OpenStack naming style: rlist, r_list, or read_list. This applies to all files within this patch.","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"18cc07ca96bd72224b022dd5e2c7fa756d02dee1","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                else:"},{"line_number":140,"context_line":"                    continue"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"            self._handlewList(wList)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"            self._handlerList(rList)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5ff73747_dad8df1e","line":142,"range":{"start_line":142,"start_character":17,"end_line":142,"end_character":29},"updated":"2017-05-02 00:43:41.000000000","message":"ditto: _handle_wlist","commit_id":"f040eaea62c34c4b7ac56026d9843be144235ec8"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                raise self.CClose(1000, \"Target closed\")"},{"line_number":123,"context_line":"            self.cqueue.append(buf)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def do_proxy(self, target):"},{"line_number":126,"context_line":"        \u0027\u0027\u0027Proxy websocket link"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        Proxy client WebSocket to normal target socket."}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_ad937f4f","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":16},"updated":"2017-05-15 00:56:00.000000000","message":"Kevin,\n\nI might be wrong but it seems this method is the same as its parent class (https://github.com/novnc/websockify/blob/master/websockify/websocketproxy.py#L139) . I wonder if it is possible to reuse the original implementation. Is there anything that didn\u0027t work?","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                raise self.CClose(1000, \"Target closed\")"},{"line_number":123,"context_line":"            self.cqueue.append(buf)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def do_proxy(self, target):"},{"line_number":126,"context_line":"        \u0027\u0027\u0027Proxy websocket link"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        Proxy client WebSocket to normal target socket."}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_8caf9c93","line":125,"range":{"start_line":125,"start_character":8,"end_line":125,"end_character":16},"in_reply_to":"1f013ff3_ad937f4f","updated":"2017-05-15 10:05:06.000000000","message":"Hi Hongbin,\n\nDon\u0027t worry. This method is not totally the same with its parent class. Because that in do_proxy of its parent class, websocketify just proxy websocket to tcp. For every websocket link we should open a unique port of the host. That is not what we want.\n\nIn zun side, we need websocket to websocket. So I\u0027ve change some of the code realization to meet the expectation. For example, the method of recv messages is different with its parent","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        from eventlet import hubs"},{"line_number":177,"context_line":"        hubs.use_hub()"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # The nova expected behavior is to have token"},{"line_number":180,"context_line":"        # passed to the method GET of the request"},{"line_number":181,"context_line":"        parse \u003d urlparse.urlparse(self.path)"},{"line_number":182,"context_line":"        if parse.scheme not in (\u0027http\u0027, \u0027https\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_6927ac66","line":179,"range":{"start_line":179,"start_character":14,"end_line":179,"end_character":18},"updated":"2017-05-15 00:56:00.000000000","message":"zun","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        from eventlet import hubs"},{"line_number":177,"context_line":"        hubs.use_hub()"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # The nova expected behavior is to have token"},{"line_number":180,"context_line":"        # passed to the method GET of the request"},{"line_number":181,"context_line":"        parse \u003d urlparse.urlparse(self.path)"},{"line_number":182,"context_line":"        if parse.scheme not in (\u0027http\u0027, \u0027https\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_ccc00454","line":179,"range":{"start_line":179,"start_character":14,"end_line":179,"end_character":18},"in_reply_to":"1f013ff3_6927ac66","updated":"2017-05-15 10:05:06.000000000","message":"Done","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":11536,"name":"hongbin","email":"hongbin034@gmail.com","username":"hongbin"},"change_message_id":"0440b713750e3da45d178adcc509eb35ce2dc744","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            if self.target.ws:"},{"line_number":250,"context_line":"                self.target.ws.close()"},{"line_number":251,"context_line":"                self.vmsg(_(\"%Websocket client or target closed\"))"},{"line_number":252,"context_line":"            raise e"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"class ZunProxyRequestHandler(ZunProxyRequestHandlerBase,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_c9a7e04f","line":252,"range":{"start_line":252,"start_character":18,"end_line":252,"end_character":19},"updated":"2017-05-15 00:56:00.000000000","message":"nit: it seems just \"raise\" is enough.","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"9e7cc1f4bd5f4a2decd618d9002e17f0de07fb9c","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            if self.target.ws:"},{"line_number":250,"context_line":"                self.target.ws.close()"},{"line_number":251,"context_line":"                self.vmsg(_(\"%Websocket client or target closed\"))"},{"line_number":252,"context_line":"            raise e"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"class ZunProxyRequestHandler(ZunProxyRequestHandlerBase,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f013ff3_acb5b8f0","line":252,"range":{"start_line":252,"start_character":18,"end_line":252,"end_character":19},"in_reply_to":"1f013ff3_c9a7e04f","updated":"2017-05-15 10:05:06.000000000","message":"Done","commit_id":"09fcf0556990b79bd3de67c9f7d6ff03049dbcea"},{"author":{"_account_id":16277,"name":"Pradeep Kumar Singh","email":"ps4openstack@gmail.com","username":"pradeep_singh"},"change_message_id":"a39392f1a0e182048c5d63c813522a244a32644c","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        query \u003d parse.query"},{"line_number":190,"context_line":"        token \u003d urlparse.parse_qs(query).get(\"token\", [\"\"]).pop()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        dbapi \u003d db_api._get_dbdriver_instance()"},{"line_number":193,"context_line":"        ctx \u003d context.get_admin_context(all_tenants\u003dTrue)"},{"line_number":194,"context_line":"        self.headerid \u003d self.headers.get(\"User-Agent\")"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1f013ff3_4bf4915b","line":192,"range":{"start_line":192,"start_character":8,"end_line":192,"end_character":47},"updated":"2017-05-17 10:05:31.000000000","message":"instead of using db api layer, can we use object layer, please see https://github.com/openstack/zun/blob/bbb0be3df17c28dbbd04d5d8af29a4fecbe397b7/zun/api/utils.py#L79","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"},{"author":{"_account_id":22076,"name":"Kevin Zhao","email":"kevin.zhao@linaro.org","username":"KevinZhao"},"change_message_id":"370702c3c24ebcf33d85ceef6fed2c4cd3082f03","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        query \u003d parse.query"},{"line_number":190,"context_line":"        token \u003d urlparse.parse_qs(query).get(\"token\", [\"\"]).pop()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        dbapi \u003d db_api._get_dbdriver_instance()"},{"line_number":193,"context_line":"        ctx \u003d context.get_admin_context(all_tenants\u003dTrue)"},{"line_number":194,"context_line":"        self.headerid \u003d self.headers.get(\"User-Agent\")"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_2b950de5","line":192,"range":{"start_line":192,"start_character":8,"end_line":192,"end_character":47},"in_reply_to":"1f013ff3_4bf4915b","updated":"2017-05-18 10:48:30.000000000","message":"As discussed via IRC, this method may not be suitable here:-)","commit_id":"d60b48aa140e2849a964f166c95bb9b71ea57e97"}]}
