)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"886f9715b5a780c8d661dad666c4f6794259db3f","unresolved":false,"context_lines":[{"line_number":14,"context_line":"This change is required to return \u0027request_id\u0027 from"},{"line_number":15,"context_line":"client to log request_id mappings of cross projects."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements: blueprint return-request-id-to-caller"},{"line_number":18,"context_line":"Change-Id: I3aadb4d8bf675e20f2094b66a23ac20f455a99eb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5a710552_4a2009f8","line":17,"updated":"2015-12-15 01:36:09.000000000","message":"If you have multiple patches implementing the same blueprint, each one should say partial-implements in the commit message:\n\nPartial-Implements: blueprint return-request-id-to-caller\n\nThe last patch can say \"Implements: blueprint return-request-id-to-caller\".","commit_id":"0715f0c9d0207f5d7dd92994f5819359bda06884"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"bc144d372471842e49dfb4d6165c4ddaa5a30347","unresolved":false,"context_lines":[{"line_number":12,"context_line":"received in a header from a response body."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change is required to return \u0027request_id\u0027 from"},{"line_number":15,"context_line":"client to log request_id mappings of cross projects."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Partial-Implements: blueprint return-request-id-to-caller"},{"line_number":18,"context_line":"Change-Id: I3aadb4d8bf675e20f2094b66a23ac20f455a99eb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a57f1b5_af3727af","line":15,"updated":"2016-02-10 15:24:26.000000000","message":"Can you add the following to the commit message of all the patches, so that it is easier for reviewers to see what this is about?\n\nFor more details on how request_id will be returned to the caller, please refer to the approved blueprint [1] discussed with the cross-project team.\n\n[1] : https://review.openstack.org/#/c/156508","commit_id":"1619f11b9c191d44303977fd1b07fea28da9bc7c"}],"cinderclient/openstack/common/apiclient/base.py":[{"author":{"_account_id":10439,"name":"Xi Yang","email":"yang.xi@99cloud.net","username":"phenom"},"change_message_id":"532923eddfaef86822042e5d590f5f5121ee6fce","unresolved":false,"context_lines":[{"line_number":1,"context_line":" # Copyright 2010 Jacob Kaplan-Moss"},{"line_number":2,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":3,"context_line":"# Copyright 2012 Grid Dynamics"},{"line_number":4,"context_line":"# Copyright 2013 OpenStack Foundation"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_364215af","line":1,"updated":"2015-12-14 07:28:41.000000000","message":"This line does not need change","commit_id":"5cb0a0d2b7f0b5b2a26b84fa77d1c0c516988264"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"def8d0bb69640e116c6b3ed193c54b1068c78589","unresolved":false,"context_lines":[{"line_number":1,"context_line":" # Copyright 2010 Jacob Kaplan-Moss"},{"line_number":2,"context_line":"# Copyright 2011 OpenStack Foundation"},{"line_number":3,"context_line":"# Copyright 2012 Grid Dynamics"},{"line_number":4,"context_line":"# Copyright 2013 OpenStack Foundation"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_766bbdf1","line":1,"in_reply_to":"7a740942_364215af","updated":"2015-12-14 07:33:07.000000000","message":"Done","commit_id":"5cb0a0d2b7f0b5b2a26b84fa77d1c0c516988264"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"886f9715b5a780c8d661dad666c4f6794259db3f","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"class RequestIdMixin(object):"},{"line_number":413,"context_line":"    \"\"\"Wrapper class to expose x-openstack-request-id to the caller."},{"line_number":414,"context_line":"    \"\"\""},{"line_number":415,"context_line":"    def setup(self):"},{"line_number":416,"context_line":"        self.x_openstack_request_ids \u003d []"},{"line_number":417,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a710552_0abc416b","line":414,"updated":"2015-12-15 01:36:09.000000000","message":"nit: Please move the closing \"\"\" to the end of the one line docstring.\n\nhttp://docs.openstack.org/developer/hacking/#docstrings","commit_id":"0715f0c9d0207f5d7dd92994f5819359bda06884"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"33212961364a53186331dd5e6633a17d81643416","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        reprkeys \u003d sorted(k"},{"line_number":475,"context_line":"                          for k in self.__dict__.keys()"},{"line_number":476,"context_line":"                          if k[0] !\u003d \u0027_\u0027 and"},{"line_number":477,"context_line":"                          k not in [\u0027manager\u0027, \u0027request_ids\u0027])"},{"line_number":478,"context_line":"        info \u003d \", \".join(\"%s\u003d%s\" % (k, getattr(self, k)) for k in reprkeys)"},{"line_number":479,"context_line":"        return \"\u003c%s %s\u003e\" % (self.__class__.__name__, info)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_ce76a0d6","line":477,"range":{"start_line":477,"start_character":48,"end_line":477,"end_character":59},"updated":"2016-01-24 09:52:21.000000000","message":"\"request_ids\" is a function.\nIMO, self.__dict__.keys() doesn\u0027t contains it(or I miss some special corner cases?).\n\u003e\u003e\u003e class A(object):\n...    def __init__(self):\n...        self.x_openstack_request_ids \u003d \u0027ids\u0027\n...    @property\n...    def request_ids(self):\n...        return self.x_openstack_request_ids\n... \n\u003e\u003e\u003e a \u003d A()\n\u003e\u003e\u003e a.__dict__\n{\u0027x_openstack_request_ids\u0027: \u0027ids\u0027}\n\nMaybe you mean x_openstack_request_ids here?","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d0aa09115ee991d324380365560691e22e2b03aa","unresolved":false,"context_lines":[{"line_number":474,"context_line":"        reprkeys \u003d sorted(k"},{"line_number":475,"context_line":"                          for k in self.__dict__.keys()"},{"line_number":476,"context_line":"                          if k[0] !\u003d \u0027_\u0027 and"},{"line_number":477,"context_line":"                          k not in [\u0027manager\u0027, \u0027request_ids\u0027])"},{"line_number":478,"context_line":"        info \u003d \", \".join(\"%s\u003d%s\" % (k, getattr(self, k)) for k in reprkeys)"},{"line_number":479,"context_line":"        return \"\u003c%s %s\u003e\" % (self.__class__.__name__, info)"},{"line_number":480,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_6bf8b4c3","line":477,"range":{"start_line":477,"start_character":48,"end_line":477,"end_character":59},"in_reply_to":"9a68dd71_ce76a0d6","updated":"2016-01-25 07:03:33.000000000","message":"I will fix it in new PS","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"33212961364a53186331dd5e6633a17d81643416","unresolved":false,"context_lines":[{"line_number":537,"context_line":""},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"class ListWithMeta(list, RequestIdMixin):"},{"line_number":540,"context_line":"    def __init__(self, resp_body, resp):"},{"line_number":541,"context_line":"        super(ListWithMeta, self).__init__(resp_body)"},{"line_number":542,"context_line":"        self.setup()"},{"line_number":543,"context_line":"        self.append_request_ids(resp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_d125e108","line":540,"range":{"start_line":540,"start_character":23,"end_line":540,"end_character":32},"updated":"2016-01-24 09:52:21.000000000","message":"\"values\" may be easier to understand than \"resp_body\"?\nAlso, param passed here seems not always Response.body.","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d0aa09115ee991d324380365560691e22e2b03aa","unresolved":false,"context_lines":[{"line_number":537,"context_line":""},{"line_number":538,"context_line":""},{"line_number":539,"context_line":"class ListWithMeta(list, RequestIdMixin):"},{"line_number":540,"context_line":"    def __init__(self, resp_body, resp):"},{"line_number":541,"context_line":"        super(ListWithMeta, self).__init__(resp_body)"},{"line_number":542,"context_line":"        self.setup()"},{"line_number":543,"context_line":"        self.append_request_ids(resp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_8bdc0847","line":540,"range":{"start_line":540,"start_character":23,"end_line":540,"end_character":32},"in_reply_to":"9a68dd71_d125e108","updated":"2016-01-25 07:03:33.000000000","message":"I will fix it in new PS.","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":1207,"name":"Duncan Thomas","email":"duncan.thomas@gmail.com","username":"duncan-thomas"},"change_message_id":"4740f8eceaff96bdd80b2974b818fb34f446abd0","unresolved":false,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"class TupleWithMeta(tuple, RequestIdMixin):"},{"line_number":554,"context_line":"    def __new__(cls, resp, resp_body):"},{"line_number":555,"context_line":"        return super(TupleWithMeta, cls).__new__(cls, (resp, resp_body))"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def __init__(self, resp, resp_body):"},{"line_number":558,"context_line":"        self.setup()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_3390b395","line":555,"range":{"start_line":555,"start_character":21,"end_line":555,"end_character":34},"updated":"2016-01-20 14:30:36.000000000","message":"Interested to know what is is special about a tuple, might be worth a comment? If tuple can be made to behave the same as the others, then this code can possibly be simplified...","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"33212961364a53186331dd5e6633a17d81643416","unresolved":false,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"class TupleWithMeta(tuple, RequestIdMixin):"},{"line_number":554,"context_line":"    def __new__(cls, resp, resp_body):"},{"line_number":555,"context_line":"        return super(TupleWithMeta, cls).__new__(cls, (resp, resp_body))"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def __init__(self, resp, resp_body):"},{"line_number":558,"context_line":"        self.setup()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_7118b51e","line":555,"range":{"start_line":555,"start_character":55,"end_line":555,"end_character":70},"updated":"2016-01-24 09:52:21.000000000","message":"Please refer to the comment by Kevin L. Mitchell for the following patchset:\nhttps://review.openstack.org/#/c/258802/5/novaclient/base.py@515\nI think you got a similar problem.","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"0aa8d0670aee6deac8e1558e6582820dffa8e0d4","unresolved":false,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"class TupleWithMeta(tuple, RequestIdMixin):"},{"line_number":554,"context_line":"    def __new__(cls, resp, resp_body):"},{"line_number":555,"context_line":"        return super(TupleWithMeta, cls).__new__(cls, (resp, resp_body))"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def __init__(self, resp, resp_body):"},{"line_number":558,"context_line":"        self.setup()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_7bd1f9cc","line":555,"range":{"start_line":555,"start_character":21,"end_line":555,"end_character":34},"in_reply_to":"9a68dd71_3390b395","updated":"2016-01-21 05:45:55.000000000","message":"Hi Duncan,\n\nAs specified in cross-project specs [1] under section \u0027Proposed Change\u0027 for None type, mostly all delete/update methods don’t return any value back to the caller. In most of the clients response and body tuple is returned by api call but it is not returned back to the caller. So to return request-id along with tuple we have created TupleWithMeta class.\n\nFor reference you can check _delete method from https://review.openstack.org/#/c/257180/4/cinderclient/base.py\n\nAlso some api\u0027s like associate [2] are not returning anything back to the caller, here also we are returning TupleWithMeta so that caller can access resp, body as well as request-id.\n\n[1] http://specs.openstack.org/openstack/openstack-specs/specs/return-request-id.html\n\n[2] https://github.com/openstack/python-cinderclient/blob/master/cinderclient/v2/qos_specs.py#L125\n\n\nThank you for review.\n\nPlease let me know, whether I should add comment for TupleWithMeta class.","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"d0aa09115ee991d324380365560691e22e2b03aa","unresolved":false,"context_lines":[{"line_number":552,"context_line":""},{"line_number":553,"context_line":"class TupleWithMeta(tuple, RequestIdMixin):"},{"line_number":554,"context_line":"    def __new__(cls, resp, resp_body):"},{"line_number":555,"context_line":"        return super(TupleWithMeta, cls).__new__(cls, (resp, resp_body))"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def __init__(self, resp, resp_body):"},{"line_number":558,"context_line":"        self.setup()"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_eb958432","line":555,"range":{"start_line":555,"start_character":55,"end_line":555,"end_character":70},"in_reply_to":"9a68dd71_7118b51e","updated":"2016-01-25 07:03:33.000000000","message":"Hi Cao ShuFeng,\n\nNo, this is required for backward compatibility.\nIf you check some api\u0027s like attach, detach etc. are returning resp, body tuple back to the caller. So here we need to include resp as a first element and body as a second element of a tuple, so that caller can access both resp and body.","commit_id":"26183acfd8ae007491ff3dcc7618206028cc66fa"}]}
