)]}'
{"cinder/tests/unit/api/v3/test_volume_protection.py":[{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"94140196705d02b26844aef02bbfbaa7890f3da5","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return volume"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":72,"context_line":"    def test_admin_can_show_update_delete_volumes(self, mock_volume):"},{"line_number":73,"context_line":"        # Make sure administrators are authorized to list volumes"},{"line_number":74,"context_line":"        admin_context \u003d self.admin_context"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_7bfc2171","line":72,"range":{"start_line":72,"start_character":28,"end_line":72,"end_character":42},"updated":"2018-11-14 04:10:00.000000000","message":"i think creating a new test would be better for this, multiple cases in the same test can cause ambiguity. what do you think?","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"dc673ddd90b69099be61bd1bb3beb9df2ba4b7ef","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return volume"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":72,"context_line":"    def test_admin_can_show_update_delete_volumes(self, mock_volume):"},{"line_number":73,"context_line":"        # Make sure administrators are authorized to list volumes"},{"line_number":74,"context_line":"        admin_context \u003d self.admin_context"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_4ec8421f","line":72,"range":{"start_line":72,"start_character":28,"end_line":72,"end_character":42},"in_reply_to":"3f79a3b5_306b231d","updated":"2018-12-04 08:32:12.000000000","message":"Done","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ec5ca0f565af32a26a08e77cdaed70ad913d4d28","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return volume"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":72,"context_line":"    def test_admin_can_show_update_delete_volumes(self, mock_volume):"},{"line_number":73,"context_line":"        # Make sure administrators are authorized to list volumes"},{"line_number":74,"context_line":"        admin_context \u003d self.admin_context"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_8d53046f","line":72,"range":{"start_line":72,"start_character":28,"end_line":72,"end_character":42},"in_reply_to":"3f79a3b5_7bfc2171","updated":"2018-11-14 06:58:20.000000000","message":"emm, I just thought to we can re-use the create part code. and I think we have then enough notes on these case. It doesn\u0027t brings any problem. Agree?","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"57913d55076f45c113676b2039257ac000fc8085","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return volume"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":72,"context_line":"    def test_admin_can_show_update_delete_volumes(self, mock_volume):"},{"line_number":73,"context_line":"        # Make sure administrators are authorized to list volumes"},{"line_number":74,"context_line":"        admin_context \u003d self.admin_context"},{"line_number":75,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_306b231d","line":72,"range":{"start_line":72,"start_character":28,"end_line":72,"end_character":42},"in_reply_to":"3f79a3b5_8d53046f","updated":"2018-11-14 09:29:52.000000000","message":"i\u0027m still uncertain about keeping multiple assertions of different cases in the same test.\ni will wait for other reviewers opinions.","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"94140196705d02b26844aef02bbfbaa7890f3da5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        self.assertEqual(user_context.project_id,"},{"line_number":119,"context_line":"                         res_vol[\u0027os-vol-tenant-attr:tenant_id\u0027])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        # Make sure owners are authorized to update their owners"},{"line_number":122,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":123,"context_line":"        response \u003d self._get_request_response(user_context, path, \u0027PUT\u0027,"},{"line_number":124,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_1bf16d98","line":121,"range":{"start_line":121,"start_character":58,"end_line":121,"end_character":64},"updated":"2018-11-14 04:10:00.000000000","message":"volumes","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ec5ca0f565af32a26a08e77cdaed70ad913d4d28","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        self.assertEqual(user_context.project_id,"},{"line_number":119,"context_line":"                         res_vol[\u0027os-vol-tenant-attr:tenant_id\u0027])"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        # Make sure owners are authorized to update their owners"},{"line_number":122,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":123,"context_line":"        response \u003d self._get_request_response(user_context, path, \u0027PUT\u0027,"},{"line_number":124,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_ad584089","line":121,"range":{"start_line":121,"start_character":58,"end_line":121,"end_character":64},"in_reply_to":"3f79a3b5_1bf16d98","updated":"2018-11-14 06:58:20.000000000","message":"Done","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"94140196705d02b26844aef02bbfbaa7890f3da5","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                              body\u003dbody)"},{"line_number":125,"context_line":"        self.assertEqual(http_client.OK, response.status_int)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Make sure owners are authorized to delete their owners"},{"line_number":128,"context_line":"        response \u003d self._get_request_response(user_context, path, \u0027DELETE\u0027)"},{"line_number":129,"context_line":"        self.assertEqual(http_client.ACCEPTED, response.status_int)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_3beea9b6","line":127,"range":{"start_line":127,"start_character":58,"end_line":127,"end_character":64},"updated":"2018-11-14 04:10:00.000000000","message":"volumes","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ec5ca0f565af32a26a08e77cdaed70ad913d4d28","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                              body\u003dbody)"},{"line_number":125,"context_line":"        self.assertEqual(http_client.OK, response.status_int)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # Make sure owners are authorized to delete their owners"},{"line_number":128,"context_line":"        response \u003d self._get_request_response(user_context, path, \u0027DELETE\u0027)"},{"line_number":129,"context_line":"        self.assertEqual(http_client.ACCEPTED, response.status_int)"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_4d4decc4","line":127,"range":{"start_line":127,"start_character":58,"end_line":127,"end_character":64},"in_reply_to":"3f79a3b5_3beea9b6","updated":"2018-11-14 06:58:20.000000000","message":"Done","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"94140196705d02b26844aef02bbfbaa7890f3da5","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # expected?"},{"line_number":150,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # Make sure volumes can be only updated by their owners"},{"line_number":153,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":154,"context_line":"        response \u003d self._get_request_response(non_owner_context, path, \u0027PUT\u0027,"},{"line_number":155,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_3b330962","line":152,"range":{"start_line":152,"start_character":28,"end_line":152,"end_character":63},"updated":"2018-11-14 04:10:00.000000000","message":"cannot be updated by other users/owners ?","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ec5ca0f565af32a26a08e77cdaed70ad913d4d28","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # expected?"},{"line_number":150,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # Make sure volumes can be only updated by their owners"},{"line_number":153,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":154,"context_line":"        response \u003d self._get_request_response(non_owner_context, path, \u0027PUT\u0027,"},{"line_number":155,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_6d4a28af","line":152,"range":{"start_line":152,"start_character":28,"end_line":152,"end_character":63},"in_reply_to":"3f79a3b5_3b330962","updated":"2018-11-14 06:58:20.000000000","message":"Done","commit_id":"4da271a24321ceca4cae6dc3d343cf7584056cd0"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"cad6dcf0f096c2370e107848dcd9d21c54b90391","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # expected?"},{"line_number":150,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # Make sure volumes can\u0027t updated by other users"},{"line_number":153,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":154,"context_line":"        response \u003d self._get_request_response(non_owner_context, path, \u0027PUT\u0027,"},{"line_number":155,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_63979739","line":152,"range":{"start_line":152,"start_character":33,"end_line":152,"end_character":34},"updated":"2018-11-14 09:30:50.000000000","message":"can\u0027t be","commit_id":"ac8d83bcf802f19914e65cf721e4f78590b9b1e4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"dc673ddd90b69099be61bd1bb3beb9df2ba4b7ef","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        # expected?"},{"line_number":150,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        # Make sure volumes can\u0027t updated by other users"},{"line_number":153,"context_line":"        body \u003d {\"volume\": {\"name\": \"update_name\"}}"},{"line_number":154,"context_line":"        response \u003d self._get_request_response(non_owner_context, path, \u0027PUT\u0027,"},{"line_number":155,"context_line":"                                              body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_2e1aa6c7","line":152,"range":{"start_line":152,"start_character":33,"end_line":152,"end_character":34},"in_reply_to":"3f79a3b5_63979739","updated":"2018-12-04 08:32:12.000000000","message":"Done","commit_id":"ac8d83bcf802f19914e65cf721e4f78590b9b1e4"},{"author":{"_account_id":27615,"name":"Rajat Dhasmana","email":"rajatdhasmana@gmail.com","username":"whoami-rajat"},"change_message_id":"cad6dcf0f096c2370e107848dcd9d21c54b90391","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                                              body\u003dbody)"},{"line_number":156,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        # Make sure volumes can\u0027t deleted by other users"},{"line_number":159,"context_line":"        response \u003d self._get_request_response(non_owner_context, path,"},{"line_number":160,"context_line":"                                              \u0027DELETE\u0027)"},{"line_number":161,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_c3af8b7d","line":158,"range":{"start_line":158,"start_character":33,"end_line":158,"end_character":34},"updated":"2018-11-14 09:30:50.000000000","message":"can\u0027t be","commit_id":"ac8d83bcf802f19914e65cf721e4f78590b9b1e4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"dc673ddd90b69099be61bd1bb3beb9df2ba4b7ef","unresolved":false,"context_lines":[{"line_number":155,"context_line":"                                              body\u003dbody)"},{"line_number":156,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        # Make sure volumes can\u0027t deleted by other users"},{"line_number":159,"context_line":"        response \u003d self._get_request_response(non_owner_context, path,"},{"line_number":160,"context_line":"                                              \u0027DELETE\u0027)"},{"line_number":161,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_ee134eb0","line":158,"range":{"start_line":158,"start_character":33,"end_line":158,"end_character":34},"in_reply_to":"3f79a3b5_c3af8b7d","updated":"2018-12-04 08:32:12.000000000","message":"Done","commit_id":"ac8d83bcf802f19914e65cf721e4f78590b9b1e4"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"d4ff293e360147c8c05ee44bce810ecb89058f35","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":210,"context_line":"    def test_owner_cannot_delete_volumes_for_others(self, mock_volume):"},{"line_number":211,"context_line":"        # Make sure volumes can\u0027t be deleted by other users"},{"line_number":212,"context_line":"        owner_context \u003d self.user_context"},{"line_number":213,"context_line":"        non_owner_context \u003d self.other_user_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_afb8e9c0","line":210,"updated":"2018-12-04 14:29:40.000000000","message":"My understanding of these test_*_protection files is that they\u0027re meant to be focused on making sure that the default policies in code don\u0027t regress unless we specifically decide to change a default.  If that\u0027s true, then this test isn\u0027t appropriate because there\u0027s no policy setting that will allow a non-owner who is a non-admin to delete a volume--that\u0027s got to be true or this test would be failing since the default policy is \"\" (unrestricted).  (This case should already be covered in other tests that exercise the code that enforces this.)","commit_id":"a051580aa3a91bedbea6fd21f05d9cd7aed04a41"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"ddacb56c4c4112aa95cf8758a8cb18bcaa6ac863","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":210,"context_line":"    def test_owner_cannot_delete_volumes_for_others(self, mock_volume):"},{"line_number":211,"context_line":"        # Make sure volumes can\u0027t be deleted by other users"},{"line_number":212,"context_line":"        owner_context \u003d self.user_context"},{"line_number":213,"context_line":"        non_owner_context \u003d self.other_user_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_68f15297","line":210,"in_reply_to":"3f79a3b5_a7c80d4e","updated":"2018-12-05 07:53:32.000000000","message":"Done","commit_id":"a051580aa3a91bedbea6fd21f05d9cd7aed04a41"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"f9b176cc05f7625d66602d952aa4f70e0c72fe1a","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        self.assertEqual(http_client.NOT_FOUND, response.status_int)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    @mock.patch.object(volume_api.API, \u0027get_volume\u0027)"},{"line_number":210,"context_line":"    def test_owner_cannot_delete_volumes_for_others(self, mock_volume):"},{"line_number":211,"context_line":"        # Make sure volumes can\u0027t be deleted by other users"},{"line_number":212,"context_line":"        owner_context \u003d self.user_context"},{"line_number":213,"context_line":"        non_owner_context \u003d self.other_user_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"3f79a3b5_a7c80d4e","line":210,"in_reply_to":"3f79a3b5_afb8e9c0","updated":"2018-12-04 16:00:25.000000000","message":"Just noticed that the default in code is not \"\", so I downloaded your patch and changed the default to \"\" and the test still passes.  So I don\u0027t think it\u0027s the policy setting that\u0027s preventing this, it\u0027s happening somewhere else in the code.","commit_id":"a051580aa3a91bedbea6fd21f05d9cd7aed04a41"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dfcff067799cdb5f9ece9014172493d822e1080e","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        self.assertEqual(http_client.FORBIDDEN, response.status_int)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def test_normal_user_can_create_volume(self):"},{"line_number":318,"context_line":"        # Make sure normal user is authorized to force delete volumes"},{"line_number":319,"context_line":"        user_context \u003d self.user_context"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        path \u003d \u0027/v3/%(project_id)s/volumes\u0027 % {"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_41c1972f","line":318,"range":{"start_line":318,"start_character":49,"end_line":318,"end_character":61},"updated":"2018-12-07 15:52:59.000000000","message":"should be \"create\" -- or maybe delete the comment altogether, the test name says exactly the same thing.","commit_id":"730140a3d744374ecf5e1bc64e87d5511e97dcae"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dfcff067799cdb5f9ece9014172493d822e1080e","unresolved":false,"context_lines":[{"line_number":328,"context_line":"        self.assertEqual(http_client.ACCEPTED, response.status_int)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"    def test_normal_user_can_create_volume_from_image(self):"},{"line_number":331,"context_line":"        # Make sure normal user is authorized to force delete volumes"},{"line_number":332,"context_line":"        user_context \u003d self.user_context"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        path \u003d \u0027/v3/%(project_id)s/volumes\u0027 % {"}],"source_content_type":"text/x-python","patch_set":7,"id":"3f79a3b5_41c67743","line":331,"range":{"start_line":331,"start_character":49,"end_line":331,"end_character":69},"updated":"2018-12-07 15:52:59.000000000","message":"should be \"create a volume from an image\" (or just delete the comment)","commit_id":"730140a3d744374ecf5e1bc64e87d5511e97dcae"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"507a71da829fbe70c46ceee41a34f99b9327e392","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        self.assertEqual(http_client.OK, response.status_int)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @mock.patch.object(volume_api.API, \u0027get\u0027)"},{"line_number":336,"context_line":"    def test_owner_cannot_update_volumes_for_others(self, mock_volume):"},{"line_number":337,"context_line":"        owner_context \u003d self.user_context"},{"line_number":338,"context_line":"        non_owner_context \u003d self.other_user_context"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_6ee0572e","line":336,"updated":"2018-12-19 17:15:59.000000000","message":"I don\u0027t see test coverage for admin being able to delete other\u0027s volumes. Probably less of a concern, but might be nice to have all combinations covered.","commit_id":"c4fb7f4e2e0700ed917035880fe5fe357ce20b13"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"de1d50fcf230996efeff0c76a0f8a912e2b19728","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        self.assertEqual(http_client.OK, response.status_int)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    @mock.patch.object(volume_api.API, \u0027get\u0027)"},{"line_number":336,"context_line":"    def test_owner_cannot_update_volumes_for_others(self, mock_volume):"},{"line_number":337,"context_line":"        owner_context \u003d self.user_context"},{"line_number":338,"context_line":"        non_owner_context \u003d self.other_user_context"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_089e7066","line":336,"in_reply_to":"3f79a3b5_6ee0572e","updated":"2018-12-20 03:15:38.000000000","message":"Yes, for admin_or_owner, we need:\n1. admin can update\n2. owner can update\n3. normal user can\u0027t update others.","commit_id":"c4fb7f4e2e0700ed917035880fe5fe357ce20b13"}]}
