)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"2914018d2a548afb63e323fddca7a3a08fb4e3c8","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Closes-Bug: #1682425"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Conflicts:"},{"line_number":24,"context_line":"\ttempest/lib/services/identity/v3/__init__.py"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I4c5369ae3ad7a7add630e3ac6a4fc52f854bc77c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5f201791_7d096f2a","line":24,"updated":"2017-06-22 07:41:57.000000000","message":"What does this mean? If this patch conflicts with some other patches, you just need to resolve it. I feel this is just weird.","commit_id":"c34e112c3784d19a0801f251b2efa70b71da8f78"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"fbee7a750364125d59b38b693d2b2796f72af010","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Closes-Bug: #1682425"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Conflicts:"},{"line_number":24,"context_line":"\ttempest/lib/services/identity/v3/__init__.py"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Change-Id: I4c5369ae3ad7a7add630e3ac6a4fc52f854bc77c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5f201791_5da2334d","line":24,"in_reply_to":"5f201791_7d096f2a","updated":"2017-06-22 08:08:41.000000000","message":"Thanks for reviewing the code. Conflict message is removed from commit message.","commit_id":"c34e112c3784d19a0801f251b2efa70b71da8f78"}],"tempest/lib/common/utils/oauth_utils.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"74f62f0f515fedef7d944e0d19129ce8a92768e7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 AT\u0026T Corporation."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f044301_0207dc1e","line":1,"updated":"2017-05-04 10:47:39.000000000","message":"Given that the 5 functions defined here are not reused, maybe it makes sense to move these 5 func directly in identity/v3/oauth_token_client.py","commit_id":"1e5ce84db4cdee5bccb1c0afa01914254562da53"}],"tempest/lib/services/identity/v3/oauth_consumers_client.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        body \u003d json.loads(body)"},{"line_number":95,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def create_request_token(self, oauth_signed_headers):"},{"line_number":98,"context_line":"        \"\"\"Create request token."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_c232a25e","line":97,"range":{"start_line":97,"start_character":35,"end_line":97,"end_character":55},"updated":"2017-04-19 16:13:44.000000000","message":"requested_project_id","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2bad6c1862affb7334d2566a76efc7974ffd0d19","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        body \u003d json.loads(body)"},{"line_number":95,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def create_request_token(self, oauth_signed_headers):"},{"line_number":98,"context_line":"        \"\"\"Create request token."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_f52e7790","line":97,"range":{"start_line":97,"start_character":35,"end_line":97,"end_character":55},"in_reply_to":"7ffa3b31_a811b706","updated":"2017-04-19 17:50:17.000000000","message":"My best guess is that consumer_id and project_id should be in the method signature then added to the headers with the appropriate keys, \"oauth_consumer_key\" and \"Requested-Project-Id\". However, I do believe something more experienced than me should determine that.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        body \u003d json.loads(body)"},{"line_number":95,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def create_request_token(self, oauth_signed_headers):"},{"line_number":98,"context_line":"        \"\"\"Create request token."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_a811b706","line":97,"range":{"start_line":97,"start_character":35,"end_line":97,"end_character":55},"in_reply_to":"7ffa3b31_c232a25e","updated":"2017-04-19 17:05:04.000000000","message":"Keystone api-ref document for OAUTH1 API is not correct. Please refer https://github.com/openstack/keystone/blob/master/keystone/oauth1/controllers.py#L220\n\nProper oauth_headers with oauth_consumer_key, Requested-Project-Id need to be passed.\nThats the reason for having oauth_signed_headers as argument so that proper headers can be accepted from the modules that uses this client and pass them to API.\n\nOther way to resolve this is add consumer_key, project_id as arguments and construct the oauth header within this function using oauth library. This adds introducing oauth python library as part of requirements.txt.\n\nPlease suggest which way is preferable.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"8e1b65a3813eaae57258e903b9afd3b2dfe2acd3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        body \u003d json.loads(body)"},{"line_number":95,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def create_request_token(self, oauth_signed_headers):"},{"line_number":98,"context_line":"        \"\"\"Create request token."},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_f5531716","line":97,"range":{"start_line":97,"start_character":35,"end_line":97,"end_character":55},"in_reply_to":"7ffa3b31_f52e7790","updated":"2017-04-19 17:50:49.000000000","message":"someone* not something* :)","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        API reference:"},{"line_number":102,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#create-request-token"},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/request_token\","},{"line_number":105,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":106,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_c2fd026f","line":105,"range":{"start_line":104,"start_character":8,"end_line":105,"end_character":71},"updated":"2017-04-19 16:13:44.000000000","message":"This doesn\u0027t seem correct according to: https://developer.openstack.org/api-ref/identity/v3-ext/?expanded\u003dcreate-request-token-detail\n\nThis API takes requested_project_id in the body.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        API reference:"},{"line_number":102,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#create-request-token"},{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/request_token\","},{"line_number":105,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":106,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_4800f3ab","line":105,"range":{"start_line":104,"start_character":8,"end_line":105,"end_character":71},"in_reply_to":"7ffa3b31_c2fd026f","updated":"2017-04-19 17:05:04.000000000","message":"Keystone api-ref document for OAUTH1 API is not correct. Please refer https://github.com/openstack/keystone/blob/master/keystone/oauth1/controllers.py#L220\n\nProper oauth_headers with oauth_consumer_key, Requested-Project-Id need to be passed.\nThats the reason for having oauth_signed_headers as argument so that proper headers can be accepted from the modules that uses this client and pass them to API.\n\nOther way to resolve this is add consumer_key, project_id as arguments and construct the oauth header within this function using oauth library. This adds introducing oauth python library as part of requirements.txt.\n\nPlease suggest which way is preferable.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/request_token\","},{"line_number":105,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":106,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_22eee6b3","line":106,"range":{"start_line":106,"start_character":30,"end_line":106,"end_character":33},"updated":"2017-04-19 16:13:44.000000000","message":"200 according to API.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\""},{"line_number":104,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/request_token\","},{"line_number":105,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":106,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_28fda7b0","line":106,"range":{"start_line":106,"start_character":30,"end_line":106,"end_character":33},"in_reply_to":"7ffa3b31_22eee6b3","updated":"2017-04-19 17:05:04.000000000","message":"Done, This is a bug in keystone API documentation, please see https://review.openstack.org/#/c/457896/\n\n201 is the correct response code","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def authorize_request_token(self, request_token_id, role_id):"},{"line_number":111,"context_line":"        \"\"\"Authorize request token."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_027beaf4","line":110,"range":{"start_line":110,"start_character":56,"end_line":110,"end_character":63},"updated":"2017-04-19 16:13:44.000000000","message":"This should be role_ids: API shows it\u0027s possible to pass in many role_ids: https://developer.openstack.org/api-ref/identity/v3-ext/?expanded\u003dauthorize-request-token-detail","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        body \u003d json.loads(body)"},{"line_number":108,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def authorize_request_token(self, request_token_id, role_id):"},{"line_number":111,"context_line":"        \"\"\"Authorize request token."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_68e5ef08","line":110,"range":{"start_line":110,"start_character":56,"end_line":110,"end_character":63},"in_reply_to":"7ffa3b31_027beaf4","updated":"2017-04-19 17:05:04.000000000","message":"Will update in next patch","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        API reference:"},{"line_number":115,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#authorize-request-token"},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_id}]}"},{"line_number":118,"context_line":"        post_body \u003d json.dumps(body)"},{"line_number":119,"context_line":"        resp, body \u003d self.put(\"OS-OAUTH1/authorize/%s\" % request_token_id,"},{"line_number":120,"context_line":"                              post_body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_626bce1d","line":117,"range":{"start_line":117,"start_character":25,"end_line":117,"end_character":42},"updated":"2017-04-19 16:13:44.000000000","message":"[{\u0027id\u0027: role_id} for role_id in role_ids]","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        API reference:"},{"line_number":115,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#authorize-request-token"},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        body \u003d {\u0027roles\u0027: [{\u0027id\u0027: role_id}]}"},{"line_number":118,"context_line":"        post_body \u003d json.dumps(body)"},{"line_number":119,"context_line":"        resp, body \u003d self.put(\"OS-OAUTH1/authorize/%s\" % request_token_id,"},{"line_number":120,"context_line":"                              post_body)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_48eeb3ed","line":117,"range":{"start_line":117,"start_character":25,"end_line":117,"end_character":42},"in_reply_to":"7ffa3b31_626bce1d","updated":"2017-04-19 17:05:04.000000000","message":"will update in next patch","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        body \u003d json.loads(body)"},{"line_number":123,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_access_token(self, oauth_signed_headers):"},{"line_number":126,"context_line":"        \"\"\"Create access token."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_62d98ef1","line":125,"range":{"start_line":125,"start_character":34,"end_line":125,"end_character":54},"updated":"2017-04-19 16:13:44.000000000","message":"Remove, this API doesn\u0027t take request attributes.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        body \u003d json.loads(body)"},{"line_number":123,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_access_token(self, oauth_signed_headers):"},{"line_number":126,"context_line":"        \"\"\"Create access token."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_088c2b34","line":125,"range":{"start_line":125,"start_character":34,"end_line":125,"end_character":54},"in_reply_to":"7ffa3b31_62d98ef1","updated":"2017-04-19 17:05:04.000000000","message":"Keystone api-ref document for OAUTH1 API is not correct. Please refer https://github.com/openstack/keystone/blob/master/keystone/oauth1/controllers.py#L277\n\nProper oauth_headers with oauth_consumer_key, oauth_token, oauth_verifier need to be passed.\nThats the reason for having oauth_signed_headers as argument so that proper headers can be accepted from the modules that uses this client and pass them to API.\n\nOther way to resolve this is add oauth_consumer_key, oauth_token, oauth_verifier as arguments to this function and construct the oauth header within this function using oauth library. This adds introducing oauth python library as part of requirements.txt.\n\nPlease suggest which way is preferable.","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cb399b6e10dc2e3f1dee7000d4dfeba6fb2a24b0","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/access_token\","},{"line_number":133,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":134,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":135,"context_line":"        body \u003d json.loads(body)"},{"line_number":136,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_c259828e","line":134,"range":{"start_line":134,"start_character":30,"end_line":134,"end_character":33},"updated":"2017-04-19 16:13:44.000000000","message":"200: https://developer.openstack.org/api-ref/identity/v3-ext/?expanded\u003dcreate-access-token-detail","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"3bbe58b932fffd8acda37e3547f3492f2d71afe1","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        resp, body \u003d self.post(\"OS-OAUTH1/access_token\","},{"line_number":133,"context_line":"                               body\u003dNone, headers\u003doauth_signed_headers)"},{"line_number":134,"context_line":"        self.expected_success(201, resp.status)"},{"line_number":135,"context_line":"        body \u003d json.loads(body)"},{"line_number":136,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7ffa3b31_e8957f34","line":134,"range":{"start_line":134,"start_character":30,"end_line":134,"end_character":33},"in_reply_to":"7ffa3b31_c259828e","updated":"2017-04-19 17:05:04.000000000","message":"Done, This is a bug in keystone API documentation, please see https://review.openstack.org/#/c/457896/\n\n201 is the correct response code","commit_id":"6c44960fe97413547b6c3ec30c38ac5846afc974"}],"tempest/lib/services/identity/v3/oauth_token_client.py":[{"author":{"_account_id":7350,"name":"Jordan Pittier","email":"jordan.pittier@gmail.com","username":"JordanP"},"change_message_id":"ce9db28083ccd255d3bae7ff916521ef899c9112","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oauthlib import oauth1"},{"line_number":17,"context_line":"from oslo_serialization import jsonutils as json"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from tempest.lib.common import rest_client"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_e1fa1c41","line":16,"updated":"2017-04-20 13:51:12.000000000","message":"We shouldn\u0027t depend on yet another external library. Given that tempest is a requirement to more and more openstack projets, each new dependency has a lot of impact. \n\nYou only use the sign() method of your oauth client, which, if you only take what you really need, boils down to 20 lines of code. You should inline that function here, and remove your dependency on oauth client. It\u0027s not worth it for 20 LoC.","commit_id":"a83da0e40d4239c542b1bf5f0edaa6e9b59a1a42"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"57457665b5fe0fed20ef41c96687a6666d093b09","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from oauthlib import oauth1"},{"line_number":17,"context_line":"from oslo_serialization import jsonutils as json"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from tempest.lib.common import rest_client"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_a01ede6d","line":16,"in_reply_to":"7ffa3b31_e1fa1c41","updated":"2017-04-24 10:21:36.000000000","message":"Uploaded the functionality instead of using oauth library in patch set 4.","commit_id":"a83da0e40d4239c542b1bf5f0edaa6e9b59a1a42"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"4bbdc8b9dec0f694dfea38134a8260c543ca9729","unresolved":false,"context_lines":[{"line_number":30,"context_line":"class OAUTHTokenClient(rest_client.RestClient):"},{"line_number":31,"context_line":"    api_version \u003d \"v3\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _generate_timestamp(self):"},{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"},{"line_number":43,"context_line":"        \"\"\"Escape a unicode string in an OAuth-compatible fashion.\"\"\""},{"line_number":44,"context_line":"        safe \u003d b\u0027~\u0027"},{"line_number":45,"context_line":"        s \u003d s.encode(\u0027utf-8\u0027) if isinstance(s, six.text_type) else s"},{"line_number":46,"context_line":"        s \u003d urlparse.quote(s, safe)"},{"line_number":47,"context_line":"        if isinstance(s, six.binary_type):"},{"line_number":48,"context_line":"            s \u003d s.decode(\u0027utf-8\u0027)"},{"line_number":49,"context_line":"        return s"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _generate_params_with_signature(self, client_key, uri,"},{"line_number":52,"context_line":"                                        client_secret\u003dNone,"},{"line_number":53,"context_line":"                                        resource_owner_key\u003dNone,"},{"line_number":54,"context_line":"                                        resource_owner_secret\u003dNone,"},{"line_number":55,"context_line":"                                        callback_uri\u003dNone,"},{"line_number":56,"context_line":"                                        verifier\u003dNone,"},{"line_number":57,"context_line":"                                        http_method\u003d\u0027GET\u0027):"},{"line_number":58,"context_line":"        oauth_params \u003d ["},{"line_number":59,"context_line":"            (\u0027oauth_nonce\u0027, self._generate_nonce()),"},{"line_number":60,"context_line":"            (\u0027oauth_timestamp\u0027, self._generate_timestamp()),"},{"line_number":61,"context_line":"            (\u0027oauth_version\u0027, \u00271.0\u0027),"},{"line_number":62,"context_line":"            (\u0027oauth_signature_method\u0027, \u0027HMAC-SHA1\u0027),"},{"line_number":63,"context_line":"            (\u0027oauth_consumer_key\u0027, client_key),"},{"line_number":64,"context_line":"        ]"},{"line_number":65,"context_line":"        if resource_owner_key:"},{"line_number":66,"context_line":"            oauth_params.append((\u0027oauth_token\u0027, resource_owner_key))"},{"line_number":67,"context_line":"        if callback_uri:"},{"line_number":68,"context_line":"            oauth_params.append((\u0027oauth_callback\u0027, callback_uri))"},{"line_number":69,"context_line":"        if verifier:"},{"line_number":70,"context_line":"            oauth_params.append((\u0027oauth_verifier\u0027, verifier))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # normalize_params"},{"line_number":73,"context_line":"        key_values \u003d [(self._escape(k), self._escape(v))"},{"line_number":74,"context_line":"                      for k, v in oauth_params]"},{"line_number":75,"context_line":"        key_values.sort()"},{"line_number":76,"context_line":"        parameter_parts \u003d [\u0027{0}\u003d{1}\u0027.format(k, v) for k, v in key_values]"},{"line_number":77,"context_line":"        normalized_params \u003d \u0027\u0026\u0027.join(parameter_parts)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # normalize_uri"},{"line_number":80,"context_line":"        scheme, netloc, path, params, query, fragment \u003d urlparse.urlparse(uri)"},{"line_number":81,"context_line":"        scheme \u003d scheme.lower()"},{"line_number":82,"context_line":"        netloc \u003d netloc.lower()"},{"line_number":83,"context_line":"        normalized_uri \u003d urlparse.urlunparse((scheme, netloc, path,"},{"line_number":84,"context_line":"                                              params, \u0027\u0027, \u0027\u0027))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # construct base string"},{"line_number":87,"context_line":"        base_string \u003d self._escape(http_method.upper())"},{"line_number":88,"context_line":"        base_string +\u003d \u0027\u0026\u0027"},{"line_number":89,"context_line":"        base_string +\u003d self._escape(normalized_uri)"},{"line_number":90,"context_line":"        base_string +\u003d \u0027\u0026\u0027"},{"line_number":91,"context_line":"        base_string +\u003d self._escape(normalized_params)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # sign using hmac-sha1"},{"line_number":94,"context_line":"        key \u003d self._escape(client_secret or \u0027\u0027)"},{"line_number":95,"context_line":"        key +\u003d \u0027\u0026\u0027"},{"line_number":96,"context_line":"        key +\u003d self._escape(resource_owner_secret or \u0027\u0027)"},{"line_number":97,"context_line":"        key_utf8 \u003d key.encode(\u0027utf-8\u0027)"},{"line_number":98,"context_line":"        text_utf8 \u003d base_string.encode(\u0027utf-8\u0027)"},{"line_number":99,"context_line":"        signature \u003d hmac.new(key_utf8, text_utf8, hashlib.sha1)"},{"line_number":100,"context_line":"        sig \u003d binascii.b2a_base64(signature.digest())[:-1].decode(\u0027utf-8\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        oauth_params.append((\u0027oauth_signature\u0027, sig))"},{"line_number":103,"context_line":"        return oauth_params"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _generate_oauth_header(self, oauth_params):"},{"line_number":106,"context_line":"        authorization_header \u003d {}"},{"line_number":107,"context_line":"        authorization_header_parameters_parts \u003d []"},{"line_number":108,"context_line":"        for oauth_parameter_name, value in oauth_params:"},{"line_number":109,"context_line":"            escaped_name \u003d self._escape(oauth_parameter_name)"},{"line_number":110,"context_line":"            escaped_value \u003d self._escape(value)"},{"line_number":111,"context_line":"            part \u003d \u0027{0}\u003d\"{1}\"\u0027.format(escaped_name, escaped_value)"},{"line_number":112,"context_line":"            authorization_header_parameters_parts.append(part)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        authorization_header_parameters \u003d \u0027, \u0027.join("},{"line_number":115,"context_line":"            authorization_header_parameters_parts)"},{"line_number":116,"context_line":"        oauth_string \u003d \u0027OAuth %s\u0027 % authorization_header_parameters"},{"line_number":117,"context_line":"        authorization_header[\u0027Authorization\u0027] \u003d oauth_string"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        return authorization_header"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":122,"context_line":"        \"\"\"Create request token."}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_c815be3e","line":119,"range":{"start_line":33,"start_character":0,"end_line":119,"end_character":35},"updated":"2017-05-01 17:02:07.000000000","message":"This part should be out of tempest.lib, the part is just wrapper and we need to keep tempest.lib simple as possible.","commit_id":"d189fe22044c025e8a9cd9a227236780b0fdd49f"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"8135b96896371fead67c803d6cc9d35738e9f2e6","unresolved":false,"context_lines":[{"line_number":30,"context_line":"class OAUTHTokenClient(rest_client.RestClient):"},{"line_number":31,"context_line":"    api_version \u003d \"v3\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _generate_timestamp(self):"},{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"},{"line_number":43,"context_line":"        \"\"\"Escape a unicode string in an OAuth-compatible fashion.\"\"\""},{"line_number":44,"context_line":"        safe \u003d b\u0027~\u0027"},{"line_number":45,"context_line":"        s \u003d s.encode(\u0027utf-8\u0027) if isinstance(s, six.text_type) else s"},{"line_number":46,"context_line":"        s \u003d urlparse.quote(s, safe)"},{"line_number":47,"context_line":"        if isinstance(s, six.binary_type):"},{"line_number":48,"context_line":"            s \u003d s.decode(\u0027utf-8\u0027)"},{"line_number":49,"context_line":"        return s"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def _generate_params_with_signature(self, client_key, uri,"},{"line_number":52,"context_line":"                                        client_secret\u003dNone,"},{"line_number":53,"context_line":"                                        resource_owner_key\u003dNone,"},{"line_number":54,"context_line":"                                        resource_owner_secret\u003dNone,"},{"line_number":55,"context_line":"                                        callback_uri\u003dNone,"},{"line_number":56,"context_line":"                                        verifier\u003dNone,"},{"line_number":57,"context_line":"                                        http_method\u003d\u0027GET\u0027):"},{"line_number":58,"context_line":"        oauth_params \u003d ["},{"line_number":59,"context_line":"            (\u0027oauth_nonce\u0027, self._generate_nonce()),"},{"line_number":60,"context_line":"            (\u0027oauth_timestamp\u0027, self._generate_timestamp()),"},{"line_number":61,"context_line":"            (\u0027oauth_version\u0027, \u00271.0\u0027),"},{"line_number":62,"context_line":"            (\u0027oauth_signature_method\u0027, \u0027HMAC-SHA1\u0027),"},{"line_number":63,"context_line":"            (\u0027oauth_consumer_key\u0027, client_key),"},{"line_number":64,"context_line":"        ]"},{"line_number":65,"context_line":"        if resource_owner_key:"},{"line_number":66,"context_line":"            oauth_params.append((\u0027oauth_token\u0027, resource_owner_key))"},{"line_number":67,"context_line":"        if callback_uri:"},{"line_number":68,"context_line":"            oauth_params.append((\u0027oauth_callback\u0027, callback_uri))"},{"line_number":69,"context_line":"        if verifier:"},{"line_number":70,"context_line":"            oauth_params.append((\u0027oauth_verifier\u0027, verifier))"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        # normalize_params"},{"line_number":73,"context_line":"        key_values \u003d [(self._escape(k), self._escape(v))"},{"line_number":74,"context_line":"                      for k, v in oauth_params]"},{"line_number":75,"context_line":"        key_values.sort()"},{"line_number":76,"context_line":"        parameter_parts \u003d [\u0027{0}\u003d{1}\u0027.format(k, v) for k, v in key_values]"},{"line_number":77,"context_line":"        normalized_params \u003d \u0027\u0026\u0027.join(parameter_parts)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # normalize_uri"},{"line_number":80,"context_line":"        scheme, netloc, path, params, query, fragment \u003d urlparse.urlparse(uri)"},{"line_number":81,"context_line":"        scheme \u003d scheme.lower()"},{"line_number":82,"context_line":"        netloc \u003d netloc.lower()"},{"line_number":83,"context_line":"        normalized_uri \u003d urlparse.urlunparse((scheme, netloc, path,"},{"line_number":84,"context_line":"                                              params, \u0027\u0027, \u0027\u0027))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # construct base string"},{"line_number":87,"context_line":"        base_string \u003d self._escape(http_method.upper())"},{"line_number":88,"context_line":"        base_string +\u003d \u0027\u0026\u0027"},{"line_number":89,"context_line":"        base_string +\u003d self._escape(normalized_uri)"},{"line_number":90,"context_line":"        base_string +\u003d \u0027\u0026\u0027"},{"line_number":91,"context_line":"        base_string +\u003d self._escape(normalized_params)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # sign using hmac-sha1"},{"line_number":94,"context_line":"        key \u003d self._escape(client_secret or \u0027\u0027)"},{"line_number":95,"context_line":"        key +\u003d \u0027\u0026\u0027"},{"line_number":96,"context_line":"        key +\u003d self._escape(resource_owner_secret or \u0027\u0027)"},{"line_number":97,"context_line":"        key_utf8 \u003d key.encode(\u0027utf-8\u0027)"},{"line_number":98,"context_line":"        text_utf8 \u003d base_string.encode(\u0027utf-8\u0027)"},{"line_number":99,"context_line":"        signature \u003d hmac.new(key_utf8, text_utf8, hashlib.sha1)"},{"line_number":100,"context_line":"        sig \u003d binascii.b2a_base64(signature.digest())[:-1].decode(\u0027utf-8\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        oauth_params.append((\u0027oauth_signature\u0027, sig))"},{"line_number":103,"context_line":"        return oauth_params"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _generate_oauth_header(self, oauth_params):"},{"line_number":106,"context_line":"        authorization_header \u003d {}"},{"line_number":107,"context_line":"        authorization_header_parameters_parts \u003d []"},{"line_number":108,"context_line":"        for oauth_parameter_name, value in oauth_params:"},{"line_number":109,"context_line":"            escaped_name \u003d self._escape(oauth_parameter_name)"},{"line_number":110,"context_line":"            escaped_value \u003d self._escape(value)"},{"line_number":111,"context_line":"            part \u003d \u0027{0}\u003d\"{1}\"\u0027.format(escaped_name, escaped_value)"},{"line_number":112,"context_line":"            authorization_header_parameters_parts.append(part)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        authorization_header_parameters \u003d \u0027, \u0027.join("},{"line_number":115,"context_line":"            authorization_header_parameters_parts)"},{"line_number":116,"context_line":"        oauth_string \u003d \u0027OAuth %s\u0027 % authorization_header_parameters"},{"line_number":117,"context_line":"        authorization_header[\u0027Authorization\u0027] \u003d oauth_string"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        return authorization_header"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":122,"context_line":"        \"\"\"Create request token."}],"source_content_type":"text/x-python","patch_set":7,"id":"5ff73747_a3704741","line":119,"range":{"start_line":33,"start_character":0,"end_line":119,"end_character":35},"in_reply_to":"5ff73747_c815be3e","updated":"2017-05-02 06:47:28.000000000","message":"This part is actually the Oauth signing fucntionality. As per initial comments, instead of importing external library oauthlib, it is suggested to bring this functionality into tempest.\nI tried to move this functionality into tempest/common/utils/ and got the following error \nT112  tempest.lib should not import local tempest code to avoid circular dependency.\n\nSo moved it to tempest/lib/common/utils/.\nIt makes sense to be in tempest/lib/common/utils as this is only used by tempest/lib/servoces/identity/v3/oauth_token_client.\n\nPlease let me know your opinion.","commit_id":"d189fe22044c025e8a9cd9a227236780b0fdd49f"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"352921ba9fc5541c9f74efbdbb0ea28e5e12bd8e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class OAUTHTokenClient(rest_client.RestClient):"},{"line_number":23,"context_line":"    api_version \u003d \"v3\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":26,"context_line":"        \"\"\"Create request token."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f044301_a6ba4007","line":25,"updated":"2017-05-06 16:32:56.000000000","message":"I think \"oauth_expires_at\" is needed so **kwargs should be here. \"oath_expires_at\" is present in the code here [0] and API documentation here [1].\n\nAlthough it looks like an API test for \"oauth_expires_at\" can\u0027t be created unless there\u0027s a feature flag for CONF.oauth1.request_token_duration.\n\n[0] https://github.com/openstack/keystone/blob/da472c5f3b9c9d80f54284300a818acc2741c7e9/keystone/oauth1/controllers.py#L264\n[1] https://developer.openstack.org/api-ref/identity/v3-ext/?expanded\u003dcreate-request-token-detail","commit_id":"1e5ce84db4cdee5bccb1c0afa01914254562da53"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"742eed74729f102c116656ef088757b23f8103dd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class OAUTHTokenClient(rest_client.RestClient):"},{"line_number":23,"context_line":"    api_version \u003d \"v3\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":26,"context_line":"        \"\"\"Create request token."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_0540e855","line":25,"in_reply_to":"3f044301_a6ba4007","updated":"2017-05-16 06:08:29.000000000","message":"oauth_expires_at is a response param to /v3/OS-OAUTH1/request_token and not a request parameter. So even this is passed as param to function, cannot be passed to keystone api server. \nSo not sure I quite followed you. Can you elaborate your comment.","commit_id":"1e5ce84db4cdee5bccb1c0afa01914254562da53"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"352921ba9fc5541c9f74efbdbb0ea28e5e12bd8e","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def create_access_token(self, consumer_key, consumer_secret, request_key,"},{"line_number":66,"context_line":"                            request_secret, oauth_verifier):"},{"line_number":67,"context_line":"        \"\"\"Create access token."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f044301_26cf50b1","line":66,"updated":"2017-05-06 16:32:56.000000000","message":"I think you need **kwargs for the optional kwarg \"oath_expires_at\", which is used in the code here [0] and in the API documentation here [1].\n\n[0] https://github.com/openstack/keystone/blob/da472c5f3b9c9d80f54284300a818acc2741c7e9/keystone/oauth1/controllers.py#L296\n[1] https://developer.openstack.org/api-ref/identity/v3-ext/?expanded\u003dcreate-access-token-detail#create-access-token","commit_id":"1e5ce84db4cdee5bccb1c0afa01914254562da53"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"742eed74729f102c116656ef088757b23f8103dd","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        return rest_client.ResponseBody(resp, body)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def create_access_token(self, consumer_key, consumer_secret, request_key,"},{"line_number":66,"context_line":"                            request_secret, oauth_verifier):"},{"line_number":67,"context_line":"        \"\"\"Create access token."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        For more information, please refer to the official"}],"source_content_type":"text/x-python","patch_set":8,"id":"1f013ff3_a52ed4a2","line":66,"in_reply_to":"3f044301_26cf50b1","updated":"2017-05-16 06:08:29.000000000","message":"same comment as above","commit_id":"1e5ce84db4cdee5bccb1c0afa01914254562da53"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"a4329f597db98d77389907d8189f7964fec7fcb1","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _generate_timestamp(self):"},{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_0050d05c","line":35,"updated":"2017-06-22 08:34:46.000000000","message":"Basically, we\u0027re trying to avoid to have one line wrapper method.","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"36cfd1e0d1bf5aaf3c915df7feaedeae62370b57","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def _generate_timestamp(self):"},{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_23ff5635","line":35,"in_reply_to":"5f201791_0050d05c","updated":"2017-06-22 09:03:49.000000000","message":"Done","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"a4329f597db98d77389907d8189f7964fec7fcb1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_e04a74aa","line":37,"updated":"2017-06-22 08:34:46.000000000","message":"Same here","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"36cfd1e0d1bf5aaf3c915df7feaedeae62370b57","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \"\"\"Get seconds since epoch (UTC).\"\"\""},{"line_number":35,"context_line":"        return six.text_type(int(time.time()))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_03fe9a36","line":37,"in_reply_to":"5f201791_e04a74aa","updated":"2017-06-22 09:03:49.000000000","message":"Done","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"a4329f597db98d77389907d8189f7964fec7fcb1","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_c0c77812","line":39,"updated":"2017-06-22 08:34:46.000000000","message":"I think six.text_type + six.text_type \u003d six.text_type. So, I guess we don\u0027t need to wrap it with six.text_type again.","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"36cfd1e0d1bf5aaf3c915df7feaedeae62370b57","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_e3f83e4a","line":39,"in_reply_to":"5f201791_c0c77812","updated":"2017-06-22 09:03:49.000000000","message":"Done","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"a4329f597db98d77389907d8189f7964fec7fcb1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"},{"line_number":43,"context_line":"        \"\"\"Escape a unicode string in an OAuth-compatible fashion.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_a0ca3c17","line":40,"updated":"2017-06-22 08:34:46.000000000","message":"This can be six.text_type(int(time.time()))?","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"36cfd1e0d1bf5aaf3c915df7feaedeae62370b57","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def _generate_nonce(self):"},{"line_number":38,"context_line":"        \"\"\"Generate pseudorandom nonce that is unlikely to repeat.\"\"\""},{"line_number":39,"context_line":"        return six.text_type(six.text_type(random.getrandbits(64)) +"},{"line_number":40,"context_line":"                             self._generate_timestamp())"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _escape(self, s):"},{"line_number":43,"context_line":"        \"\"\"Escape a unicode string in an OAuth-compatible fashion.\"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"5f201791_839f4a02","line":40,"in_reply_to":"5f201791_a0ca3c17","updated":"2017-06-22 09:03:49.000000000","message":"Done","commit_id":"21130bf4f999c48224d9c242e07f59a1b512665c"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"cc0e318c9ce1dcdf3af85c8e8a28f8391b2d88a1","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":116,"context_line":"        \"\"\"Create request token."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        For more information, please refer to the official"},{"line_number":119,"context_line":"        API reference:"},{"line_number":120,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#create-request-token"},{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        endpoint \u003d \u0027OS-OAUTH1/request_token\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_71f5e182","line":119,"range":{"start_line":118,"start_character":8,"end_line":119,"end_character":22},"updated":"2017-06-23 21:36:36.000000000","message":"nit: I believe all these comments can be placed on 1 line rather than 2. Applies here and all other cases below.","commit_id":"5c5f777d8234dfe5442a1b7dd1e0e3e69449b51d"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"b61257b4251c11151d34298a2d45991d135a0fd8","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def create_request_token(self, consumer_key, consumer_secret, project_id):"},{"line_number":116,"context_line":"        \"\"\"Create request token."},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        For more information, please refer to the official"},{"line_number":119,"context_line":"        API reference:"},{"line_number":120,"context_line":"        http://developer.openstack.org/api-ref/identity/v3-ext/#create-request-token"},{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        endpoint \u003d \u0027OS-OAUTH1/request_token\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f201791_c02ca103","line":119,"range":{"start_line":118,"start_character":8,"end_line":119,"end_character":22},"in_reply_to":"5f201791_71f5e182","updated":"2017-06-27 08:17:44.000000000","message":"Done","commit_id":"5c5f777d8234dfe5442a1b7dd1e0e3e69449b51d"}],"tempest/tests/lib/services/identity/v3/test_oauth_token_client.py":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"ff5ee7402ca484c6c1bbef5028c7f2b07b0b8096","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        body \u003d self.FAKE_CREATE_REQUEST_TOKEN"},{"line_number":136,"context_line":"        json_body \u003d json.dumps(body)"},{"line_number":137,"context_line":"        if bytes_body:"},{"line_number":138,"context_line":"            json_body \u003d json_body.encode(\u0027utf-8\u0027)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        resp \u003d self.client.create_request_token("},{"line_number":141,"context_line":"            consumer_key\u003d\u002712345\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_49065622","line":138,"updated":"2017-06-28 04:42:24.000000000","message":"json_body is not used below.","commit_id":"f8bd3d917f659a730260149ff8a6a5c4f4e018e7"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"7d8f4fbfacb3231f8dec8636a66042155bceecd5","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        body \u003d self.FAKE_CREATE_REQUEST_TOKEN"},{"line_number":136,"context_line":"        json_body \u003d json.dumps(body)"},{"line_number":137,"context_line":"        if bytes_body:"},{"line_number":138,"context_line":"            json_body \u003d json_body.encode(\u0027utf-8\u0027)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        resp \u003d self.client.create_request_token("},{"line_number":141,"context_line":"            consumer_key\u003d\u002712345\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_d11c5079","line":138,"in_reply_to":"5f201791_49065622","updated":"2017-06-28 05:20:09.000000000","message":"Done","commit_id":"f8bd3d917f659a730260149ff8a6a5c4f4e018e7"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"ff5ee7402ca484c6c1bbef5028c7f2b07b0b8096","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        body \u003d self.FAKE_CREATE_ACCESS_TOKEN"},{"line_number":165,"context_line":"        json_body \u003d json.dumps(body)"},{"line_number":166,"context_line":"        if bytes_body:"},{"line_number":167,"context_line":"            json_body \u003d json_body.encode(\u0027utf-8\u0027)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        resp \u003d self.client.create_access_token("},{"line_number":170,"context_line":"            consumer_key\u003d\u002712345\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_2901da06","line":167,"updated":"2017-06-28 04:42:24.000000000","message":"json_body is not used below.","commit_id":"f8bd3d917f659a730260149ff8a6a5c4f4e018e7"},{"author":{"_account_id":10366,"name":"Hemanth Nakkina","email":"hemanth.nakkina@canonical.com","username":"Hemanth"},"change_message_id":"7d8f4fbfacb3231f8dec8636a66042155bceecd5","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        body \u003d self.FAKE_CREATE_ACCESS_TOKEN"},{"line_number":165,"context_line":"        json_body \u003d json.dumps(body)"},{"line_number":166,"context_line":"        if bytes_body:"},{"line_number":167,"context_line":"            json_body \u003d json_body.encode(\u0027utf-8\u0027)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        resp \u003d self.client.create_access_token("},{"line_number":170,"context_line":"            consumer_key\u003d\u002712345\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f201791_b11f946a","line":167,"in_reply_to":"5f201791_2901da06","updated":"2017-06-28 05:20:09.000000000","message":"Done","commit_id":"f8bd3d917f659a730260149ff8a6a5c4f4e018e7"}]}
