)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"9efa64285362097d6cb8aae270c52a218d579029","unresolved":false,"context_lines":[{"line_number":12,"context_line":"the updated complete list of ones (without items to delete)"},{"line_number":13,"context_line":"in the body of the request. This patch uses etags to avoid the"},{"line_number":14,"context_line":"lost update problem with volume metadata."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Depends-On: I575635258c10f299181b8e4cdb51a7ad1f1be764"},{"line_number":17,"context_line":"Implements: blueprint delete-multiple-metadata-keys"},{"line_number":18,"context_line":"Change-Id: I8e18133ffee87c240a7af4b8177683ab99330d9e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa7ab95a_3e4af783","line":15,"updated":"2016-09-01 14:11:09.000000000","message":"Could we also get an example here of how the command is used.  I find that very helpful for changes like this.  Thanks!","commit_id":"161d4552203b15bc6dcc18166394265c6c550c5b"}],"cinderclient/base.py":[{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"8e96631131a269b314615457cb3ea5d7058b9171","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        resp, body \u003d self.api.client.delete(url)"},{"line_number":322,"context_line":"        return common_base.TupleWithMeta((resp, body), resp)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _update(self, url, body, headers\u003dNone, response_key\u003dNone, **kwargs):"},{"line_number":325,"context_line":"        self.run_hooks(\u0027modify_body_for_update\u0027, body, **kwargs)"},{"line_number":326,"context_line":"        resp, body \u003d self.api.client.put(url, body\u003dbody, headers\u003dheaders)"},{"line_number":327,"context_line":"        if response_key:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_5884200a","line":324,"range":{"start_line":324,"start_character":33,"end_line":324,"end_character":45},"updated":"2016-06-17 07:19:40.000000000","message":"-1\nThis will break other api that use _update function.\n$ cinder rename 132bda24-3d86-4636-9cb2-3442eb5aefed def\nERROR: \u0027NoneType\u0027 object has no attribute \u0027setdefault\u0027","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":14305,"name":"Yuriy Nesenenko","email":"ynesenenko@mirantis.com","username":"yuriy_n"},"change_message_id":"0df8ed94eb257e9f2b8d6b870265299a015ef261","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        resp, body \u003d self.api.client.delete(url)"},{"line_number":322,"context_line":"        return common_base.TupleWithMeta((resp, body), resp)"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"    def _update(self, url, body, headers\u003dNone, response_key\u003dNone, **kwargs):"},{"line_number":325,"context_line":"        self.run_hooks(\u0027modify_body_for_update\u0027, body, **kwargs)"},{"line_number":326,"context_line":"        resp, body \u003d self.api.client.put(url, body\u003dbody, headers\u003dheaders)"},{"line_number":327,"context_line":"        if response_key:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_48a600c2","line":324,"range":{"start_line":324,"start_character":33,"end_line":324,"end_character":45},"in_reply_to":"7aa08908_5884200a","updated":"2016-06-17 12:07:30.000000000","message":"Thanks, fixed","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"}],"cinderclient/tests/unit/v2/test_shell.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"af658b08cc390047f36de8cf81b763085e289669","unresolved":false,"context_lines":[{"line_number":545,"context_line":"        self.run_command(\u0027metadata 1234 set key1\u003dval1 key2\u003dval2\u0027)"},{"line_number":546,"context_line":"        self.assert_called(\u0027POST\u0027, \u0027/volumes/1234/metadata\u0027,"},{"line_number":547,"context_line":"                           {\u0027metadata\u0027: {\u0027key1\u0027: \u0027val1\u0027, \u0027key2\u0027: \u0027val2\u0027}})"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    @mock.patch(\u0027cinderclient.utils.find_volume\u0027)"},{"line_number":550,"context_line":"    def test_delete_metadata(self, mock_find_volume):"},{"line_number":551,"context_line":"        mock_find_volume.return_value \u003d volumes.Volume(self,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ac06dbe_923f7d86","line":548,"updated":"2016-08-22 21:21:25.000000000","message":"Shouldn\u0027t there be a test for v2 and a test for v3?","commit_id":"55e7073169fa6813a120428b0921199537ff3baa"}],"cinderclient/v3/shell.py":[{"author":{"_account_id":7173,"name":"Scott DAngelo","email":"scott.dangelo@gmail.com","username":"scottda"},"change_message_id":"b269bcfb8b4978e6400d16a35b3181d6cee18bf2","unresolved":false,"context_lines":[{"line_number":617,"context_line":"           metavar\u003d\u0027\u003ckey\u003dvalue\u003e\u0027,"},{"line_number":618,"context_line":"           nargs\u003d\u0027+\u0027,"},{"line_number":619,"context_line":"           default\u003d[],"},{"line_number":620,"context_line":"           help\u003d\u0027Metadata key and value pair to set or unset. \u0027"},{"line_number":621,"context_line":"                \u0027For unset, specify only the key.\u0027)"},{"line_number":622,"context_line":"@utils.arg(\u0027metadata\u0027,"},{"line_number":623,"context_line":"           metavar\u003d\u0027\u003ckey\u003dvalue\u003e\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa7ab95a_2f7aaef1","line":620,"updated":"2016-09-01 19:32:13.000000000","message":"I think here you need:\nend_version\u003d\u00273.14\u0027","commit_id":"c9b8ad062b9ee69565b1f1f3542a10f36a6c2d58"}],"cinderclient/v3/volumes.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"fdf4321a192d7f7763ea353c1dc8f9ffa95e0246","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                                body)"},{"line_number":424,"context_line":"        else:"},{"line_number":425,"context_line":"            msg \u003d \"Some of metadata items: %s was not found.\" % \u0027, \u0027.join(keys)"},{"line_number":426,"context_line":"            raise exceptions.CommandError(msg)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def set_image_metadata(self, volume, metadata):"},{"line_number":429,"context_line":"        \"\"\"Set a volume\u0027s image metadata."}],"source_content_type":"text/x-python","patch_set":2,"id":"9abb7d3a_70951c87","line":426,"updated":"2016-06-02 13:45:07.000000000","message":"IMO you should not go out of your way to throw an error for keys that aren\u0027t found.  Just send the set of keys that are supposed to be updated and ignore missing keys.\n\nAlso, you can\u0027t throw CommandError here since this is library code and not shell client code.","commit_id":"b8b72762f1705086d7bdff1bb8871ab51ace3c4f"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"96ef077dfae68d80cc107d725b5710ebd075455c","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":415,"context_line":"        \"\"\""},{"line_number":416,"context_line":"        metadata \u003d volume.metadata"},{"line_number":417,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":418,"context_line":"            for k in keys:"},{"line_number":419,"context_line":"                metadata.pop(k)"},{"line_number":420,"context_line":"            body \u003d {\u0027metadata\u0027: metadata}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_5948ea87","line":417,"updated":"2016-06-02 21:04:53.000000000","message":"What about \u0027else\u0027 statement? We should not ignore this case","commit_id":"059e94cab1df0b750a66bfcdb29e6e68ce7ee150"},{"author":{"_account_id":14305,"name":"Yuriy Nesenenko","email":"ynesenenko@mirantis.com","username":"yuriy_n"},"change_message_id":"4fd61121fcbfd029acbc004aa0c3f898d06c3e86","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":415,"context_line":"        \"\"\""},{"line_number":416,"context_line":"        metadata \u003d volume.metadata"},{"line_number":417,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":418,"context_line":"            for k in keys:"},{"line_number":419,"context_line":"                metadata.pop(k)"},{"line_number":420,"context_line":"            body \u003d {\u0027metadata\u0027: metadata}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9abb7d3a_09e9d81a","line":417,"in_reply_to":"9abb7d3a_5948ea87","updated":"2016-06-03 09:20:28.000000000","message":"I agree with Eric that it would be better just to send the set of keys that are supposed to be updated and ignore missing keys.","commit_id":"059e94cab1df0b750a66bfcdb29e6e68ce7ee150"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"8e96631131a269b314615457cb3ea5d7058b9171","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        return self._create(\"/volumes/%s/metadata\" % base.getid(volume),"},{"line_number":408,"context_line":"                            body, \"metadata\")"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    @api_versions.wraps(\"3.0\", \"3.5\")"},{"line_number":411,"context_line":"    def delete_metadata(self, volume, keys):"},{"line_number":412,"context_line":"        \"\"\"Delete specified keys from volumes metadata."},{"line_number":413,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_b5954d89","line":410,"range":{"start_line":410,"start_character":25,"end_line":410,"end_character":28},"updated":"2016-06-17 07:19:40.000000000","message":"IMO, this should be 2.0","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"8e96631131a269b314615457cb3ea5d7058b9171","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                            body, \"metadata\")"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    @api_versions.wraps(\"3.0\", \"3.5\")"},{"line_number":411,"context_line":"    def delete_metadata(self, volume, keys):"},{"line_number":412,"context_line":"        \"\"\"Delete specified keys from volumes metadata."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":"        :param volume: The :class:`Volume`."}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_1591c146","line":411,"range":{"start_line":411,"start_character":8,"end_line":411,"end_character":23},"updated":"2016-06-17 07:19:40.000000000","message":"This function will not be called anyway because of bug #1573414.\nBut this is not the scope of this change. Just leave it here to raise some awareness.","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"8e96631131a269b314615457cb3ea5d7058b9171","unresolved":false,"context_lines":[{"line_number":414,"context_line":"        :param volume: The :class:`Volume`."},{"line_number":415,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":416,"context_line":"        \"\"\""},{"line_number":417,"context_line":"        metadata \u003d volume.metadata"},{"line_number":418,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":419,"context_line":"            for k in keys:"},{"line_number":420,"context_line":"                metadata.pop(k)"},{"line_number":421,"context_line":"            body \u003d {\u0027metadata\u0027: metadata}"},{"line_number":422,"context_line":"            return self._update(\"/volumes/%s/metadata\" % base.getid(volume),"},{"line_number":423,"context_line":"                                body)"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":"    @api_versions.wraps(\"3.6\")"},{"line_number":426,"context_line":"    def delete_metadata(self, volume, keys):"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_ec527534","line":423,"range":{"start_line":417,"start_character":0,"end_line":423,"end_character":37},"updated":"2016-06-17 07:19:40.000000000","message":"But IMO, it\u0027s not necessary to change the old behavior unless there is a bug in it.\nThat\u0027s the functionality what api_version provide to us.","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"8e96631131a269b314615457cb3ea5d7058b9171","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        :param volume: The :class:`Volume`."},{"line_number":430,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":431,"context_line":"        \"\"\""},{"line_number":432,"context_line":"        data \u003d self._get(\"/volumes/%s/metadata\" % base.getid(volume))"},{"line_number":433,"context_line":"        metadata \u003d data._info.get(\"metadata\", {})"},{"line_number":434,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":435,"context_line":"            for k in keys:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_c2013d3b","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":12},"updated":"2016-06-17 07:19:40.000000000","message":"-1\nThe type of data will be cinderclient.v3.volumes.Volume.\nBut the info in it is not about a volume.","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":20105,"name":"Cao ShuFeng","email":"caosf.fnst@cn.fujitsu.com","username":"caosf.fnst"},"change_message_id":"57be9739569cd2f0921ec8455f485f767220d78b","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        :param volume: The :class:`Volume`."},{"line_number":430,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":431,"context_line":"        \"\"\""},{"line_number":432,"context_line":"        data \u003d self._get(\"/volumes/%s/metadata\" % base.getid(volume))"},{"line_number":433,"context_line":"        metadata \u003d data._info.get(\"metadata\", {})"},{"line_number":434,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":435,"context_line":"            for k in keys:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_9e3782fd","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":12},"in_reply_to":"7aa08908_88b588ee","updated":"2016-06-17 12:55:53.000000000","message":"Hi, Yuriy Nesenenko:\n    Yeah, it does.\n    But I feel strange that a class Volume contains info about  only volume metadata.\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n    print type(data)\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":14305,"name":"Yuriy Nesenenko","email":"ynesenenko@mirantis.com","username":"yuriy_n"},"change_message_id":"0df8ed94eb257e9f2b8d6b870265299a015ef261","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        :param volume: The :class:`Volume`."},{"line_number":430,"context_line":"        :param keys: A list of keys to be removed."},{"line_number":431,"context_line":"        \"\"\""},{"line_number":432,"context_line":"        data \u003d self._get(\"/volumes/%s/metadata\" % base.getid(volume))"},{"line_number":433,"context_line":"        metadata \u003d data._info.get(\"metadata\", {})"},{"line_number":434,"context_line":"        if set(keys).issubset(metadata.keys()):"},{"line_number":435,"context_line":"            for k in keys:"}],"source_content_type":"text/x-python","patch_set":6,"id":"7aa08908_88b588ee","line":432,"range":{"start_line":432,"start_character":8,"end_line":432,"end_character":12},"in_reply_to":"7aa08908_c2013d3b","updated":"2016-06-17 12:07:30.000000000","message":"In this case data._info contains the info like that\n{u\u0027metadata\u0027: {u\u0027joke\u0027: u\u0027joke\u0027, u\u0027bla\u0027: u\u0027bla\u0027}}","commit_id":"caf5c423350d89b3f58e818d29b186eb166b108c"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"af658b08cc390047f36de8cf81b763085e289669","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        response_list \u003d []"},{"line_number":418,"context_line":"        for k in keys:"},{"line_number":419,"context_line":"            resp, body \u003d self._delete(\"/volumes/%s/metadata/%s\" %"},{"line_number":420,"context_line":"                                     (base.getid(volume), k))"},{"line_number":421,"context_line":"            response_list.append(resp)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"        return common_base.ListWithMeta([], response_list)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ac06dbe_b26719e8","line":420,"updated":"2016-08-22 21:21:25.000000000","message":"No need to change this line..?","commit_id":"55e7073169fa6813a120428b0921199537ff3baa"},{"author":{"_account_id":14305,"name":"Yuriy Nesenenko","email":"ynesenenko@mirantis.com","username":"yuriy_n"},"change_message_id":"63fe2626753124489b47c9614b6196400fe3731c","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        response_list \u003d []"},{"line_number":418,"context_line":"        for k in keys:"},{"line_number":419,"context_line":"            resp, body \u003d self._delete(\"/volumes/%s/metadata/%s\" %"},{"line_number":420,"context_line":"                                     (base.getid(volume), k))"},{"line_number":421,"context_line":"            response_list.append(resp)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"        return common_base.ListWithMeta([], response_list)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa7ab95a_86380a3f","line":420,"in_reply_to":"1ac06dbe_b26719e8","updated":"2016-08-29 11:20:51.000000000","message":"This is for volume-api 2","commit_id":"55e7073169fa6813a120428b0921199537ff3baa"}]}
