)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bccc82b058f9548f183d635b71c4dead24c46870","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a python script to illustrate how to use oauth1 to"},{"line_number":10,"context_line":"create consumers, request and access tokens, as well as"},{"line_number":11,"context_line":"how to use the oauth1 auth plugin."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9be280516351fb837d3b3e70aa53f66e4096b2ae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAWH%2F%2BsfY%3D","line":11,"updated":"2014-03-25 01:06:37.000000000","message":"there isn\u0027t an oauth blueprint still open is there?","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1839994111994e482ca700f06d697b8546bbf336","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add a python script to illustrate how to use oauth1 to"},{"line_number":10,"context_line":"create consumers, request and access tokens, as well as"},{"line_number":11,"context_line":"how to use the oauth1 auth plugin."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I9be280516351fb837d3b3e70aa53f66e4096b2ae"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAWH%2F%2BkUo%3D","line":11,"in_reply_to":"AAAAWH%2F%2BsfY%3D","updated":"2014-03-25 21:13:37.000000000","message":"I referenced the bp","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"}],"examples/scripts/exercise_v3_oauth.py":[{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"86673c5bb3dc11c28445f55472ecbb0433ae3cb5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    print(\"Creating Client based on Admin Username and Password\")"},{"line_number":56,"context_line":"    client \u003d client_for_admin_user()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    consumer \u003d client.oauth1.consumers.create(\"test-consumer\")"},{"line_number":59,"context_line":"    consumer_key \u003d consumer.id"},{"line_number":60,"context_line":"    consumer_secret \u003d consumer.secret"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F1o0%3D","line":57,"updated":"2014-03-13 13:46:27.000000000","message":"print(\"Creating a consumer\")","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"31b9836b8e1a438c8783dc104a7cb42388454d78","unresolved":false,"context_lines":[{"line_number":54,"context_line":"def main():"},{"line_number":55,"context_line":"    print(\"Creating Client based on Admin Username and Password\")"},{"line_number":56,"context_line":"    client \u003d client_for_admin_user()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    consumer \u003d client.oauth1.consumers.create(\"test-consumer\")"},{"line_number":59,"context_line":"    consumer_key \u003d consumer.id"},{"line_number":60,"context_line":"    consumer_secret \u003d consumer.secret"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F0vo%3D","line":57,"in_reply_to":"AAAAWH%2F%2F1o0%3D","updated":"2014-03-13 15:22:03.000000000","message":"Done","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"86673c5bb3dc11c28445f55472ecbb0433ae3cb5","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    print(\"Consumer Secret %s\" % consumer_secret)"},{"line_number":63,"context_line":"    print(\"Consumer Description %s\" % consumer.description)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    project_id \u003d client.projects.list(name\u003dPROJECT_NAME)[0]"},{"line_number":66,"context_line":"    request_token \u003d client.oauth1.request_tokens.create(consumer_key,"},{"line_number":67,"context_line":"                                                        consumer_secret,"},{"line_number":68,"context_line":"                                                        project_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F1oE%3D","line":65,"updated":"2014-03-13 13:46:27.000000000","message":"print(\"As the consumer, create a request token\")","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"31b9836b8e1a438c8783dc104a7cb42388454d78","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    print(\"Consumer Secret %s\" % consumer_secret)"},{"line_number":63,"context_line":"    print(\"Consumer Description %s\" % consumer.description)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    project_id \u003d client.projects.list(name\u003dPROJECT_NAME)[0]"},{"line_number":66,"context_line":"    request_token \u003d client.oauth1.request_tokens.create(consumer_key,"},{"line_number":67,"context_line":"                                                        consumer_secret,"},{"line_number":68,"context_line":"                                                        project_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F0vg%3D","line":65,"in_reply_to":"AAAAWH%2F%2F1oE%3D","updated":"2014-03-13 15:22:03.000000000","message":"Done","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"86673c5bb3dc11c28445f55472ecbb0433ae3cb5","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    print(\"Request Token Key %s\" % request_key)"},{"line_number":72,"context_line":"    print(\"Request Token Secret %s\" % request_secret)"},{"line_number":73,"context_line":"    print(\"Request Token Project %s\" % project_id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    roles \u003d [client.roles.list(name\u003dROLE_NAME)[0].id]"},{"line_number":76,"context_line":"    verifier \u003d client.oauth1.request_tokens.authorize(request_key, roles)"},{"line_number":77,"context_line":"    oauth_verifier \u003d verifier.oauth_verifier"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F1mw%3D","line":74,"updated":"2014-03-13 13:46:27.000000000","message":"print(\"As the resource owner, authorize the request token\")","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"31b9836b8e1a438c8783dc104a7cb42388454d78","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    print(\"Request Token Key %s\" % request_key)"},{"line_number":72,"context_line":"    print(\"Request Token Secret %s\" % request_secret)"},{"line_number":73,"context_line":"    print(\"Request Token Project %s\" % project_id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    roles \u003d [client.roles.list(name\u003dROLE_NAME)[0].id]"},{"line_number":76,"context_line":"    verifier \u003d client.oauth1.request_tokens.authorize(request_key, roles)"},{"line_number":77,"context_line":"    oauth_verifier \u003d verifier.oauth_verifier"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F0vc%3D","line":74,"in_reply_to":"AAAAWH%2F%2F1mw%3D","updated":"2014-03-13 15:22:03.000000000","message":"Done","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"86673c5bb3dc11c28445f55472ecbb0433ae3cb5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    oauth_verifier \u003d verifier.oauth_verifier"},{"line_number":78,"context_line":"    print(\"Authorizing Roles %s\" % roles)"},{"line_number":79,"context_line":"    print(\"OAuth Verifier %s\" % oauth_verifier)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    access_token \u003d client.oauth1.access_tokens.create(consumer_key,"},{"line_number":82,"context_line":"                                                      consumer_secret,"},{"line_number":83,"context_line":"                                                      request_key,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F1m0%3D","line":80,"updated":"2014-03-13 13:46:27.000000000","message":"print(\"As the consumer, get an access token from the authorized request token\")","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"31b9836b8e1a438c8783dc104a7cb42388454d78","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    oauth_verifier \u003d verifier.oauth_verifier"},{"line_number":78,"context_line":"    print(\"Authorizing Roles %s\" % roles)"},{"line_number":79,"context_line":"    print(\"OAuth Verifier %s\" % oauth_verifier)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    access_token \u003d client.oauth1.access_tokens.create(consumer_key,"},{"line_number":82,"context_line":"                                                      consumer_secret,"},{"line_number":83,"context_line":"                                                      request_key,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAWH%2F%2F0vY%3D","line":80,"in_reply_to":"AAAAWH%2F%2F1m0%3D","updated":"2014-03-13 15:22:03.000000000","message":"Done","commit_id":"e8c9ef177dd370b49d97288ceabdb53d69257db7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bccc82b058f9548f183d635b71c4dead24c46870","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# oauth1-configuration.html"},{"line_number":18,"context_line":"# https://github.com/openstack/keystone/blob/master/doc/source/\\"},{"line_number":19,"context_line":"# extensions/oauth1-configuration.rst"},{"line_number":20,"context_line":"# The script also depends on an admin role, project and user."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystoneclient.auth.identity import v3"},{"line_number":23,"context_line":"from keystoneclient import session"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BsfI%3D","line":20,"updated":"2014-03-25 01:06:37.000000000","message":"Could this comment be tied into the docstrings starting at line 26 below?","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1839994111994e482ca700f06d697b8546bbf336","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# oauth1-configuration.html"},{"line_number":18,"context_line":"# https://github.com/openstack/keystone/blob/master/doc/source/\\"},{"line_number":19,"context_line":"# extensions/oauth1-configuration.rst"},{"line_number":20,"context_line":"# The script also depends on an admin role, project and user."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystoneclient.auth.identity import v3"},{"line_number":23,"context_line":"from keystoneclient import session"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BkUg%3D","line":20,"in_reply_to":"AAAAWH%2F%2BmxI%3D","updated":"2014-03-25 21:13:37.000000000","message":"I removed this section entirely as the docstring covers all of it already.","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"f2a92cbc9f9bae1f9a3683f5916bfbb1b3081064","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# oauth1-configuration.html"},{"line_number":18,"context_line":"# https://github.com/openstack/keystone/blob/master/doc/source/\\"},{"line_number":19,"context_line":"# extensions/oauth1-configuration.rst"},{"line_number":20,"context_line":"# The script also depends on an admin role, project and user."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystoneclient.auth.identity import v3"},{"line_number":23,"context_line":"from keystoneclient import session"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BmxI%3D","line":20,"in_reply_to":"AAAAWH%2F%2BsfI%3D","updated":"2014-03-25 16:01:08.000000000","message":"The docstring below covers most of it already so these comments could be simply removed","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"f2a92cbc9f9bae1f9a3683f5916bfbb1b3081064","unresolved":false,"context_lines":[{"line_number":33,"context_line":"oauth1-configuration.rst"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"For more information about OAuth spec: http://tools.ietf.org/html/rfc5849"},{"line_number":36,"context_line":"\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"AUTH_URL \u003d \u0027http://10.0.2.15:5000/v3\u0027"},{"line_number":39,"context_line":"MANAGEMENT_URL \u003d \u0027http://10.0.2.15:35357/v3\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2Bmt4%3D","line":36,"updated":"2014-03-25 16:01:08.000000000","message":"Add here the note about admin role, project and user","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1839994111994e482ca700f06d697b8546bbf336","unresolved":false,"context_lines":[{"line_number":33,"context_line":"oauth1-configuration.rst"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"For more information about OAuth spec: http://tools.ietf.org/html/rfc5849"},{"line_number":36,"context_line":"\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"AUTH_URL \u003d \u0027http://10.0.2.15:5000/v3\u0027"},{"line_number":39,"context_line":"MANAGEMENT_URL \u003d \u0027http://10.0.2.15:35357/v3\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BkUE%3D","line":36,"in_reply_to":"AAAAWH%2F%2Bmt4%3D","updated":"2014-03-25 21:13:37.000000000","message":"Done","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bccc82b058f9548f183d635b71c4dead24c46870","unresolved":false,"context_lines":[{"line_number":36,"context_line":"\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"AUTH_URL \u003d \u0027http://10.0.2.15:5000/v3\u0027"},{"line_number":39,"context_line":"MANAGEMENT_URL \u003d \u0027http://10.0.2.15:35357/v3\u0027"},{"line_number":40,"context_line":"USER_NAME \u003d \u0027admin\u0027"},{"line_number":41,"context_line":"USER_PASSWORD \u003d \u0027openstack\u0027"},{"line_number":42,"context_line":"PROJECT_NAME \u003d \u0027admin\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2Bse0%3D","line":39,"updated":"2014-03-25 01:06:37.000000000","message":"Should these IP addressed be configurable?","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1839994111994e482ca700f06d697b8546bbf336","unresolved":false,"context_lines":[{"line_number":36,"context_line":"\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"AUTH_URL \u003d \u0027http://10.0.2.15:5000/v3\u0027"},{"line_number":39,"context_line":"MANAGEMENT_URL \u003d \u0027http://10.0.2.15:35357/v3\u0027"},{"line_number":40,"context_line":"USER_NAME \u003d \u0027admin\u0027"},{"line_number":41,"context_line":"USER_PASSWORD \u003d \u0027openstack\u0027"},{"line_number":42,"context_line":"PROJECT_NAME \u003d \u0027admin\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BkNY%3D","line":39,"in_reply_to":"AAAAWH%2F%2BmuE%3D","updated":"2014-03-25 21:13:37.000000000","message":"I originally thought that a user would actually open and look at the script, not blindly run it with ENV vars set. But I guess they could be a bit more helpful, so I\u0027ll add support to grab ENV vars. But I really don\u0027t want to complicate this too much, just have it as a minimal template.","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"f2a92cbc9f9bae1f9a3683f5916bfbb1b3081064","unresolved":false,"context_lines":[{"line_number":36,"context_line":"\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"AUTH_URL \u003d \u0027http://10.0.2.15:5000/v3\u0027"},{"line_number":39,"context_line":"MANAGEMENT_URL \u003d \u0027http://10.0.2.15:35357/v3\u0027"},{"line_number":40,"context_line":"USER_NAME \u003d \u0027admin\u0027"},{"line_number":41,"context_line":"USER_PASSWORD \u003d \u0027openstack\u0027"},{"line_number":42,"context_line":"PROJECT_NAME \u003d \u0027admin\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BmuE%3D","line":39,"in_reply_to":"AAAAWH%2F%2Bse0%3D","updated":"2014-03-25 16:01:08.000000000","message":"+1 fetch these from ENV or command line arguments","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1ee442ebaa0df40aa4e871a1cd70e0199dfc7086","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    print(\"Access Token Secret %s\" % access_secret)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    print(\"Creating Client based on Access Token\")"},{"line_number":99,"context_line":"    a \u003d v3.OAuth(AUTH_URL,"},{"line_number":100,"context_line":"                 consumer_key\u003dconsumer_key,"},{"line_number":101,"context_line":"                 consumer_secret\u003dconsumer_secret,"},{"line_number":102,"context_line":"                 access_key\u003daccess_key,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2B%2FmU%3D","line":99,"updated":"2014-03-21 04:33:42.000000000","message":"since auth via oauth has changed, this portion would have to change too.","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1839994111994e482ca700f06d697b8546bbf336","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    print(\"Access Token Secret %s\" % access_secret)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    print(\"Creating Client based on Access Token\")"},{"line_number":99,"context_line":"    a \u003d v3.OAuth(AUTH_URL,"},{"line_number":100,"context_line":"                 consumer_key\u003dconsumer_key,"},{"line_number":101,"context_line":"                 consumer_secret\u003dconsumer_secret,"},{"line_number":102,"context_line":"                 access_key\u003daccess_key,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAWH%2F%2BkNQ%3D","line":99,"in_reply_to":"AAAAWH%2F%2B%2FmU%3D","updated":"2014-03-25 21:13:37.000000000","message":"Done","commit_id":"cbb976feb4ab3d34f1a6ee43493f121b8645c1b8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ab98b91614819fc8b6de9f87cef3c1ec51bdcaf8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"OS_SERVICE_ENDPOINT \u003d os.environ.get(\u0027OS_SERVICE_ENDPOINT\u0027,"},{"line_number":35,"context_line":"                                     \u0027http://10.0.2.15:5000/v3\u0027)"},{"line_number":36,"context_line":"OS_SERVICE_TOKEN \u003d os.environ.get(\u0027OS_SERVICE_TOKEN\u0027, \u0027openstack\u0027)"},{"line_number":37,"context_line":"OAUTH_PROJECT_NAME \u003d os.environ.get(\u0027OAUTH_PROJECT_NAME\u0027, \u0027admin\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAWH%2F%2BiSw%3D","line":34,"updated":"2014-03-26 04:19:05.000000000","message":"Can just use os.getenv() here, and reduce these by a few characters ...","commit_id":"52d4f5f93c1dea98d1a9dd50a73ed35cc3b01ea1"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"49197cd12d3f4b3b2f78ef5d364a4c5d35f52956","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient.v3.contrib.oauth1 import auth"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\"\"\""},{"line_number":21,"context_line":"This exercise assumes keystone is running with the OS-OAUTH1 extension enabled."},{"line_number":22,"context_line":"For information about how to enable the extension visit:"},{"line_number":23,"context_line":"http://docs.openstack.org/developer/keystone/extensions/\\"},{"line_number":24,"context_line":"oauth1-configuration.html"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAW3%2F%2FmmA%3D","line":21,"updated":"2014-04-11 20:16:23.000000000","message":"I prefer example of exercise.  Exercise implies to me that this is testing (i.e. exercising ) some piece of code. Its more just a useful example","commit_id":"a7822e82737bc37c8c1c74ed80c2539936dabec7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"127d76e46e06cb54b88dca0c33f874ffceb55169","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from keystoneclient.v3.contrib.oauth1 import auth"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\"\"\""},{"line_number":21,"context_line":"This exercise assumes keystone is running with the OS-OAUTH1 extension enabled."},{"line_number":22,"context_line":"For information about how to enable the extension visit:"},{"line_number":23,"context_line":"http://docs.openstack.org/developer/keystone/extensions/\\"},{"line_number":24,"context_line":"oauth1-configuration.html"}],"source_content_type":"text/x-python","patch_set":8,"id":"7adec928_b87982fe","line":21,"in_reply_to":"AAAAW3%2F%2FmmA%3D","updated":"2014-05-08 21:25:36.000000000","message":"Done","commit_id":"a7822e82737bc37c8c1c74ed80c2539936dabec7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cf80ce567d8263d457983288d6ebc1eb245f69ce","unresolved":false,"context_lines":[{"line_number":24,"context_line":"oauth1-configuration.html"},{"line_number":25,"context_line":"or"},{"line_number":26,"context_line":"https://github.com/openstack/keystone/blob/master/doc/source/extensions/\\"},{"line_number":27,"context_line":"oauth1-configuration.rst"},{"line_number":28,"context_line":"This exercise also depends on an admin role, project and user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"For more information about OAuth spec: http://tools.ietf.org/html/rfc5849"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_d440f937","line":27,"updated":"2014-05-07 19:50:24.000000000","message":"this link seems broken? \n\nhttps://github.com/openstack/keystone/blob/master/doc/source/extensions/oauth1-configuration.rst","commit_id":"db339a34aa99bccf0173f32e79c70560b6aa4b41"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"509cab21a93928b21c8cb401ad33cd66b3462551","unresolved":false,"context_lines":[{"line_number":24,"context_line":"oauth1-configuration.html"},{"line_number":25,"context_line":"or"},{"line_number":26,"context_line":"https://github.com/openstack/keystone/blob/master/doc/source/extensions/\\"},{"line_number":27,"context_line":"oauth1-configuration.rst"},{"line_number":28,"context_line":"This exercise also depends on an admin role, project and user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"For more information about OAuth spec: http://tools.ietf.org/html/rfc5849"}],"source_content_type":"text/x-python","patch_set":9,"id":"7adec928_f41c1516","line":27,"in_reply_to":"7adec928_d440f937","updated":"2014-05-07 19:55:22.000000000","message":"good eye! the extension docs were all renamed:\n\nhttps://github.com/openstack/keystone/blob/master/doc/source/extensions/oauth1.rst","commit_id":"db339a34aa99bccf0173f32e79c70560b6aa4b41"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"81c3bc4baf920c374333fb08d45dff22bf0f5a9e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"OS_AUTH_URL \u003d os.getenv(\u0027OS_AUTH_URL\u0027, \u0027http://localhost:5000/v3\u0027)"},{"line_number":35,"context_line":"OS_MANAMGENT_URL \u003d os.getenv(\u0027OS_MANAMGENT_URL\u0027, \u0027http://localhost:35357/v3\u0027)"},{"line_number":36,"context_line":"OS_PASSWORD \u003d os.getenv(\u0027OS_PASSWORD\u0027, \u0027openstack\u0027)"},{"line_number":37,"context_line":"OS_PROJECT_NAME \u003d os.getenv(\u0027OS_PROJECT_NAME\u0027, \u0027admin\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_4572607d","line":34,"updated":"2014-05-08 12:46:37.000000000","message":"throw a try block around these, reporting the missing key.  Also,  add a(n optional) parameter for the Certs for HTTPS support.","commit_id":"1960b80c6681fc6630230655148b646a448848ec"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"81c3bc4baf920c374333fb08d45dff22bf0f5a9e","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    print(\"Creating an OAuth Consumer\")"},{"line_number":55,"context_line":"    consumer \u003d client.oauth1.consumers.create(\"test-consumer\")"},{"line_number":56,"context_line":"    consumer_key \u003d consumer.id"},{"line_number":57,"context_line":"    consumer_secret \u003d consumer.secret"},{"line_number":58,"context_line":"    print(\"Consumer Key %s\" % consumer_key)"},{"line_number":59,"context_line":"    print(\"Consumer Secret %s\" % consumer_secret)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_a569648d","line":56,"updated":"2014-05-08 12:46:37.000000000","message":"Drop the temporary variables, as they make the code harder to read.  Just use the nested variables in the print statements.","commit_id":"1960b80c6681fc6630230655148b646a448848ec"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"53dc5b6c9855eb77e9a8536208456e159dc38952","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    print(\"Creating an OAuth Consumer\")"},{"line_number":55,"context_line":"    consumer \u003d client.oauth1.consumers.create(\"test-consumer\")"},{"line_number":56,"context_line":"    consumer_key \u003d consumer.id"},{"line_number":57,"context_line":"    consumer_secret \u003d consumer.secret"},{"line_number":58,"context_line":"    print(\"Consumer Key %s\" % consumer_key)"},{"line_number":59,"context_line":"    print(\"Consumer Secret %s\" % consumer_secret)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_78553ac5","line":56,"in_reply_to":"7adec928_a569648d","updated":"2014-05-08 21:25:28.000000000","message":"Done","commit_id":"1960b80c6681fc6630230655148b646a448848ec"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"81c3bc4baf920c374333fb08d45dff22bf0f5a9e","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    print(\"Authorizing user was %s\" % t.user_id)"},{"line_number":101,"context_line":"    print(\"Authorized to work on project %s\" % t.project_name)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"main()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_c50590c3","line":103,"updated":"2014-05-08 12:46:37.000000000","message":"Make a proper python  main.","commit_id":"1960b80c6681fc6630230655148b646a448848ec"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"53dc5b6c9855eb77e9a8536208456e159dc38952","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    print(\"Authorizing user was %s\" % t.user_id)"},{"line_number":101,"context_line":"    print(\"Authorized to work on project %s\" % t.project_name)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"main()"}],"source_content_type":"text/x-python","patch_set":10,"id":"7adec928_985206dc","line":103,"in_reply_to":"7adec928_c50590c3","updated":"2014-05-08 21:25:28.000000000","message":"Done","commit_id":"1960b80c6681fc6630230655148b646a448848ec"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"735c64add549fe2908992114ec7eebf799e4a9d1","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"try:"},{"line_number":35,"context_line":"    OS_SERVICE_ENDPOINT \u003d os.environ[\u0027OS_SERVICE_ENDPOINT\u0027]"},{"line_number":36,"context_line":"    OS_SERVICE_TOKEN \u003d os.environ[\u0027OS_SERVICE_TOKEN\u0027]"},{"line_number":37,"context_line":"    #used for creating the ADMIN user"},{"line_number":38,"context_line":"    OS_PASSWORD \u003d os.environ[\u0027OS_PASSWORD\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"7adec928_860a2e77","line":35,"updated":"2014-05-17 16:57:59.000000000","message":"One possible suggestion here, maybe we could use\n    \n    os.getenv(\u0027OS_USERNAME\u0027, \u0027admin\u0027)\n\nWhich could be set to the defaults in devstack. Thoughts?\n\nTried doing some of this and there might be some issues with how the environment variables are set and how they are available in Python.","commit_id":"840c8b4e126517b38e05b4b8b822f2cb94bbcffb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7a316ad33d4d1029d61ba3ec483a2c7f533fba25","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"try:"},{"line_number":35,"context_line":"    OS_SERVICE_ENDPOINT \u003d os.environ[\u0027OS_SERVICE_ENDPOINT\u0027]"},{"line_number":36,"context_line":"    OS_SERVICE_TOKEN \u003d os.environ[\u0027OS_SERVICE_TOKEN\u0027]"},{"line_number":37,"context_line":"    #used for creating the ADMIN user"},{"line_number":38,"context_line":"    OS_PASSWORD \u003d os.environ[\u0027OS_PASSWORD\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"3ae8d1ca_e367f2e8","line":35,"in_reply_to":"7adec928_71c99078","updated":"2014-05-27 15:04:00.000000000","message":"That makes sense, thanks","commit_id":"840c8b4e126517b38e05b4b8b822f2cb94bbcffb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fb9e527fb2b9f0a0cc485fe6c758439731bb53eb","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"try:"},{"line_number":35,"context_line":"    OS_SERVICE_ENDPOINT \u003d os.environ[\u0027OS_SERVICE_ENDPOINT\u0027]"},{"line_number":36,"context_line":"    OS_SERVICE_TOKEN \u003d os.environ[\u0027OS_SERVICE_TOKEN\u0027]"},{"line_number":37,"context_line":"    #used for creating the ADMIN user"},{"line_number":38,"context_line":"    OS_PASSWORD \u003d os.environ[\u0027OS_PASSWORD\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"7adec928_71c99078","line":35,"in_reply_to":"7adec928_860a2e77","updated":"2014-05-23 20:56:02.000000000","message":"@Lance, I\u0027m with you on that one, and can see how it\u0027s super useful in the case of project name and user name. But I don\u0027t want to be inconsistent. (Some variables have defaults, and others don\u0027t).\n\nI\u0027ll wait until we actually start gating on these scripts. Then match up with whatever is happening there.","commit_id":"840c8b4e126517b38e05b4b8b822f2cb94bbcffb"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"735c64add549fe2908992114ec7eebf799e4a9d1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    OS_AUTH_URL \u003d os.environ[\u0027OS_AUTH_URL\u0027]"},{"line_number":41,"context_line":"    OS_PROJECT_NAME \u003d os.environ[\u0027OS_PROJECT_NAME\u0027]"},{"line_number":42,"context_line":"except KeyError as e:"},{"line_number":43,"context_line":"    raise SystemExit(\u0027%s environment variables not set.\u0027 % e.message)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def client_for_admin_user():"}],"source_content_type":"text/x-python","patch_set":13,"id":"7adec928_06d9be21","line":43,"updated":"2014-05-17 16:57:59.000000000","message":"(NIT): could change \u0027variables\u0027 to \u0027variable\u0027 since when this fails on a key error it will return first it fails on... or that is what I\u0027m seeing when I run this.\n\n    lbragstad@precise64:/opt/stack/python-keystoneclient/examples/scripts$ python exercise_v3_oauth.py\n     OS_SERVICE_ENDPOINT environment variables not set.\n\nOS_SERVICE_ENDPOINT is the first environment variable this script checks, but I know OS_SERVICE_TOKEN isn\u0027t set either. \n\n    lbragstad@precise64:/opt/stack/keystone$ python\n    Python 2.7.3 (default, Feb 27 2014, 19:58:35)\n    [GCC 4.6.3] on linux2\n    Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n    \u003e\u003e\u003e import os\n    \u003e\u003e\u003e os.environ[\u0027OS_SERVICE_TOKEN\u0027]\n    Traceback (most recent call last):\n      File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n      File \"/usr/lib/python2.7/UserDict.py\", line 23, in __getitem__\n      raise KeyError(key)  \n    KeyError: \u0027OS_SERVICE_TOKEN\u0027\n     \u003e\u003e\u003e\n\nSo, when someone runs this, in the worst case they will hit this Key Error every time versus trying to collect all environment variables and throwing key errors for only the ones that aren\u0027t set. \n\nFor an example script I think just changing \u0027variables\u0027 to \u0027variable\u0027 so that it makes sense when only one variable is returned works for me.","commit_id":"840c8b4e126517b38e05b4b8b822f2cb94bbcffb"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fb9e527fb2b9f0a0cc485fe6c758439731bb53eb","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    OS_AUTH_URL \u003d os.environ[\u0027OS_AUTH_URL\u0027]"},{"line_number":41,"context_line":"    OS_PROJECT_NAME \u003d os.environ[\u0027OS_PROJECT_NAME\u0027]"},{"line_number":42,"context_line":"except KeyError as e:"},{"line_number":43,"context_line":"    raise SystemExit(\u0027%s environment variables not set.\u0027 % e.message)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def client_for_admin_user():"}],"source_content_type":"text/x-python","patch_set":13,"id":"7adec928_f1a4c0ba","line":43,"in_reply_to":"7adec928_06d9be21","updated":"2014-05-23 20:56:02.000000000","message":"Done","commit_id":"840c8b4e126517b38e05b4b8b822f2cb94bbcffb"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"3249a7af74077704d9f1406635366cb25d69aa94","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"try:"},{"line_number":35,"context_line":"    OS_SERVICE_ENDPOINT \u003d os.environ[\u0027OS_SERVICE_ENDPOINT\u0027]"},{"line_number":36,"context_line":"    OS_SERVICE_TOKEN \u003d os.environ[\u0027OS_SERVICE_TOKEN\u0027]"},{"line_number":37,"context_line":"    #used for creating the ADMIN user"},{"line_number":38,"context_line":"    OS_PASSWORD \u003d os.environ[\u0027OS_PASSWORD\u0027]"},{"line_number":39,"context_line":"    OS_USERNAME \u003d os.environ[\u0027OS_USERNAME\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_ae9a2e12","line":36,"updated":"2014-05-27 17:01:48.000000000","message":"OS_SERVICE_TOKEN is not used anywhere AFAICS?","commit_id":"b10e56462ff4d2754bbb9a0eb942aee406a11fd5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a3250c398728b8e6fae46c06eb3a99386daac2ab","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"try:"},{"line_number":35,"context_line":"    OS_SERVICE_ENDPOINT \u003d os.environ[\u0027OS_SERVICE_ENDPOINT\u0027]"},{"line_number":36,"context_line":"    OS_SERVICE_TOKEN \u003d os.environ[\u0027OS_SERVICE_TOKEN\u0027]"},{"line_number":37,"context_line":"    #used for creating the ADMIN user"},{"line_number":38,"context_line":"    OS_PASSWORD \u003d os.environ[\u0027OS_PASSWORD\u0027]"},{"line_number":39,"context_line":"    OS_USERNAME \u003d os.environ[\u0027OS_USERNAME\u0027]"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_0cf85548","line":36,"updated":"2014-05-28 21:58:37.000000000","message":"i shall remove it","commit_id":"b10e56462ff4d2754bbb9a0eb942aee406a11fd5"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"3249a7af74077704d9f1406635366cb25d69aa94","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def client_for_admin_user():"},{"line_number":47,"context_line":"    return client.Client(auth_url\u003dOS_AUTH_URL,"},{"line_number":48,"context_line":"                         management_url\u003dOS_SERVICE_ENDPOINT,"},{"line_number":49,"context_line":"                         username\u003dOS_USERNAME,"},{"line_number":50,"context_line":"                         password\u003dOS_PASSWORD,"},{"line_number":51,"context_line":"                         project_name\u003dOS_PROJECT_NAME)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_0eb0828a","line":48,"updated":"2014-05-27 17:01:48.000000000","message":"Is it actually necessary to pass the endpoint here (e.g to force the client to use the v3 API?)  If so it would be good to explain why, so folks can set the auth URL and endpoint appropriately.","commit_id":"b10e56462ff4d2754bbb9a0eb942aee406a11fd5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a3250c398728b8e6fae46c06eb3a99386daac2ab","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def client_for_admin_user():"},{"line_number":47,"context_line":"    return client.Client(auth_url\u003dOS_AUTH_URL,"},{"line_number":48,"context_line":"                         management_url\u003dOS_SERVICE_ENDPOINT,"},{"line_number":49,"context_line":"                         username\u003dOS_USERNAME,"},{"line_number":50,"context_line":"                         password\u003dOS_PASSWORD,"},{"line_number":51,"context_line":"                         project_name\u003dOS_PROJECT_NAME)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3ae8d1ca_ecaa4918","line":48,"in_reply_to":"3ae8d1ca_0eb0828a","updated":"2014-05-28 21:58:37.000000000","message":"This part is just copy/pasta from ayoungs initialization scripts, https://review.openstack.org/#/c/82687/14/examples/scripts/initialize_keystone.py \n\nIf passing the endpoint is the only way to force client to use V3 API, then it\u0027s probably necessary, as oauth is v3 specific.","commit_id":"b10e56462ff4d2754bbb9a0eb942aee406a11fd5"}]}
