)]}'
{"releasenotes/notes/identity-v3-project-tags-client-36683c6a8644e54b.yaml":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c96ca2108c4943f9aca7e7c747958dc55db34133","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Add ``project_tags_client`` to the identity v3 library. This feature"},{"line_number":5,"context_line":"    enables the possibility of invoking the following API actions:"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    * create_project_tag"},{"line_number":8,"context_line":"    * list_project_tags"},{"line_number":9,"context_line":"    * update_project_tags"},{"line_number":10,"context_line":"    * check_project_tag_existence"},{"line_number":11,"context_line":"    * delete_project_tag"},{"line_number":12,"context_line":"    * delete_all_project_tags"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"bf659307_e3359d47","line":9,"range":{"start_line":7,"start_character":0,"end_line":9,"end_character":25},"updated":"2018-03-28 04:34:34.000000000","message":"you may want to update this as per latest change","commit_id":"f9fb58fcb85309fc7246fe63f41cf6ca7207d455"}],"tempest/api/identity/admin/v3/test_project_tags.py":[{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"a59bb6d0228f48472239f5387120b60b2fcba258","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        updated_tags \u003d self.project_tags_client.update_project_tags("},{"line_number":51,"context_line":"            project[\u0027id\u0027], tags_to_update)[\u0027tags\u0027]"},{"line_number":52,"context_line":"        self.assertEqual(tags_to_update, updated_tags)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # Verify that deleting a project tag works."},{"line_number":55,"context_line":"        self.project_tags_client.delete_project_tag("},{"line_number":56,"context_line":"            project[\u0027id\u0027], tags_to_update[0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_81eaeca9","line":53,"updated":"2018-03-19 07:08:45.000000000","message":"better add list_project_tags after update_project_tags?","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ee3ac21ca23a676351cf4bb7f4df593267515bea","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        updated_tags \u003d self.project_tags_client.update_project_tags("},{"line_number":51,"context_line":"            project[\u0027id\u0027], tags_to_update)[\u0027tags\u0027]"},{"line_number":52,"context_line":"        self.assertEqual(tags_to_update, updated_tags)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        # Verify that deleting a project tag works."},{"line_number":55,"context_line":"        self.project_tags_client.delete_project_tag("},{"line_number":56,"context_line":"            project[\u0027id\u0027], tags_to_update[0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_7e3724e5","line":53,"in_reply_to":"df7087c5_81eaeca9","updated":"2018-03-19 17:50:09.000000000","message":"Done","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"a59bb6d0228f48472239f5387120b60b2fcba258","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Verify that deleting all project tags works."},{"line_number":62,"context_line":"        self.project_tags_client.delete_all_project_tags(project[\u0027id\u0027])"},{"line_number":63,"context_line":"        for deleted_tag in tags_to_update[1:]:"},{"line_number":64,"context_line":"            self.assertRaises("},{"line_number":65,"context_line":"                lib_exc.NotFound,"},{"line_number":66,"context_line":"                self.project_tags_client.check_project_tag_existence,"},{"line_number":67,"context_line":"                project[\u0027id\u0027], deleted_tag)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_01c1fc2e","line":67,"range":{"start_line":63,"start_character":0,"end_line":67,"end_character":43},"updated":"2018-03-19 07:08:45.000000000","message":"How about using list_project_tags and checking whether the result is empty?","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ee3ac21ca23a676351cf4bb7f4df593267515bea","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Verify that deleting all project tags works."},{"line_number":62,"context_line":"        self.project_tags_client.delete_all_project_tags(project[\u0027id\u0027])"},{"line_number":63,"context_line":"        for deleted_tag in tags_to_update[1:]:"},{"line_number":64,"context_line":"            self.assertRaises("},{"line_number":65,"context_line":"                lib_exc.NotFound,"},{"line_number":66,"context_line":"                self.project_tags_client.check_project_tag_existence,"},{"line_number":67,"context_line":"                project[\u0027id\u0027], deleted_tag)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_1e34e8dd","line":67,"range":{"start_line":63,"start_character":0,"end_line":67,"end_character":43},"in_reply_to":"df7087c5_01c1fc2e","updated":"2018-03-19 17:50:09.000000000","message":"Done","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"}],"tempest/lib/services/identity/v3/project_tags_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e0aec56a7d323b6ce8a8d3f7220000900be56eee","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"},{"line_number":28,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":29,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def list_project_tags(self, project_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_a895d088","line":28,"updated":"2018-03-15 14:02:37.000000000","message":"https://github.com/openstack/keystone/blob/6c822e99d525fc50e1f1f9063c9e63ceb962faa0/keystone/resource/controllers.py#L312 returns empty string which is at odds with https://developer.openstack.org/api-ref/identity/v3/#id422\n\nThis is likely a Keystone bug? WIP until fixed.","commit_id":"55644097930b244e4361582015d9d918db6f3cfb"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f10e9b7e4d8444663efbf7f2a6e890581ba080d1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"},{"line_number":28,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":29,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def list_project_tags(self, project_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_f0c3aa36","line":28,"in_reply_to":"df7087c5_41588f54","updated":"2018-03-15 23:19:27.000000000","message":"\u003e This is a documentation bug: https://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags\n \u003e \n \u003e This API endpoint returns 201 AND an empty response body, so the\n \u003e implementation here is correct, but need to add a NOTE about\n \u003e documentation bug and this peculiar API response.","commit_id":"55644097930b244e4361582015d9d918db6f3cfb"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"bc3d5a25cc8f332cbb2e3a075b8f02779e540c7c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"},{"line_number":28,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":29,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def list_project_tags(self, project_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_41588f54","line":28,"in_reply_to":"df7087c5_a895d088","updated":"2018-03-15 15:59:53.000000000","message":"This is a documentation bug: https://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags\n\nThis API endpoint returns 201 AND an empty response body, so the implementation here is correct, but need to add a NOTE about documentation bug and this peculiar API response.","commit_id":"55644097930b244e4361582015d9d918db6f3cfb"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"a59bb6d0228f48472239f5387120b60b2fcba258","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":47,"context_line":"        \"\"\"Update list of tags for a project.\"\"\""},{"line_number":48,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":49,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"},{"line_number":50,"context_line":"        self.expected_success(200, resp.status)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_21268018","line":47,"range":{"start_line":47,"start_character":11,"end_line":47,"end_character":30},"updated":"2018-03-19 07:08:45.000000000","message":"Update tags?","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ee3ac21ca23a676351cf4bb7f4df593267515bea","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":47,"context_line":"        \"\"\"Update list of tags for a project.\"\"\""},{"line_number":48,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":49,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"},{"line_number":50,"context_line":"        self.expected_success(200, resp.status)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_9e20f89d","line":47,"range":{"start_line":47,"start_character":11,"end_line":47,"end_character":30},"in_reply_to":"df7087c5_21268018","updated":"2018-03-19 17:50:09.000000000","message":"Your way is more succinct, done.","commit_id":"fd223c294414b2c695a11fdd6f7729eac49f63da"},{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"366294a33c1fb365b7600a6744bd0b67f5982536","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        #"},{"line_number":32,"context_line":"        # TODO(felipemonteiro): The documentation for this endpoint claims that"},{"line_number":33,"context_line":"        # a response body is returned which is a Keystone bug. Remove this once"},{"line_number":34,"context_line":"        # bug is fixed: https://review.openstack.org/#/c/553422/"},{"line_number":35,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":36,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_e9726f7c","line":34,"range":{"start_line":34,"start_character":24,"end_line":34,"end_character":64},"updated":"2018-03-21 05:36:15.000000000","message":"This is merged","commit_id":"472e03e8fe65f8fcddc845c84b3cf84ea0bdaa32"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2a0e35e8eafd767b8b9e02bf468a873f9557270b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        #"},{"line_number":32,"context_line":"        # TODO(felipemonteiro): The documentation for this endpoint claims that"},{"line_number":33,"context_line":"        # a response body is returned which is a Keystone bug. Remove this once"},{"line_number":34,"context_line":"        # bug is fixed: https://review.openstack.org/#/c/553422/"},{"line_number":35,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":36,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df7087c5_602e68fb","line":34,"range":{"start_line":34,"start_character":24,"end_line":34,"end_character":64},"in_reply_to":"df7087c5_e9726f7c","updated":"2018-03-21 13:33:02.000000000","message":"Thanks, forgot about this.","commit_id":"472e03e8fe65f8fcddc845c84b3cf84ea0bdaa32"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12b0f0606107e1100ed36edd822b11230f344b81","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class ProjectTagsClient(rest_client.RestClient):"},{"line_number":22,"context_line":"    api_version \u003d \"v3\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def create_project_tag(self, project_id, tag):"},{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_9674679b","line":24,"range":{"start_line":24,"start_character":8,"end_line":24,"end_character":26},"updated":"2018-03-26 01:36:02.000000000","message":"This is PUT method and to update a single tag, so for consistency we can name this method to update_project_tag","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"04cbe7976894d15709554218d82e82f42d00a5cf","unresolved":false,"context_lines":[{"line_number":21,"context_line":"class ProjectTagsClient(rest_client.RestClient):"},{"line_number":22,"context_line":"    api_version \u003d \"v3\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def create_project_tag(self, project_id, tag):"},{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_97f8c5c4","line":24,"range":{"start_line":24,"start_character":8,"end_line":24,"end_character":26},"in_reply_to":"bf659307_9674679b","updated":"2018-03-28 15:00:33.000000000","message":"Thanks, forgot about that convention in Tempest.","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12b0f0606107e1100ed36edd822b11230f344b81","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    api_version \u003d \"v3\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def create_project_tag(self, project_id, tag):"},{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"},{"line_number":28,"context_line":"        # NOTE(felipemonteiro): This API endpoint returns 201 AND an empty"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_3669dbbd","line":25,"range":{"start_line":25,"start_character":11,"end_line":25,"end_character":32},"updated":"2018-03-26 01:36:02.000000000","message":"Updates the specified tag and adds it to the list of tags in the project.","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"04cbe7976894d15709554218d82e82f42d00a5cf","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    api_version \u003d \"v3\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def create_project_tag(self, project_id, tag):"},{"line_number":25,"context_line":"        \"\"\"Create a project tag.\"\"\""},{"line_number":26,"context_line":"        url \u003d \u0027projects/%s/tags/%s\u0027 % (project_id, tag)"},{"line_number":27,"context_line":"        resp, body \u003d self.put(url, \u0027{}\u0027)"},{"line_number":28,"context_line":"        # NOTE(felipemonteiro): This API endpoint returns 201 AND an empty"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_17bcb5da","line":25,"range":{"start_line":25,"start_character":11,"end_line":25,"end_character":32},"in_reply_to":"bf659307_3669dbbd","updated":"2018-03-28 15:00:33.000000000","message":"Done","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12b0f0606107e1100ed36edd822b11230f344b81","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        body \u003d json.loads(body)"},{"line_number":40,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":43,"context_line":"        \"\"\"Update tags for a project.\"\"\""},{"line_number":44,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":45,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_d69f3fb2","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":27},"updated":"2018-03-26 01:36:02.000000000","message":"This is to update all tags and remove non-specified tags so we should name this to update_all_project_tags","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12b0f0606107e1100ed36edd822b11230f344b81","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        body \u003d json.loads(body)"},{"line_number":40,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":43,"context_line":"        \"\"\"Update tags for a project.\"\"\""},{"line_number":44,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":45,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_36979b93","line":42,"range":{"start_line":42,"start_character":50,"end_line":42,"end_character":51},"updated":"2018-03-26 01:36:02.000000000","message":"also accepting kwargs for request body is good to test this API in negative way of additionalProperties.","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"04cbe7976894d15709554218d82e82f42d00a5cf","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        body \u003d json.loads(body)"},{"line_number":40,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":43,"context_line":"        \"\"\"Update tags for a project.\"\"\""},{"line_number":44,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":45,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_97e68516","line":42,"range":{"start_line":42,"start_character":8,"end_line":42,"end_character":27},"in_reply_to":"bf659307_d69f3fb2","updated":"2018-03-28 15:00:33.000000000","message":"Done","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12b0f0606107e1100ed36edd822b11230f344b81","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":43,"context_line":"        \"\"\"Update tags for a project.\"\"\""},{"line_number":44,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":45,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"},{"line_number":46,"context_line":"        self.expected_success(200, resp.status)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_96a9c7e0","line":43,"range":{"start_line":43,"start_character":11,"end_line":43,"end_character":37},"updated":"2018-03-26 01:36:02.000000000","message":"Updates all the tags for a project. Any existing tags not specified will be deleted.","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"04cbe7976894d15709554218d82e82f42d00a5cf","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def update_project_tags(self, project_id, tags):"},{"line_number":43,"context_line":"        \"\"\"Update tags for a project.\"\"\""},{"line_number":44,"context_line":"        put_body \u003d json.dumps({\u0027tags\u0027: tags})"},{"line_number":45,"context_line":"        resp, body \u003d self.put(\u0027projects/%s/tags\u0027 % project_id, put_body)"},{"line_number":46,"context_line":"        self.expected_success(200, resp.status)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_57f0edc9","line":43,"range":{"start_line":43,"start_character":11,"end_line":43,"end_character":37},"in_reply_to":"bf659307_96a9c7e0","updated":"2018-03-28 15:00:33.000000000","message":"Done","commit_id":"325489ded7ebc7b88b69f1a29a4d60d8d012fc71"}],"tempest/tests/lib/services/identity/v3/test_project_tags_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d26b04932baaf850ce6b8c36372c8b47f6d4793e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":2,"id":"df7087c5_68e01827","line":1,"range":{"start_line":1,"start_character":11,"end_line":1,"end_character":30},"updated":"2018-03-15 14:03:58.000000000","message":"2018 AT\u0026T Corporation.","commit_id":"55644097930b244e4361582015d9d918db6f3cfb"}]}
