)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":18,"context_line":"This patch did:"},{"line_number":19,"context_line":"1. Add v2/queue/\u003cqueue_name\u003e/subscription/\u003csubscription_id\u003e/confirm"},{"line_number":20,"context_line":"endpoint."},{"line_number":21,"context_line":"2. Add three config options: \"require_http(s)_confirmation\" and"},{"line_number":22,"context_line":"\"require_email_confirmation\"."},{"line_number":23,"context_line":"3. Add a new property \"confirmed\" to subscription resource for"},{"line_number":24,"context_line":"MongoDB driver."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"7aa08908_479e50b9","line":21,"updated":"2016-06-15 19:17:04.000000000","message":"We have changed to 1 option.","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":18,"context_line":"This patch did:"},{"line_number":19,"context_line":"1. Add v2/queue/\u003cqueue_name\u003e/subscription/\u003csubscription_id\u003e/confirm"},{"line_number":20,"context_line":"endpoint."},{"line_number":21,"context_line":"2. Add three config options: \"require_http(s)_confirmation\" and"},{"line_number":22,"context_line":"\"require_email_confirmation\"."},{"line_number":23,"context_line":"3. Add a new property \"confirmed\" to subscription resource for"},{"line_number":24,"context_line":"MongoDB driver."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"7aa08908_897cc3ec","line":21,"in_reply_to":"7aa08908_479e50b9","updated":"2016-06-16 03:58:57.000000000","message":"Done","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":24,"context_line":"MongoDB driver."},{"line_number":25,"context_line":"4. Add a new policy \"subscription: confirm\"."},{"line_number":26,"context_line":"5. Add a new property \"message type\" for notification."},{"line_number":27,"context_line":"6. Use pre-url in confirm request."},{"line_number":28,"context_line":"8. Re-use POST subscription to allow re-confirm."},{"line_number":29,"context_line":"9. Update notification for webhook subscription with mongoDB."},{"line_number":30,"context_line":"10. Add tests for the feature."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"7aa08908_c791a09c","line":27,"updated":"2016-06-15 19:17:04.000000000","message":"pre-signed url?","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":24,"context_line":"MongoDB driver."},{"line_number":25,"context_line":"4. Add a new policy \"subscription: confirm\"."},{"line_number":26,"context_line":"5. Add a new property \"message type\" for notification."},{"line_number":27,"context_line":"6. Use pre-url in confirm request."},{"line_number":28,"context_line":"8. Re-use POST subscription to allow re-confirm."},{"line_number":29,"context_line":"9. Update notification for webhook subscription with mongoDB."},{"line_number":30,"context_line":"10. Add tests for the feature."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"7aa08908_c9d40bbf","line":27,"in_reply_to":"7aa08908_c791a09c","updated":"2016-06-16 03:58:57.000000000","message":"Done","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"}],"releasenotes/notes/webhook_subscription_confirmation-883cb7f325885ef0.yaml.yaml":[{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5a2c1c554e141c26d3abcd3b6bc8f30be90c8dba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":66,"id":"3ac371cc_82ddd972","updated":"2016-08-15 11:46:44.000000000","message":"Here is one more \u0027yaml\u0027 in name of file.","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5a2c1c554e141c26d3abcd3b6bc8f30be90c8dba","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Now before users send messages to subscribers through a queue, the"},{"line_number":4,"context_line":"    subscribers should be confirmed first. Zaqar only send messages to the"},{"line_number":5,"context_line":"    confirmed subscribers. This feature supports \"webhook\" and \"mailto\""},{"line_number":6,"context_line":"    subscribers with mongoDB or redis backend. The \"mailto\" part will be done"},{"line_number":7,"context_line":"    in O cycle. Set \"require_confirmation \u003d True\" to enable this feature. The"}],"source_content_type":"text/x-yaml","patch_set":66,"id":"3ac371cc_c79fe35d","line":4,"range":{"start_line":4,"start_character":54,"end_line":4,"end_character":58},"updated":"2016-08-15 11:46:44.000000000","message":"send/sends","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"}],"samples/zaqar/subscriber_service_sample.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4771c18b666ee59dd9e965e5d1b33606de4f861f","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def do_get(self):"},{"line_number":31,"context_line":"        logging.warning(\u0027\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d GET \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u0027)"},{"line_number":32,"context_line":"        logging.warning(self.headers)"},{"line_number":33,"context_line":"        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)"}],"source_content_type":"text/x-python","patch_set":49,"id":"1aa78d24_f7fc5e0e","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":14},"updated":"2016-07-14 02:19:38.000000000","message":"do_GET","commit_id":"bf0278cceefabedf8a1e3d97fd2193395eb61fec"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4771c18b666ee59dd9e965e5d1b33606de4f861f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        logging.warning(self.headers)"},{"line_number":33,"context_line":"        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def do_post(self):"},{"line_number":36,"context_line":"        logging.warning(\u0027\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d POST \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u0027)"},{"line_number":37,"context_line":"        logging.warning(self.headers)"},{"line_number":38,"context_line":"        form \u003d cgi.FieldStorage("}],"source_content_type":"text/x-python","patch_set":49,"id":"1aa78d24_170c8a3a","line":35,"range":{"start_line":35,"start_character":8,"end_line":35,"end_character":15},"updated":"2016-07-14 02:19:38.000000000","message":"do_POST\n\nnext patch set will fix this.","commit_id":"bf0278cceefabedf8a1e3d97fd2193395eb61fec"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            logging.warning(self.data)"},{"line_number":51,"context_line":"        else:"},{"line_number":52,"context_line":"            self._send_confirm_request()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _send_confirm_request(self):"},{"line_number":55,"context_line":"        url \u003d self.data[\u0027SubscribeURL\u0027]"},{"line_number":56,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_9981c3fe","line":53,"updated":"2016-08-03 02:25:43.000000000","message":"Add below lines here, otherwise, Zaqar server will get an exception.\n\nmessage \u003d \u0027OK\u0027\nself.send_response(200)\nself.end_headers()\nself.wfile.write(message)\nreturn","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        else:"},{"line_number":52,"context_line":"            self._send_confirm_request()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _send_confirm_request(self):"},{"line_number":55,"context_line":"        url \u003d self.data[\u0027SubscribeURL\u0027]"},{"line_number":56,"context_line":"        headers \u003d {"},{"line_number":57,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_95d071f9","line":54,"updated":"2016-08-03 02:25:43.000000000","message":"It would be nice to print the self.data at here for debug.","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            self._send_confirm_request()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _send_confirm_request(self):"},{"line_number":55,"context_line":"        url \u003d self.data[\u0027SubscribeURL\u0027]"},{"line_number":56,"context_line":"        headers \u003d {"},{"line_number":57,"context_line":"            \u0027Accept\u0027: \u0027application/json\u0027,"},{"line_number":58,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_f5b9edcc","line":55,"updated":"2016-08-03 02:25:43.000000000","message":"This should be updated to \u0027WebSocketSubscribeURL\u0027 or \u0027WSGISubscribeURL\u0027 as well.","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5a2c1c554e141c26d3abcd3b6bc8f30be90c8dba","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    import socketserver as SocketServer"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_AUTO_CONFIRM \u003d True"},{"line_number":27,"context_line":"for arg in sys.argv:"},{"line_number":28,"context_line":"    if arg \u003d\u003d \u0027--auto-confirm\u0027:"},{"line_number":29,"context_line":"        _AUTO_CONFIRM \u003d True"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_87268b14","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":20},"updated":"2016-08-15 11:46:44.000000000","message":"Should it be False by default?","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5d2e2490c1bee72d7a6a3cd314fb66a96a978dac","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    import socketserver as SocketServer"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_AUTO_CONFIRM \u003d True"},{"line_number":27,"context_line":"for arg in sys.argv:"},{"line_number":28,"context_line":"    if arg \u003d\u003d \u0027--auto-confirm\u0027:"},{"line_number":29,"context_line":"        _AUTO_CONFIRM \u003d True"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_a14d429b","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":20},"in_reply_to":"3ac371cc_297f97ab","updated":"2016-08-16 08:46:17.000000000","message":"I mean here is logic error, we should init _AUTO_CONFIRM \u003d False, and set it True if user specifies --auto-confirm then it will be True.","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"0d6676cbb925666d486d668a7d605ae4d215866b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    import socketserver as SocketServer"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"_AUTO_CONFIRM \u003d True"},{"line_number":27,"context_line":"for arg in sys.argv:"},{"line_number":28,"context_line":"    if arg \u003d\u003d \u0027--auto-confirm\u0027:"},{"line_number":29,"context_line":"        _AUTO_CONFIRM \u003d True"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_297f97ab","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":20},"in_reply_to":"3ac371cc_87268b14","updated":"2016-08-15 17:55:51.000000000","message":"I think it doesn\u0027t matter, given it\u0027s a sample server for reference. And I think auto-confirm make it easy for a quick running.","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"}],"zaqar/common/auth.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"983705ec6b56290f0ead59817abe78675a5a377f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"KEYSTONE_AUTHTOKEN_GROUP \u003d \u0027keystone_authtoken\u0027"},{"line_number":25,"context_line":"loading.register_auth_conf_options(cfg.CONF, TRUSTEE_CONF_GROUP)"},{"line_number":26,"context_line":"loading.register_auth_conf_options(cfg.CONF, KEYSTONE_AUTHTOKEN_GROUP)"},{"line_number":27,"context_line":"_ENDPOINT \u003d {}"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _config_options():"}],"source_content_type":"text/x-python","patch_set":60,"id":"bacf61ea_87a2b249","line":27,"updated":"2016-08-04 19:32:19.000000000","message":"(nit): How about renaming it as \u0027_ZAQAR_ENDPOINTS\u0027?","commit_id":"6210408d29cad6aa7f0bae693646ef81ba9fc297"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5a2c1c554e141c26d3abcd3b6bc8f30be90c8dba","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def get_public_endpoint():"},{"line_number":73,"context_line":"    \"\"\"Get Zaqar\u0027s public endpoint from keystone\"\"\""},{"line_number":74,"context_line":"    global _ZAQAR_ENDPOINTS"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    if _ZAQAR_ENDPOINTS:"},{"line_number":77,"context_line":"        return _ZAQAR_ENDPOINTS"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_c7e523a9","line":74,"range":{"start_line":74,"start_character":4,"end_line":74,"end_character":27},"updated":"2016-08-15 11:46:44.000000000","message":"Why we use global here, why not in line 27?","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"},{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5d2e2490c1bee72d7a6a3cd314fb66a96a978dac","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def get_public_endpoint():"},{"line_number":73,"context_line":"    \"\"\"Get Zaqar\u0027s public endpoint from keystone\"\"\""},{"line_number":74,"context_line":"    global _ZAQAR_ENDPOINTS"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    if _ZAQAR_ENDPOINTS:"},{"line_number":77,"context_line":"        return _ZAQAR_ENDPOINTS"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_047d446e","line":74,"range":{"start_line":74,"start_character":4,"end_line":74,"end_character":27},"in_reply_to":"3ac371cc_341b6a74","updated":"2016-08-16 08:46:17.000000000","message":"You\u0027re right, I make misunderstanding here.","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"0d6676cbb925666d486d668a7d605ae4d215866b","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"def get_public_endpoint():"},{"line_number":73,"context_line":"    \"\"\"Get Zaqar\u0027s public endpoint from keystone\"\"\""},{"line_number":74,"context_line":"    global _ZAQAR_ENDPOINTS"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    if _ZAQAR_ENDPOINTS:"},{"line_number":77,"context_line":"        return _ZAQAR_ENDPOINTS"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_341b6a74","line":74,"range":{"start_line":74,"start_character":4,"end_line":74,"end_character":27},"in_reply_to":"3ac371cc_c7e523a9","updated":"2016-08-15 17:55:51.000000000","message":"I don\u0027t really understand this question. _ZAQAR_ENDPOINTS is a global variable and we need to declare it\u0027s global before setting values for it.","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"}],"zaqar/common/configs.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"59188d9a844fbd64ec01f0140a8586c0e850432d","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"_SIGNED_URL_OPTIONS \u003d ("},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027secret_key\u0027, default\u003dNone,"},{"line_number":51,"context_line":"               help\u003d\u0027Secret key used to encrypt pre-signed URLs.\u0027),"},{"line_number":52,"context_line":")"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_8c1b12ca","line":50,"updated":"2016-08-04 01:51:56.000000000","message":"Why do we need this change?","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7000d17db01239e577afb78091c1a78a63af7f","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"_SIGNED_URL_OPTIONS \u003d ("},{"line_number":50,"context_line":"    cfg.StrOpt(\u0027secret_key\u0027, default\u003dNone,"},{"line_number":51,"context_line":"               help\u003d\u0027Secret key used to encrypt pre-signed URLs.\u0027),"},{"line_number":52,"context_line":")"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_01787c2a","line":50,"in_reply_to":"bacf61ea_8c1b12ca","updated":"2016-08-04 03:15:19.000000000","message":"I forgot to remove it.","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"983705ec6b56290f0ead59817abe78675a5a377f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    cfg.IntOpt(\u0027max_notifier_workers\u0027, default\u003d10,"},{"line_number":62,"context_line":"               help\u003d\u0027The max amount of the notification workers.\u0027),"},{"line_number":63,"context_line":"    cfg.BoolOpt(\u0027require_confirmation\u0027, default\u003dFalse,"},{"line_number":64,"context_line":"                help\u003d\u0027Whether the http/https/email subscription need be \u0027"},{"line_number":65,"context_line":"                     \u0027confirmed before \u0027"},{"line_number":66,"context_line":"                     \u0027notification.\u0027),"},{"line_number":67,"context_line":")"}],"source_content_type":"text/x-python","patch_set":60,"id":"bacf61ea_47bf1a60","line":64,"range":{"start_line":64,"start_character":64,"end_line":64,"end_character":71},"updated":"2016-08-04 19:32:19.000000000","message":"(nit): need to be?","commit_id":"6210408d29cad6aa7f0bae693646ef81ba9fc297"}],"zaqar/notification/notifier.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                        # the confirm feature be introduced into Zaqar. We"},{"line_number":60,"context_line":"                        # should allow them be subscribed."},{"line_number":61,"context_line":"                        if (self.require_confirmation and"},{"line_number":62,"context_line":"                                not sub.get(\u0027confirmed\u0027, True)):"},{"line_number":63,"context_line":"                            LOG.info(_LI(\u0027The subscriber %s is not \u0027"},{"line_number":64,"context_line":"                                         \u0027confirmed.\u0027), sub[\u0027subscriber\u0027])"},{"line_number":65,"context_line":"                            continue"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_a7245460","line":62,"updated":"2016-06-15 19:17:04.000000000","message":"Why the default value for confirmed is True?","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                        # the confirm feature be introduced into Zaqar. We"},{"line_number":60,"context_line":"                        # should allow them be subscribed."},{"line_number":61,"context_line":"                        if (self.require_confirmation and"},{"line_number":62,"context_line":"                                not sub.get(\u0027confirmed\u0027, True)):"},{"line_number":63,"context_line":"                            LOG.info(_LI(\u0027The subscriber %s is not \u0027"},{"line_number":64,"context_line":"                                         \u0027confirmed.\u0027), sub[\u0027subscriber\u0027])"},{"line_number":65,"context_line":"                            continue"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_29c94f5b","line":62,"in_reply_to":"7aa08908_a7245460","updated":"2016-06-16 03:58:57.000000000","message":"I explained in the comment above:\n# If the subscriber doesn\u0027t contain \u0027confirmed\u0027, it\n# means that this kind of subscriber was created before\n# the confirm feature be introduced into Zaqar. We\n# should allow them be subscribed.","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                         \u0027confirmed.\u0027), sub[\u0027subscriber\u0027])"},{"line_number":65,"context_line":"                            continue"},{"line_number":66,"context_line":"                        for msg in messages:"},{"line_number":67,"context_line":"                            msg[\u0027Message_Type\u0027] \u003d _MESSAGE_TYPE[2]"},{"line_number":68,"context_line":"                        self._execute(s_type, sub, messages)"},{"line_number":69,"context_line":"                    marker \u003d next(subscribers)"},{"line_number":70,"context_line":"                    if not marker:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_478bf01e","line":67,"updated":"2016-06-15 19:17:04.000000000","message":"(nit): Using dict at here is not a good idea, IMHO. How about this way? https://github.com/openstack/zaqar/blob/master/zaqar/storage/base.py#L44","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                                         \u0027confirmed.\u0027), sub[\u0027subscriber\u0027])"},{"line_number":65,"context_line":"                            continue"},{"line_number":66,"context_line":"                        for msg in messages:"},{"line_number":67,"context_line":"                            msg[\u0027Message_Type\u0027] \u003d _MESSAGE_TYPE[2]"},{"line_number":68,"context_line":"                        self._execute(s_type, sub, messages)"},{"line_number":69,"context_line":"                    marker \u003d next(subscribers)"},{"line_number":70,"context_line":"                    if not marker:"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_a9b41fd4","line":67,"in_reply_to":"7aa08908_478bf01e","updated":"2016-06-16 03:58:57.000000000","message":"A nice way. Thanks","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            LOG.error(_LE(\"Can\u0027t send confirm notification due to the value of\""},{"line_number":80,"context_line":"                          \" secret_key option is None\"))"},{"line_number":81,"context_line":"            return"},{"line_number":82,"context_line":"        url \u003d [\"/v2/queues/%s/subscriptions/%s/confirm\" % (queue,"},{"line_number":83,"context_line":"                                                           subscription[\u0027id\u0027])]"},{"line_number":84,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":85,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027POST\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_e7a13c97","line":82,"updated":"2016-06-15 19:17:04.000000000","message":"Do have have to include the api version at here? The code at here is common code.","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            LOG.error(_LE(\"Can\u0027t send confirm notification due to the value of\""},{"line_number":80,"context_line":"                          \" secret_key option is None\"))"},{"line_number":81,"context_line":"            return"},{"line_number":82,"context_line":"        url \u003d [\"/v2/queues/%s/subscriptions/%s/confirm\" % (queue,"},{"line_number":83,"context_line":"                                                           subscription[\u0027id\u0027])]"},{"line_number":84,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":85,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027POST\u0027])"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_692eb7a6","line":82,"in_reply_to":"7aa08908_e7a13c97","updated":"2016-06-16 03:58:57.000000000","message":"this url means \"SubscribeURL\" and will be sent to the subscriber. the subscriber use this url to visit zaqar.\nSo it should contain api version and be like:\nhttps://zaqar_server/v2/queues/{queue_name}/subscriptions/{subscriptions_id}/confirm\n\nwe could pass the api version to the storage layer to avoid hard code here.","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"5df51d38e36e594361abb3627cef9a5d332fdec9","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # TODO(wangxiyuan): Make ip and port variable to satisfy both wsgi and"},{"line_number":99,"context_line":"        # websocket."},{"line_number":100,"context_line":"        ip \u003d socket.gethostbyname(socket.gethostname())"},{"line_number":101,"context_line":"        port \u003d 8888"},{"line_number":102,"context_line":"        subscribe_url \u003d \"http://{0}:{1}{2}\".format(str(ip), str(port), url[0])"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"dada55a8_922ffda0","line":100,"updated":"2016-07-18 03:24:45.000000000","message":"Could we avoid exposing IP address? It\u0027s not acceptable by operators. Thanks.","commit_id":"f275d73bc39e05b68d0af3920b4c3adadb9189a9"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"5df51d38e36e594361abb3627cef9a5d332fdec9","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # TODO(wangxiyuan): Make ip and port variable to satisfy both wsgi and"},{"line_number":99,"context_line":"        # websocket."},{"line_number":100,"context_line":"        ip \u003d socket.gethostbyname(socket.gethostname())"},{"line_number":101,"context_line":"        port \u003d 8888"},{"line_number":102,"context_line":"        subscribe_url \u003d \"http://{0}:{1}{2}\".format(str(ip), str(port), url[0])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        messages \u003d [{\u0027Message_Type\u0027: message_type,"}],"source_content_type":"text/x-python","patch_set":51,"id":"dada55a8_322291ba","line":101,"updated":"2016-07-18 03:24:45.000000000","message":"It\u0027s not acceptable to have a hardcode port in code","commit_id":"f275d73bc39e05b68d0af3920b4c3adadb9189a9"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        websocket_subscribe_url \u003d url"},{"line_number":101,"context_line":"        endpoint_dict \u003d auth.get_public_endpoint()"},{"line_number":102,"context_line":"        if endpoint_dict:"},{"line_number":103,"context_line":"            wsgi_subscribe_url \u003d \"http://{0}{1}\".format("},{"line_number":104,"context_line":"                endpoint_dict.get(\u0027zaqar\u0027, ), url[0])"},{"line_number":105,"context_line":"            websocket_subscribe_url \u003d \"http://{0}{1}\".format("},{"line_number":106,"context_line":"                endpoint_dict.get(\u0027zaqar-websocket\u0027), url[0])"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_9501913c","line":103,"updated":"2016-08-03 02:25:43.000000000","message":"1. I think it\u0027s not correct since you can\u0027t hard code the protocol. Given you have got the endpoint from catalog, I don\u0027t think it\u0027s necessary to hard the protocol here.\n\n2. And it\u0027s better to use urljoin, instead of doing the join like this way.","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        if endpoint_dict:"},{"line_number":103,"context_line":"            wsgi_subscribe_url \u003d \"http://{0}{1}\".format("},{"line_number":104,"context_line":"                endpoint_dict.get(\u0027zaqar\u0027, ), url[0])"},{"line_number":105,"context_line":"            websocket_subscribe_url \u003d \"http://{0}{1}\".format("},{"line_number":106,"context_line":"                endpoint_dict.get(\u0027zaqar-websocket\u0027), url[0])"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        messages \u003d [{\u0027Message_Type\u0027: message_type,"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_d5fb0946","line":105,"updated":"2016-08-03 02:25:43.000000000","message":"ditto","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08f8d07c8d0156d68a37c864997803980d0a5a7","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                     \u0027URL-Paths\u0027: pre_url[\u0027paths\u0027][0],"},{"line_number":114,"context_line":"                     \u0027X-Project-ID\u0027: pre_url[\u0027project\u0027],"},{"line_number":115,"context_line":"                     \u0027URL-Expires\u0027: pre_url[\u0027expires\u0027],"},{"line_number":116,"context_line":"                     \u0027WSGISubscribeURL\u0027: wsgi_subscribe_url,"},{"line_number":117,"context_line":"                     \u0027WebSocketSubscribeURL\u0027: websocket_subscribe_url,"},{"line_number":118,"context_line":"                     \u0027SubscribeBody\u0027: {\u0027confirmed\u0027: True},"},{"line_number":119,"context_line":"                     \u0027UnsubscribeBody\u0027: {\u0027confirmed\u0027: False}"}],"source_content_type":"text/x-python","patch_set":54,"id":"bacf61ea_3548a587","line":116,"updated":"2016-08-03 02:25:43.000000000","message":"What happened if there is no wsgi or websocket? So we\u0027d better add those subscribeURL depending on if we can get them.","commit_id":"8e7dd34248dcd9b15c4b3db50c63bf226a1ebd27"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"59188d9a844fbd64ec01f0140a8586c0e850432d","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                            continue"},{"line_number":74,"context_line":"                        for msg in messages:"},{"line_number":75,"context_line":"                            msg[\u0027Message_Type\u0027] \u003d str("},{"line_number":76,"context_line":"                                self.message_type.Notification).split(\u0027.\u0027)[-1]"},{"line_number":77,"context_line":"                        self._execute(s_type, sub, messages)"},{"line_number":78,"context_line":"                    marker \u003d next(subscribers)"},{"line_number":79,"context_line":"                    if not marker:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_9b9b3bc9","line":76,"updated":"2016-08-04 01:51:56.000000000","message":"You can just use self.message_type.Notification.name","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7000d17db01239e577afb78091c1a78a63af7f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                            continue"},{"line_number":74,"context_line":"                        for msg in messages:"},{"line_number":75,"context_line":"                            msg[\u0027Message_Type\u0027] \u003d str("},{"line_number":76,"context_line":"                                self.message_type.Notification).split(\u0027.\u0027)[-1]"},{"line_number":77,"context_line":"                        self._execute(s_type, sub, messages)"},{"line_number":78,"context_line":"                    marker \u003d next(subscribers)"},{"line_number":79,"context_line":"                    if not marker:"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_f33a5bcc","line":76,"in_reply_to":"bacf61ea_9b9b3bc9","updated":"2016-08-04 03:15:19.000000000","message":"Sure","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"59188d9a844fbd64ec01f0140a8586c0e850432d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":94,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027PUT\u0027])"},{"line_number":95,"context_line":"        message_type \u003d str("},{"line_number":96,"context_line":"            self.message_type.SubscriptionConfirmation).split(\u0027.\u0027)[-1]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # TODO(wangxiyuan): Make address and port variable and configable."},{"line_number":99,"context_line":"        wsgi_subscribe_url \u003d url[0]"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_db6e53c8","line":96,"updated":"2016-08-04 01:51:56.000000000","message":"You can just use self.message_type.SubscriptionConfirmation.name","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7000d17db01239e577afb78091c1a78a63af7f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":94,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027PUT\u0027])"},{"line_number":95,"context_line":"        message_type \u003d str("},{"line_number":96,"context_line":"            self.message_type.SubscriptionConfirmation).split(\u0027.\u0027)[-1]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # TODO(wangxiyuan): Make address and port variable and configable."},{"line_number":99,"context_line":"        wsgi_subscribe_url \u003d url[0]"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_d33597db","line":96,"in_reply_to":"bacf61ea_db6e53c8","updated":"2016-08-04 03:15:19.000000000","message":"Sure","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"59188d9a844fbd64ec01f0140a8586c0e850432d","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                     \u0027X-Project-ID\u0027: pre_url[\u0027project\u0027],"},{"line_number":119,"context_line":"                     \u0027URL-Expires\u0027: pre_url[\u0027expires\u0027],"},{"line_number":120,"context_line":"                     \u0027WSGISubscribeURL\u0027: wsgi_subscribe_url,"},{"line_number":121,"context_line":"                     \u0027WebSocketSubscribeURL\u0027: websocket_subscribe_url,"},{"line_number":122,"context_line":"                     \u0027SubscribeBody\u0027: {\u0027confirmed\u0027: True},"},{"line_number":123,"context_line":"                     \u0027UnsubscribeBody\u0027: {\u0027confirmed\u0027: False}"},{"line_number":124,"context_line":"                     }]"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_acf25698","line":121,"updated":"2016-08-04 01:51:56.000000000","message":"As I asked in ps54, what happened if there is no wsgi or websocket? So we\u0027d better add those subscribeURL depending on if we can get them. Thoughts? Otherwise, user may get url[0] and failed to access zaqar server.","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7000d17db01239e577afb78091c1a78a63af7f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                     \u0027X-Project-ID\u0027: pre_url[\u0027project\u0027],"},{"line_number":119,"context_line":"                     \u0027URL-Expires\u0027: pre_url[\u0027expires\u0027],"},{"line_number":120,"context_line":"                     \u0027WSGISubscribeURL\u0027: wsgi_subscribe_url,"},{"line_number":121,"context_line":"                     \u0027WebSocketSubscribeURL\u0027: websocket_subscribe_url,"},{"line_number":122,"context_line":"                     \u0027SubscribeBody\u0027: {\u0027confirmed\u0027: True},"},{"line_number":123,"context_line":"                     \u0027UnsubscribeBody\u0027: {\u0027confirmed\u0027: False}"},{"line_number":124,"context_line":"                     }]"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_1330cfe7","line":121,"in_reply_to":"bacf61ea_acf25698","updated":"2016-08-04 03:15:19.000000000","message":"OK, will update it later","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"983705ec6b56290f0ead59817abe78675a5a377f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        max_workers \u003d kwargs.get(\u0027max_notifier_workers\u0027, 10)"},{"line_number":48,"context_line":"        self.executor \u003d futurist.ThreadPoolExecutor(max_workers\u003dmax_workers)"},{"line_number":49,"context_line":"        self.require_confirmation \u003d kwargs.get(\u0027require_confirmation\u0027, False)"},{"line_number":50,"context_line":"        self.message_type \u003d MessageType"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def post(self, queue_name, messages, client_uuid, project\u003dNone):"},{"line_number":53,"context_line":"        \"\"\"Send messages to the subscribers.\"\"\""}],"source_content_type":"text/x-python","patch_set":60,"id":"bacf61ea_e7dd6e71","line":50,"updated":"2016-08-04 19:32:19.000000000","message":"I can\u0027t see a benefit to create an instance of MessageType. Why not just use MessageType.Notification.name at line 76?","commit_id":"6210408d29cad6aa7f0bae693646ef81ba9fc297"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"983705ec6b56290f0ead59817abe78675a5a377f","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            LOG.error(_LE(\"Can\u0027t send confirm notification due to the value of\""},{"line_number":89,"context_line":"                          \" secret_key option is None\"))"},{"line_number":90,"context_line":"            return"},{"line_number":91,"context_line":"        url \u003d [\"/v2/queues/%s/subscriptions/%s/confirm\" % (queue,"},{"line_number":92,"context_line":"                                                           subscription[\u0027id\u0027])]"},{"line_number":93,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":94,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027PUT\u0027])"}],"source_content_type":"text/x-python","patch_set":60,"id":"bacf61ea_e7c44e93","line":91,"updated":"2016-08-04 19:32:19.000000000","message":"Unfortunately, we need a better way to handle the version instead of hardcode.","commit_id":"6210408d29cad6aa7f0bae693646ef81ba9fc297"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"5e5707bdeb7cda85420535ae79df1ffabf99c8a8","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            return"},{"line_number":90,"context_line":"        url \u003d [\"/%s/queues/%s/subscriptions/%s/confirm\" % (api_version, queue,"},{"line_number":91,"context_line":"                                                           subscription[\u0027id\u0027])]"},{"line_number":92,"context_line":"        pre_url \u003d urls.create_signed_url(key, url, project\u003dproject,"},{"line_number":93,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027PUT\u0027])"},{"line_number":94,"context_line":"        message_type \u003d MessageType.SubscriptionConfirmation.name"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":64,"id":"9ad45d7e_98e89d7e","line":92,"updated":"2016-08-09 03:37:47.000000000","message":"(nit): Instead of define the url as a list, why not define it as a string and then then at below lines you don\u0027t have to refer it as url[0], and at line 92, you just need to do [url]. IMHO, that\u0027s more tidy.","commit_id":"7eda9b85ab69bd5babf58041c24cd10c0464a99a"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"5e5707bdeb7cda85420535ae79df1ffabf99c8a8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                                         expires\u003dexpires, methods\u003d[\u0027PUT\u0027])"},{"line_number":94,"context_line":"        message_type \u003d MessageType.SubscriptionConfirmation.name"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        # TODO(wangxiyuan): Make address and port variable and configable."},{"line_number":97,"context_line":"        messages \u003d [{}]"},{"line_number":98,"context_line":"        endpoint_dict \u003d auth.get_public_endpoint()"},{"line_number":99,"context_line":"        if endpoint_dict:"}],"source_content_type":"text/x-python","patch_set":64,"id":"9ad45d7e_d8b0558e","line":96,"updated":"2016-08-09 03:37:47.000000000","message":"Do we still need this TODO?","commit_id":"7eda9b85ab69bd5babf58041c24cd10c0464a99a"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"5e5707bdeb7cda85420535ae79df1ffabf99c8a8","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                            \u0027URL-Expires\u0027: pre_url[\u0027expires\u0027],"},{"line_number":119,"context_line":"                            \u0027SubscribeBody\u0027: {\u0027confirmed\u0027: True},"},{"line_number":120,"context_line":"                            \u0027UnsubscribeBody\u0027: {\u0027confirmed\u0027: False}})"},{"line_number":121,"context_line":"        s_type \u003d urllib_parse.urlparse(subscription[\u0027subscriber\u0027]).scheme"},{"line_number":122,"context_line":"        self._execute(s_type, subscription, messages, conf)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def _execute(self, s_type, subscription, messages, conf\u003dNone):"}],"source_content_type":"text/x-python","patch_set":64,"id":"9ad45d7e_d80cd544","line":121,"updated":"2016-08-09 03:37:47.000000000","message":"Could we add a debug log around here? Since it\u0027s a complex logic after introduced the confirmation. And it could be difficult to debug if there is any problem.","commit_id":"7eda9b85ab69bd5babf58041c24cd10c0464a99a"}],"zaqar/notification/tasks/webhook.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                # NOTE(Eva-i): Unfortunately this will add \u0027queue_name\u0027 key to"},{"line_number":31,"context_line":"                # our original messages(dicts) which will be later consumed in"},{"line_number":32,"context_line":"                # the storage controller. It seems safe though."},{"line_number":33,"context_line":"                msg[\u0027Queue_Name\u0027] \u003d subscription[\u0027source\u0027]"},{"line_number":34,"context_line":"                requests.post(subscription[\u0027subscriber\u0027],"},{"line_number":35,"context_line":"                              data\u003djson.dumps(msg),"},{"line_number":36,"context_line":"                              headers\u003d{\u0027Content-Type\u0027: \u0027application/json\u0027})"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_a70a9477","line":33,"updated":"2016-06-15 19:17:04.000000000","message":"Why do we have to change the case? IMHO, it\u0027s not a best practice to use upper case in response body.","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                # NOTE(Eva-i): Unfortunately this will add \u0027queue_name\u0027 key to"},{"line_number":31,"context_line":"                # our original messages(dicts) which will be later consumed in"},{"line_number":32,"context_line":"                # the storage controller. It seems safe though."},{"line_number":33,"context_line":"                msg[\u0027Queue_Name\u0027] \u003d subscription[\u0027source\u0027]"},{"line_number":34,"context_line":"                requests.post(subscription[\u0027subscriber\u0027],"},{"line_number":35,"context_line":"                              data\u003djson.dumps(msg),"},{"line_number":36,"context_line":"                              headers\u003d{\u0027Content-Type\u0027: \u0027application/json\u0027})"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_efbf47fa","line":33,"in_reply_to":"7aa08908_a70a9477","updated":"2016-06-16 03:58:57.000000000","message":"Done","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"}],"zaqar/storage/mongodb/subscriptions.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"28de80805b07184ed302329948a2973028476569","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                \u0027subscriber\u0027: record[\u0027u\u0027],"},{"line_number":89,"context_line":"                \u0027ttl\u0027: record[\u0027t\u0027],"},{"line_number":90,"context_line":"                \u0027options\u0027: record[\u0027o\u0027],"},{"line_number":91,"context_line":"                \u0027is_confirmed\u0027: is_confirmed"},{"line_number":92,"context_line":"            }"},{"line_number":93,"context_line":"            marker_name[\u0027next\u0027] \u003d record[\u0027_id\u0027]"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"9abb7d3a_2b6fd0fc","line":91,"updated":"2016-06-03 03:13:56.000000000","message":"Let\u0027s use \u0027confirmed\u0027.","commit_id":"9036f27c99d8151c9e7a6a55c6db87ad33f2be1e"}],"zaqar/tests/tempest_plugin/tests/v2/test_subscriptions.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"fa3b5c38380e98463bea29ea90ededefbc422cde","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        expected \u003d message_body[\u0027messages\u0027][0]"},{"line_number":120,"context_line":"        expected[\u0027queue_name\u0027] \u003d self.queue_name"},{"line_number":121,"context_line":"        expected[\u0027Message_Type\u0027] \u003d \u0027Notification\u0027"},{"line_number":122,"context_line":"        self.assertEqual(expected, messages[1][\u0027messages\u0027][1][\u0027body\u0027])"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def resource_cleanup(cls):"}],"source_content_type":"text/x-python","patch_set":49,"id":"1aa78d24_f74a9e5a","line":122,"range":{"start_line":122,"start_character":7,"end_line":122,"end_character":70},"updated":"2016-07-14 02:21:46.000000000","message":"need find a better way, because there are two messages in the queue, one is confirm infommation, the other one is the message.","commit_id":"bf0278cceefabedf8a1e3d97fd2193395eb61fec"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"fd923055202e7fedc072fc3fdcb2481f3391db24","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @decorators.idempotent_id()"},{"line_number":129,"context_line":"    def test_subscription_confirm(self):"},{"line_number":130,"context_line":"        pass"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @classmethod"},{"line_number":133,"context_line":"    def resource_cleanup(cls):"}],"source_content_type":"text/x-python","patch_set":53,"id":"dada55a8_9402373d","line":130,"updated":"2016-07-18 12:43:16.000000000","message":"It\u0027s hard for me to write this test. Because the confirm test need the config option \"require_confirm\u003dTrue\" which is \"False\" at this moment.\nAny idea?","commit_id":"fb221801e128fdc1460ed8e56bcbb40511509569"},{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"d08d128d64549cea64ecccb68423068f83403503","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @decorators.idempotent_id()"},{"line_number":129,"context_line":"    def test_subscription_confirm(self):"},{"line_number":130,"context_line":"        pass"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    @classmethod"},{"line_number":133,"context_line":"    def resource_cleanup(cls):"}],"source_content_type":"text/x-python","patch_set":53,"id":"dada55a8_dfacacef","line":130,"in_reply_to":"dada55a8_9402373d","updated":"2016-07-18 21:43:39.000000000","message":"I would suggest ask it in tempest channel, I\u0027m not sure how to change it dynamically. Sorry.","commit_id":"fb221801e128fdc1460ed8e56bcbb40511509569"}],"zaqar/tests/unit/notification/test_notifier.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"fdcd4af818563b707d629313ca8145221117c6f5","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                       \u0027URL-Expires\u0027, \u0027Message_Type\u0027, \u0027SubscribeURL\u0027]"},{"line_number":242,"context_line":"        self.assertEqual(expect_args.sort(),"},{"line_number":243,"context_line":"                         json.loads("},{"line_number":244,"context_line":"                             mock_request.call_args[1][\u0027data\u0027]).keys().sort())"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    @mock.patch(\u0027requests.post\u0027)"},{"line_number":247,"context_line":"    def test_send_confirm_notification_without_signed_url(self, mock_request):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_a7073417","line":244,"updated":"2016-06-15 19:17:04.000000000","message":"This case failed because Python 3 getting the keys() of a dict returns a dict_keys object instead of a list. So replace mock_request.call_args[1][\u0027data\u0027]).keys() with list(mock_request.call_args[1][\u0027data\u0027]).keys())","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a737889f6eb0986d63f132665ffd81d2a24f30ea","unresolved":false,"context_lines":[{"line_number":241,"context_line":"                       \u0027URL-Expires\u0027, \u0027Message_Type\u0027, \u0027SubscribeURL\u0027]"},{"line_number":242,"context_line":"        self.assertEqual(expect_args.sort(),"},{"line_number":243,"context_line":"                         json.loads("},{"line_number":244,"context_line":"                             mock_request.call_args[1][\u0027data\u0027]).keys().sort())"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    @mock.patch(\u0027requests.post\u0027)"},{"line_number":247,"context_line":"    def test_send_confirm_notification_without_signed_url(self, mock_request):"}],"source_content_type":"text/x-python","patch_set":33,"id":"7aa08908_ef9e2753","line":244,"in_reply_to":"7aa08908_a7073417","updated":"2016-06-16 03:58:57.000000000","message":"Done","commit_id":"b21999036d1ab49d566182bbe1edbdaa3cc2bf1c"}],"zaqar/tests/unit/storage/test_impl_mongodb.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"59188d9a844fbd64ec01f0140a8586c0e850432d","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.subscription_controller.confirm(self.source, s_id1,"},{"line_number":545,"context_line":"                                             project\u003dself.project,"},{"line_number":546,"context_line":"                                             confirm\u003dTrue)"},{"line_number":547,"context_line":"        s_id2 \u003d self.subscription_controller.create(self.source,"},{"line_number":548,"context_line":"                                                    self.subscriber,"},{"line_number":549,"context_line":"                                                    self.ttl,"},{"line_number":550,"context_line":"                                                    self.options,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_6fca091c","line":547,"updated":"2016-08-04 01:51:56.000000000","message":"So if user try to recreate a subscription which has been confirmed, zaqar will do nothing, right? Then what\u0027s the response code? 204?","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"da7000d17db01239e577afb78091c1a78a63af7f","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.subscription_controller.confirm(self.source, s_id1,"},{"line_number":545,"context_line":"                                             project\u003dself.project,"},{"line_number":546,"context_line":"                                             confirm\u003dTrue)"},{"line_number":547,"context_line":"        s_id2 \u003d self.subscription_controller.create(self.source,"},{"line_number":548,"context_line":"                                                    self.subscriber,"},{"line_number":549,"context_line":"                                                    self.ttl,"},{"line_number":550,"context_line":"                                                    self.options,"}],"source_content_type":"text/x-python","patch_set":57,"id":"bacf61ea_b320e39c","line":547,"in_reply_to":"bacf61ea_6fca091c","updated":"2016-08-04 03:15:19.000000000","message":"No, this test is for db layer. See L552, it returns None at db layer.\nhttps://github.com/openstack/zaqar/blob/master/zaqar/storage/mongodb/subscriptions.py#L116\n\nAt api layer, it will return 409 error.\nhttps://github.com/openstack/zaqar/blob/master/zaqar/transport/wsgi/v2_0/subscriptions.py#L209-L213","commit_id":"334108ee7d11e227eb7ebe53a5c2161ac3172d63"}],"zaqar/tests/unit/transport/wsgi/v2_0/test_subscriptions.py":[{"author":{"_account_id":8846,"name":"Hao Wang","display_name":"Hao Wang","email":"sxmatch1986@gmail.com","username":"sxmatch"},"change_message_id":"5a2c1c554e141c26d3abcd3b6bc8f30be90c8dba","unresolved":false,"context_lines":[{"line_number":409,"context_line":"        self.assertEqual(falcon.HTTP_204, self.srmock.status)"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_confirm_with_invalid_body(self):"},{"line_number":412,"context_line":"        doc \u003d \u0027{confirmed:123}\u0027"},{"line_number":413,"context_line":"        resp \u003d self.simulate_put(self.confirm_path, body\u003ddoc,"},{"line_number":414,"context_line":"                                 headers\u003dself.headers)"},{"line_number":415,"context_line":"        self.assertEqual(falcon.HTTP_400, self.srmock.status)"}],"source_content_type":"text/x-python","patch_set":66,"id":"3ac371cc_6709cf31","line":412,"range":{"start_line":412,"start_character":14,"end_line":412,"end_character":31},"updated":"2016-08-15 11:46:44.000000000","message":"\u0027{\"confirmed\": 123}\u0027","commit_id":"6ddf0789cb4fcb0f981f18a2474487652a45d4f5"}],"zaqar/transport/validation.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"6ac26c45cd84b0aa53837fa49f66488300b26428","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                now_dt + datetime.timedelta(seconds\u003dttl)"},{"line_number":539,"context_line":"            except OverflowError:"},{"line_number":540,"context_line":"                raise ValidationFailed(msg, datetime.datetime.max)"},{"line_number":541,"context_line":"        confirm \u003d subscription.get(\u0027confirm\u0027, None)"},{"line_number":542,"context_line":"        if confirm is not None and not isinstance(confirm, bool):"},{"line_number":543,"context_line":"            msg \u003d _(u\u0027The confirm should be boolean\u0027)"},{"line_number":544,"context_line":"            raise ValidationFailed(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_4a1d2061","line":541,"updated":"2016-05-16 22:04:40.000000000","message":"Sorry for jumping in a patch which is still in WIP status, but I just found something is wrong. I think we basically have an agreement for adding a new endpoint, see https://review.openstack.org/#/c/284555/14/specs/newton/subscription-confirmation-support.rst L95, instead of add a new property for the body of subscription patching. are we on the same page?","commit_id":"1ff5b3231489cc52650fa237506abc74eb88ecb5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3b09cda26a27e7d589bc3bcfbae635127a73de9b","unresolved":false,"context_lines":[{"line_number":538,"context_line":"                now_dt + datetime.timedelta(seconds\u003dttl)"},{"line_number":539,"context_line":"            except OverflowError:"},{"line_number":540,"context_line":"                raise ValidationFailed(msg, datetime.datetime.max)"},{"line_number":541,"context_line":"        confirm \u003d subscription.get(\u0027confirm\u0027, None)"},{"line_number":542,"context_line":"        if confirm is not None and not isinstance(confirm, bool):"},{"line_number":543,"context_line":"            msg \u003d _(u\u0027The confirm should be boolean\u0027)"},{"line_number":544,"context_line":"            raise ValidationFailed(msg)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_f974b09c","line":541,"in_reply_to":"dab17558_4a1d2061","updated":"2016-05-17 01:17:23.000000000","message":"Oh, It\u0027s a silly mistake. Thanks for pointing it out.","commit_id":"1ff5b3231489cc52650fa237506abc74eb88ecb5"}],"zaqar/transport/wsgi/v2_0/subscriptions.py":[{"author":{"_account_id":6484,"name":"Feilong Wang","email":"hustemb@gmail.com","username":"flwang"},"change_message_id":"28de80805b07184ed302329948a2973028476569","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        except storage_errors.SubscriptionDoesNotExist as ex:"},{"line_number":230,"context_line":"            LOG.debug(ex)"},{"line_number":231,"context_line":"            raise wsgi_errors.HTTPNotFound(six.text_type(ex))"},{"line_number":232,"context_line":"        except storage_errors.SubscriptionAlreadyExists as ex:"},{"line_number":233,"context_line":"            LOG.debug(ex)"},{"line_number":234,"context_line":"            raise wsgi_errors.HTTPConflict(six.text_type(ex))"},{"line_number":235,"context_line":"        except validation.ValidationFailed as ex:"}],"source_content_type":"text/x-python","patch_set":20,"id":"9abb7d3a_cb572424","line":232,"updated":"2016-06-03 03:13:56.000000000","message":"Is it possible to get SubscriptionAlreadyExists ?","commit_id":"9036f27c99d8151c9e7a6a55c6db87ad33f2be1e"}]}
