)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f357f830862183b6accd0dde5823b0a2b7a22965","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"TODO: figure out how to fix it."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ic064785226ee70ee475d8f72fea3c2ae6971a07f"},{"line_number":15,"context_line":"Fixes: bug/1190708"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPn%2F%2Fy28%3D","line":14,"updated":"2013-06-21 03:50:24.000000000","message":"Tried clicking the bug link below, does Gerrit pick up on that format? \"bug/XXXXXX? vs. bug XXXXXX?","commit_id":"db8cd27260b128c417dd2bb4d896244bc23f4c21"}],"tests/test_no_admin_token_auth.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"8ede00072ccb2d2beff8e53966ecff7a9a568819","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        admin_server \u003d self.serveapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027)"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            admin_port \u003d admin_server.socket_info[\u0027socket\u0027][1]"},{"line_number":38,"context_line":"            admin_endpoint \u003d \u0027http://localhost:%s/v2.0\u0027 % admin_port"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"            kc \u003d ks_client.Client(auth_url\u003dadmin_endpoint,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FbpI%3D","line":37,"updated":"2013-07-02 03:52:08.000000000","message":"Don\u0027t use the serveapp method, the same thing can be accomplished with webtest and calling the api.","commit_id":"113b604ef7d1e5d02623b5ddf5649d74436ac88e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ea1af80faca106d253177cfb4c517f1b5bfddcc4","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        admin_server \u003d self.serveapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027)"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            admin_port \u003d admin_server.socket_info[\u0027socket\u0027][1]"},{"line_number":38,"context_line":"            admin_endpoint \u003d \u0027http://localhost:%s/v2.0\u0027 % admin_port"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"            kc \u003d ks_client.Client(auth_url\u003dadmin_endpoint,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FY9M%3D","line":37,"in_reply_to":"AAAAPn%2F%2FZig%3D","updated":"2013-07-02 20:50:17.000000000","message":"I think I might have figured it out... check out the new patch set. \n\nIf we\u0027re not supposed to use serveapp then why is it there?","commit_id":"113b604ef7d1e5d02623b5ddf5649d74436ac88e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"23a69c859235f27638c1a77ee91a6b9d38e36f9e","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        admin_server \u003d self.serveapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027)"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            admin_port \u003d admin_server.socket_info[\u0027socket\u0027][1]"},{"line_number":38,"context_line":"            admin_endpoint \u003d \u0027http://localhost:%s/v2.0\u0027 % admin_port"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"            kc \u003d ks_client.Client(auth_url\u003dadmin_endpoint,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FZig%3D","line":37,"in_reply_to":"AAAAPn%2F%2FbpI%3D","updated":"2013-07-02 18:08:16.000000000","message":"do you have an example?","commit_id":"113b604ef7d1e5d02623b5ddf5649d74436ac88e"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d392782005c5d5af19ddd7daf37cf67452e1c839","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        r \u003d admin_app.request("},{"line_number":46,"context_line":"            \u0027/v3/auth/tokens\u0027,"},{"line_number":47,"context_line":"            method\u003d\u0027POST\u0027,"},{"line_number":48,"context_line":"            body_file\u003dio.BytesIO(jsonutils.dumps({"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYXs%3D","line":45,"updated":"2013-07-02 23:22:48.000000000","message":"Using app.request is tricky and was done that way to make a common requests entry point for the content_type tests as this kept it close to the original structure. You can use admin_app.post_json directly here\n\nhttp://webtest.pythonpaste.org/en/latest/testapp.html#making-json-requests","commit_id":"00fd8fd07e7f47d6d5b30e34da2bfc32e121a8ae"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d392782005c5d5af19ddd7daf37cf67452e1c839","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        # If the following does not raise, then the test is successful."},{"line_number":72,"context_line":"        admin_app.request(\u0027/v2.0/tenants\u0027, headers\u003d{\u0027X-Auth-Token\u0027: token})"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FYXc%3D","line":72,"updated":"2013-07-02 23:22:48.000000000","message":"use admin_app.get","commit_id":"00fd8fd07e7f47d6d5b30e34da2bfc32e121a8ae"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"db35ac53810916ce3153d1463f2a74922ff22bab","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        super(TestNoAdminTokenAuth, self).setUp()"},{"line_number":27,"context_line":"        self.load_backends()"},{"line_number":28,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_request_no_admin_token_auth(self):"},{"line_number":31,"context_line":"        # This test verifies that if the admin_token_auth middleware isn\u0027t"},{"line_number":32,"context_line":"        # in the paste pipeline that users can still make requests."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYUI%3D","line":29,"updated":"2013-07-02 23:46:46.000000000","message":"What about a tearDown that cleans up no_admin_token_auth-paste.ini after tests","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"501b5659ae18578f8ddd78e72b9c45e4706d6fca","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        super(TestNoAdminTokenAuth, self).setUp()"},{"line_number":27,"context_line":"        self.load_backends()"},{"line_number":28,"context_line":"        self.load_fixtures(default_fixtures)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_request_no_admin_token_auth(self):"},{"line_number":31,"context_line":"        # This test verifies that if the admin_token_auth middleware isn\u0027t"},{"line_number":32,"context_line":"        # in the paste pipeline that users can still make requests."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FWSk%3D","line":29,"in_reply_to":"AAAAPn%2F%2FYUI%3D","updated":"2013-07-03 15:33:56.000000000","message":"Done","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"db35ac53810916ce3153d1463f2a74922ff22bab","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            self.user_foo[\u0027id\u0027], self.tenant_bar[\u0027id\u0027],"},{"line_number":38,"context_line":"            dict(roles\u003d[self.role_admin[\u0027id\u0027]], is_admin\u003d\u00271\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        _generate_paste_config()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYUE%3D","line":40,"updated":"2013-07-02 23:46:46.000000000","message":"which i guess would make this part of setUp","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"501b5659ae18578f8ddd78e72b9c45e4706d6fca","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            self.user_foo[\u0027id\u0027], self.tenant_bar[\u0027id\u0027],"},{"line_number":38,"context_line":"            dict(roles\u003d[self.role_admin[\u0027id\u0027]], is_admin\u003d\u00271\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        _generate_paste_config()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FWSg%3D","line":40,"in_reply_to":"AAAAPn%2F%2FYUE%3D","updated":"2013-07-03 15:33:56.000000000","message":"Done","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"db35ac53810916ce3153d1463f2a74922ff22bab","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        _generate_paste_config()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        r \u003d admin_app.post_json("},{"line_number":46,"context_line":"            \u0027/v3/auth/tokens\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYT8%3D","line":43,"updated":"2013-07-02 23:46:46.000000000","message":"maybe this should be setUp as well then?","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"501b5659ae18578f8ddd78e72b9c45e4706d6fca","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        _generate_paste_config()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        r \u003d admin_app.post_json("},{"line_number":46,"context_line":"            \u0027/v3/auth/tokens\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FWSY%3D","line":43,"in_reply_to":"AAAAPn%2F%2FYT8%3D","updated":"2013-07-03 15:33:56.000000000","message":"Done","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"da35b9111d7b7b964da2ca552ff917623f6f7bb6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        r \u003d admin_app.post_json("},{"line_number":46,"context_line":"            \u0027/v3/auth/tokens\u0027,"},{"line_number":47,"context_line":"            {"},{"line_number":48,"context_line":"                \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FYKY%3D","line":45,"updated":"2013-07-03 00:35:14.000000000","message":"you really don\u0027t need all that, all you care is getting a 401 instead of 500 for an operation which requires admin role","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"501b5659ae18578f8ddd78e72b9c45e4706d6fca","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        admin_app \u003d webtest.TestApp("},{"line_number":43,"context_line":"            self.loadapp(\u0027no_admin_token_auth\u0027, name\u003d\u0027admin\u0027))"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        r \u003d admin_app.post_json("},{"line_number":46,"context_line":"            \u0027/v3/auth/tokens\u0027,"},{"line_number":47,"context_line":"            {"},{"line_number":48,"context_line":"                \u0027auth\u0027: {"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FWR8%3D","line":45,"in_reply_to":"AAAAPn%2F%2FYKY%3D","updated":"2013-07-03 15:33:56.000000000","message":"@gyee - I don\u0027t know how I\u0027m going to perform a request without a token.","commit_id":"903ce955f11bd6a24e2aac29c5fb60aaa61626a3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ba25aeff47b523df3e0ed6d793f67fabd5fb22f1","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # Assigns user_foo admin role, user_foo should be able to do admin"},{"line_number":43,"context_line":"        # operations."},{"line_number":44,"context_line":"        self.identity_api.update_metadata("},{"line_number":45,"context_line":"            self.user_foo[\u0027id\u0027], self.tenant_bar[\u0027id\u0027],"},{"line_number":46,"context_line":"            dict(roles\u003d[self.role_admin[\u0027id\u0027]], is_admin\u003d\u00271\u0027))"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVrs%3D","line":44,"updated":"2013-07-03 18:25:10.000000000","message":"You really don\u0027t need to go through all that trouble. All you really care is getting a 401 instead of 500. You just need\n\nself.admin_app.request(REQ_PATH, headers\u003d{\u0027X-Auth-Token\u0027: \u0027Bogus\u0027}, expected_status\u003d401)\n\nYou don\u0027t need line 42-71","commit_id":"c36b76b3bcd369fa7846f61697eff95093f94162"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4acc2a37fcdef7a4f50b9632a9d6e073d64054d7","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # Assigns user_foo admin role, user_foo should be able to do admin"},{"line_number":43,"context_line":"        # operations."},{"line_number":44,"context_line":"        self.identity_api.update_metadata("},{"line_number":45,"context_line":"            self.user_foo[\u0027id\u0027], self.tenant_bar[\u0027id\u0027],"},{"line_number":46,"context_line":"            dict(roles\u003d[self.role_admin[\u0027id\u0027]], is_admin\u003d\u00271\u0027))"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVNQ%3D","line":44,"in_reply_to":"AAAAPn%2F%2FVOw%3D","updated":"2013-07-03 21:16:27.000000000","message":"ok, found a workaround, can pass the REMOTE_ADDR in the environment.","commit_id":"c36b76b3bcd369fa7846f61697eff95093f94162"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f50bbb71c41ab8b6c419642383776eac842850f5","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        # Assigns user_foo admin role, user_foo should be able to do admin"},{"line_number":43,"context_line":"        # operations."},{"line_number":44,"context_line":"        self.identity_api.update_metadata("},{"line_number":45,"context_line":"            self.user_foo[\u0027id\u0027], self.tenant_bar[\u0027id\u0027],"},{"line_number":46,"context_line":"            dict(roles\u003d[self.role_admin[\u0027id\u0027]], is_admin\u003d\u00271\u0027))"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FVOw%3D","line":44,"in_reply_to":"AAAAPn%2F%2FVrs%3D","updated":"2013-07-03 21:07:52.000000000","message":"This is the error I get when I don\u0027t have a token:\n\n Traceback (most recent call last):                                                     \n  File \"/opt/stack/keystone/tests/test_no_admin_token_auth.py\", line 54, in test_request_no_admin_token_auth\n    self.admin_app.get(REQ_PATH, headers\u003d{\u0027X-Auth-Token\u0027: \u0027NotAdminToken\u0027})                                 \n  File \"/opt/stack/keystone/.venv/local/lib/python2.7/site-packages/webtest/app.py\", line 199, in get       \n    expect_errors\u003dexpect_errors)                                                                            \n  File \"/opt/stack/keystone/.venv/local/lib/python2.7/site-packages/webtest/app.py\", line 489, in do_request\n    self._check_status(status, res)                                                                         \n  File \"/opt/stack/keystone/.venv/local/lib/python2.7/site-packages/webtest/app.py\", line 518, in _check_status\n    res)                                                                                                       \n AppError: Bad response: 500 Internal Server Error (not 200 OK or 3xx redirect for  \n http://localhost/v2.0/tenants/tenants/tenants/tenants)\n\n \u0027{\"error\": {\"message\": \"An unexpected error prevented the server from fulfilling your request. \\\u0027REMOTE_ADDR\\\u0027\", \"code\": 500, \"title\": \"Internal Server Error\"}}\u0027\n\nI get a 500 error and not a 401.","commit_id":"c36b76b3bcd369fa7846f61697eff95093f94162"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a26ac77d7d4d27bb5b0530d80c3ccd4791309a7b","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import os"},{"line_number":3,"context_line":"import webtest"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAP3%2F%2F8h0%3D","line":1,"updated":"2013-07-08 18:58:12.000000000","message":"license header","commit_id":"19fb6fc37760c3983ac9bfdd0bdeda48654533ab"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a26ac77d7d4d27bb5b0530d80c3ccd4791309a7b","unresolved":false,"context_lines":[{"line_number":1,"context_line":""},{"line_number":2,"context_line":"import os"},{"line_number":3,"context_line":"import webtest"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"from keystone import test"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAP3%2F%2F8hs%3D","line":2,"updated":"2013-07-08 18:58:12.000000000","message":"whitespace after os import","commit_id":"19fb6fc37760c3983ac9bfdd0bdeda48654533ab"}]}
