)]}'
{"cinder/api/v2/volume_metadata.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"41dff1c2d4617076d18317399fa71cf605c84def","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            raise webob.exc.HTTPNotFound(explanation\u003derror.msg)"},{"line_number":47,"context_line":"        return (volume, meta)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @wsgi.Controller.api_version(\u00273.0\u0027, \u00273.6\u0027)"},{"line_number":50,"context_line":"    def index(self, req, volume_id):"},{"line_number":51,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":52,"context_line":"        metadata \u003d self._get_metadata(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_77740236","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":46},"updated":"2016-06-15 08:16:05.000000000","message":"I\u0027m not 100% sure that this is causing tempest failures (although it looks so), but I think you should make new behavior conditional based on the API microversion. So with older clients - do things the old way, and with the ones that can send Etags - do it the new way.","commit_id":"c9c3ac1d961b8b87fca87adc42b6ed03fdbb61f9"}],"cinder/api/v3/volume_metadata.py":[{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"919de74914393169cde1f79c3946062c508cdf0e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"class Controller(volume_meta_v2.Controller):"},{"line_number":31,"context_line":"    \"\"\"The volume metadata API controller for the OpenStack API V3.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @wsgi.Controller.api_version(\u00273.6\u0027)"},{"line_number":34,"context_line":"    def index(self, req, volume_id):"},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":36,"context_line":"        metadata \u003d self._get_metadata(context, volume_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7aa08908_b32a537c","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":39},"updated":"2016-06-19 03:46:39.000000000","message":"This wrapper can only be used for wsgi.Controller\u0027s child class. It will not make sense here even this class is wsgi.Controller\u0027s **grand** child.\nYou may test it.","commit_id":"46db822c9314c51d033d0158c5ab85cba02e6a54"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"a307987ad1e1ff1efb7d1d17e0d3e7622845f71c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            expl \u003d _(\u0027Request body contains too many items\u0027)"},{"line_number":66,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dexpl)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        if not self._validate_etag(req, volume_id):"},{"line_number":69,"context_line":"            return webob.Response(status_int\u003d412)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_0feb3014","line":68,"updated":"2016-06-24 13:25:21.000000000","message":"IMO, we should do it only microversion\u003d\u003d3.7","commit_id":"d72ebb7c01931a0f88fa4ae323b846bcda2b3e6e"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"a307987ad1e1ff1efb7d1d17e0d3e7622845f71c","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def update_all(self, req, volume_id, body):"},{"line_number":80,"context_line":"        self.assert_valid_body(body, \u0027metadata\u0027)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        if not self._validate_etag(req, volume_id):"},{"line_number":83,"context_line":"            return webob.Response(status_int\u003d412)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        metadata \u003d body[\u0027metadata\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_8fc60098","line":82,"updated":"2016-06-24 13:25:21.000000000","message":"The same, as above","commit_id":"d72ebb7c01931a0f88fa4ae323b846bcda2b3e6e"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"6a760d3f018045e2eb1d9259c129e472d699bc21","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        checksum \u003d hashlib.md5(data).hexdigest()"},{"line_number":54,"context_line":"        return checksum in req.if_match.etags"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @wsgi.Controller.api_version(\u00273.7\u0027)"},{"line_number":57,"context_line":"    def update(self, req, volume_id, id, body):"},{"line_number":58,"context_line":"        self.assert_valid_body(body, \u0027meta\u0027)"},{"line_number":59,"context_line":"        meta_item \u003d body[\u0027meta\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"3aaa91ec_ef2a678f","line":56,"range":{"start_line":56,"start_character":4,"end_line":56,"end_character":39},"updated":"2016-06-29 09:44:35.000000000","message":"I don\u0027t think this wrapper works in wsgi.Controller\u0027s **grand** child classes, please refer to the code here[1].\n\n[1]: https://github.com/openstack/cinder/blob/master/cinder/api/openstack/wsgi.py#L1066-#L1075","commit_id":"4ee0e013ebe163cf10253f7a5c758f72ac0d9158"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"dcbb7c62ae518c00255934a060cf5b69c5967331","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    \"\"\"The volume metadata API controller for the OpenStack API.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @wsgi.Controller.api_version(\u00273.14\u0027)"},{"line_number":34,"context_line":"    def index(self, req, volume_id):"},{"line_number":35,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":36,"context_line":"        metadata \u003d self._get_metadata(context, volume_id)"},{"line_number":37,"context_line":"        resp \u003d webob.Response()"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa7ab95a_c6fb5946","line":34,"updated":"2016-08-31 10:56:16.000000000","message":"Please, re-use code from the parent V2 controller here and below","commit_id":"115dc2e48c1534c5f196142eda6d3d6f4685b94c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"2529cb49eaf33125320f306909d02cd56457a507","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    def index(self, req, volume_id):"},{"line_number":53,"context_line":"        context \u003d req.environ[\u0027cinder.context\u0027]"},{"line_number":54,"context_line":"        metadata \u003d self._get_metadata(context, volume_id)"},{"line_number":55,"context_line":"        resp \u003d webob.Response()"},{"line_number":56,"context_line":"        data \u003d jsonutils.dumps({\"metadata\": metadata})"},{"line_number":57,"context_line":"        if six.PY3:"},{"line_number":58,"context_line":"            data \u003d data.encode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa7ab95a_945b2d2e","line":55,"updated":"2016-08-31 14:20:55.000000000","message":"nit: we can get metadata from the parent class","commit_id":"a5b0d1e54fe6605002d8eeaa3ef2f95ca2de1939"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_cfa8a57a","line":1,"updated":"2016-08-31 21:16:17.000000000","message":"should be 2016 and your company name.","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_serialization import jsonutils"},{"line_number":21,"context_line":"import six"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import webob"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from cinder.api.openstack import wsgi"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_afdb611a","line":22,"updated":"2016-08-31 21:16:17.000000000","message":"Remove blank line","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c3a0e0accb6db5e7bd92aa32f28c1e61aa1d97a1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_0b9c375c","line":1,"updated":"2016-09-01 02:11:13.000000000","message":"nit: s/OpenStack Foundation/Mirantis\n\nYou don\u0027t need to submit another patch set because of this.","commit_id":"54ae45264ea0683ef6a8aee58dbf98912bd0a0f9"}],"cinder/tests/unit/api/v3/test_volume_metadata.py":[{"author":{"_account_id":19153,"name":"jingtao liang","email":"liang.jingtao@zte.com.cn","username":"liangjingtao"},"change_message_id":"a2754f74d5548c4b6c548c61933d4ff9700c33e8","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    pass"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"class volumeMetaDataTest(test.TestCase):"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def setUp(self):"},{"line_number":126,"context_line":"        super(volumeMetaDataTest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aaa91ec_d5f6bc5b","line":123,"updated":"2016-06-25 01:11:24.000000000","message":"Can you add some comments about this tests?","commit_id":"d72ebb7c01931a0f88fa4ae323b846bcda2b3e6e"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_efe80919","line":1,"updated":"2016-08-31 21:16:17.000000000","message":"should be 2016 and your company name.","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    def setUp(self):"},{"line_number":125,"context_line":"        super(volumeMetaDataTest, self).setUp()"},{"line_number":126,"context_line":"        self.volume_api \u003d volume_api.API()"},{"line_number":127,"context_line":"        self.stubs.Set(volume.api.API, \u0027get\u0027, get_volume)"},{"line_number":128,"context_line":"        self.stubs.Set(db, \u0027volume_metadata_get\u0027,"},{"line_number":129,"context_line":"                       return_volume_metadata)"},{"line_number":130,"context_line":"        self.patch("}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_2f5831fa","line":127,"updated":"2016-08-31 21:16:17.000000000","message":"test.TestCase.stubs uses mox.  Can you change this to use self.mock_object instead?\n\nhttps://github.com/openstack/cinder/blob/master/cinder/test.py#L184","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        super(volumeMetaDataTest, self).setUp()"},{"line_number":126,"context_line":"        self.volume_api \u003d volume_api.API()"},{"line_number":127,"context_line":"        self.stubs.Set(volume.api.API, \u0027get\u0027, get_volume)"},{"line_number":128,"context_line":"        self.stubs.Set(db, \u0027volume_metadata_get\u0027,"},{"line_number":129,"context_line":"                       return_volume_metadata)"},{"line_number":130,"context_line":"        self.patch("},{"line_number":131,"context_line":"            \u0027cinder.db.service_get_all\u0027, autospec\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_0fa44db7","line":128,"updated":"2016-08-31 21:16:17.000000000","message":"Same","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            \u0027cinder.db.service_get_all\u0027, autospec\u003dTrue,"},{"line_number":132,"context_line":"            return_value\u003dstubs.stub_service_get_all_by_topic(None, None))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        self.stubs.Set(self.volume_api, \u0027update_volume_metadata\u0027,"},{"line_number":135,"context_line":"                       fake_update_volume_metadata)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.ext_mgr \u003d extensions.ExtensionManager()"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_4fae5599","line":134,"updated":"2016-08-31 21:16:17.000000000","message":"Same","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        self.assertEqual(expected, data.body)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def test_index_nonexistent_volume(self):"},{"line_number":171,"context_line":"        self.stubs.Set(db, \u0027volume_metadata_get\u0027,"},{"line_number":172,"context_line":"                       return_volume_nonexistent)"},{"line_number":173,"context_line":"        req \u003d fakes.HTTPRequest.blank(self.url, version\u003d\"3.15\")"},{"line_number":174,"context_line":"        self.assertRaises(exception.VolumeNotFound,"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_2f82f100","line":171,"updated":"2016-08-31 21:16:17.000000000","message":"Same","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"77af539517d79288d4a69052d9849c70dad7a917","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                          self.controller.index, req, self.url)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_index_no_data(self):"},{"line_number":178,"context_line":"        self.stubs.Set(db, \u0027volume_metadata_get\u0027,"},{"line_number":179,"context_line":"                       return_empty_volume_metadata)"},{"line_number":180,"context_line":"        req \u003d fakes.HTTPRequest.blank(self.url, version\u003d\"3.15\")"},{"line_number":181,"context_line":"        data \u003d self.controller.index(req, self.req_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa7ab95a_4f857505","line":178,"updated":"2016-08-31 21:16:17.000000000","message":"Same","commit_id":"0d1a5eeb8c8196b667107a3b04ce4ea53ad3c59c"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"c3a0e0accb6db5e7bd92aa32f28c1e61aa1d97a1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":19,"id":"fa7ab95a_2ba3bb9f","line":1,"updated":"2016-09-01 02:11:13.000000000","message":"nit: s/OpenStack Foundation/Mirantis\nYou don\u0027t need to submit another patch set because of this.","commit_id":"54ae45264ea0683ef6a8aee58dbf98912bd0a0f9"}]}
