)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":12,"context_line":"*) Protocols used to authenticate remote users (SAML, OpenId, etc)"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I0ce62e720e797718dbfde6bfcd4b22a213985867"},{"line_number":15,"context_line":"Implements: blueprint bp/virtual-idp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F90GI%3D","line":15,"updated":"2013-12-05 16:51:08.000000000","message":"This doesn\u0027t link to the actual blueprint. \nhttps://blueprints.launchpad.net/openstack/?searchtext\u003dbp\n\nSuggest changing to; \n    blueprint virtual-idp","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b32826b84304e98e474fce0f224f13650772da59","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Marek Denis \u003cmarek.denis@cern.ch\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-12-16 15:39:18 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Virtual Identity Providers CRUD operations."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    Implementation of CRUD operations for:"},{"line_number":10,"context_line":"    *) Virtual Identity Providers"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F9G6w%3D","line":7,"updated":"2013-12-16 18:19:14.000000000","message":"Remove instances of \"Virtual\" in the message, keep the blue-print, i guess","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"}],"doc/source/configuration.rst":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"ce84605effa9d617042f98c60ba24321d48bc822","unresolved":false,"context_lines":[{"line_number":722,"context_line":"   :maxdepth: 1"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2F1tY%3D","line":725,"updated":"2014-01-07 22:10:49.000000000","message":"I hate to be anal but shouldn\u0027t the equals be extended a little farther out to match the number of characters in Federation?","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":722,"context_line":"   :maxdepth: 1"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2FzVI%3D","line":725,"in_reply_to":"AAAAUH%2F%2F0WY%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":722,"context_line":"   :maxdepth: 1"},{"line_number":723,"context_line":""},{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2F0WY%3D","line":725,"in_reply_to":"AAAAUH%2F%2F1tY%3D","updated":"2014-01-08 05:53:59.000000000","message":"actually, the equals line should be removed, since it\u0027s not a new header. but a sub-header, under \"Adding Extensions\" (line 708).\n\nmake sure there is a new line at 725, or it wont be rendered correctly. currently, it\u0027s falling under the Endpoint Filtering section: http://docs-draft.openstack.org/44/60244/9/check/gate-keystone-docs/20eb217/doc/build/html/configuration.html#adding-extensions","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"ce84605effa9d617042f98c60ba24321d48bc822","unresolved":false,"context_lines":[{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":".. toctree::"},{"line_number":730,"context_line":"   :maxdepth: 1"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2F1s8%3D","line":727,"updated":"2014-01-07 22:10:49.000000000","message":"add one more dash.   Sorry again for the egregious nit","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":".. toctree::"},{"line_number":730,"context_line":"   :maxdepth: 1"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2FzVA%3D","line":727,"in_reply_to":"AAAAUH%2F%2F0Wg%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":".. toctree::"},{"line_number":730,"context_line":"   :maxdepth: 1"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2F0Wg%3D","line":727,"in_reply_to":"AAAAUH%2F%2F1s8%3D","updated":"2014-01-08 05:53:59.000000000","message":"+1 on the extra dash","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":724,"context_line":"   extensions/endpoint_filter-configuration.rst"},{"line_number":725,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":726,"context_line":"Federation"},{"line_number":727,"context_line":"---------"},{"line_number":728,"context_line":""},{"line_number":729,"context_line":".. toctree::"},{"line_number":730,"context_line":"   :maxdepth: 1"}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2FzVE%3D","line":727,"in_reply_to":"AAAAUH%2F%2F1s8%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e0c2dc4d1727481e3bba45d55e2fd88cec1476ff","unresolved":false,"context_lines":[{"line_number":737,"context_line":".. toctree::"},{"line_number":738,"context_line":"   :maxdepth: 1"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"   extensions/federation-configuration.rst"},{"line_number":741,"context_line":""},{"line_number":742,"context_line":".. _`prepare your deployment`:"},{"line_number":743,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"AAAAUH%2F%2FXJY%3D","line":740,"updated":"2014-01-14 17:03:12.000000000","message":"was this a bad merge resolution?","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":62,"context_line":"* ``[ec2]`` - Amazon EC2 authentication driver configuration"},{"line_number":63,"context_line":"* ``[s3]`` - Amazon S3 authentication driver configuration."},{"line_number":64,"context_line":"* ``[oauth1]`` - Oauth 1.0a system driver configuration"},{"line_number":65,"context_line":"* ``[federation]`` - Federation driver configuration"},{"line_number":66,"context_line":"* ``[identity]`` - identity system driver configuration"},{"line_number":67,"context_line":"* ``[catalog]`` - service catalog driver configuration"},{"line_number":68,"context_line":"* ``[token]`` - token driver \u0026 token provider configuration"}],"source_content_type":"text/x-rst","patch_set":15,"id":"AAAAUH%2F%2FFEI%3D","line":65,"updated":"2014-01-17 17:24:52.000000000","message":"just wondering why this was stuck here and not at the end?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"}],"doc/source/extensions/federation-configuration.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Enablig Federation Extension"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"To enable the federation extension:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAATn%2F85mA%3D","line":18,"updated":"2013-12-19 01:26:32.000000000","message":"looks like threre was a mishap here, keep the bottom version","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"To enable the federation extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1. Add the federation extension driver to the ``[federation]`` section in"},{"line_number":24,"context_line":"   ``keystone.conf``. For example::"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"       [federation]"}],"source_content_type":"text/x-rst","patch_set":8,"id":"AAAAT3%2F%2F5Is%3D","line":23,"updated":"2013-12-27 19:58:57.000000000","message":"Is there only one federation driver currently?  Will there be more of these in the future?  Would be good to know what the expectations are here for the future","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"To enable the federation extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1. Add the federation extension driver to the ``[federation]`` section in"},{"line_number":24,"context_line":"   ``keystone.conf``. For example::"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"       [federation]"}],"source_content_type":"text/x-rst","patch_set":8,"id":"AAAAUH%2F%2F8Ro%3D","line":23,"in_reply_to":"AAAAT3%2F%2F5Is%3D","updated":"2014-01-06 14:05:40.000000000","message":"I think this may be the generic driver, covering all the use-cases.\nHowever then it would be worth renaming it.","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"ce84605effa9d617042f98c60ba24321d48bc822","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Enabling Federation Extension"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2F1lg%3D","line":17,"updated":"2014-01-07 22:10:49.000000000","message":"extend the equals above and below to the n.  Yes I know they \"have pills for that\"  :-)","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Enabling Federation Extension"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2FzUs%3D","line":17,"in_reply_to":"AAAAUH%2F%2F1lg%3D","updated":"2014-01-08 10:03:25.000000000","message":"it\u0027s done but I was following oauth1\u0027s patterns and there the \u0027\u003d\u0027 line ends with the last letter of the \u0027header\u0027.","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Copyright 2013 OpenStack, Foundation"},{"line_number":3,"context_line":"      All Rights Reserved."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-rst","patch_set":15,"id":"AAAAUH%2F%2B6o8%3D","line":2,"updated":"2014-01-20 20:19:18.000000000","message":"(NIT): update copyright year?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d47c7520f3a093b56c9c9afd1653d340d4ce0ad5","unresolved":false,"context_lines":[{"line_number":24,"context_line":"   ``keystone.conf``. For example::"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"       [federation]"},{"line_number":27,"context_line":"       driver \u003d keystone.contrib.federation.backends.sql.IdentityProvider"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"2. Add the ``federation_extension`` middleware to the ``api_v3`` pipeline in"},{"line_number":30,"context_line":"   ``keystone-paste.ini``. For example::"}],"source_content_type":"text/x-rst","patch_set":22,"id":"AAAAUH%2F%2Bz74%3D","line":27,"updated":"2014-01-21 21:02:59.000000000","message":"nit, we can take this as a bug, should be .Federation at the end","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"etc/keystone.conf.sample":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":342,"context_line":"# access_token_duration \u003d 86400"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"[federation]"},{"line_number":345,"context_line":"driver \u003d keystone.contrib.federation.backends.sql.IdentityProvider"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"[ssl]"},{"line_number":348,"context_line":"#enable \u003d True"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAT3%2F%2F5IY%3D","line":345,"updated":"2013-12-27 19:58:57.000000000","message":"Shouldn\u0027t this be commented out in the sample file?","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":342,"context_line":"# access_token_duration \u003d 86400"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"[federation]"},{"line_number":345,"context_line":"driver \u003d keystone.contrib.federation.backends.sql.IdentityProvider"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"[ssl]"},{"line_number":348,"context_line":"#enable \u003d True"}],"source_content_type":"application/octet-stream","patch_set":8,"id":"AAAAUH%2F%2F8NY%3D","line":345,"in_reply_to":"AAAAT3%2F%2F5IY%3D","updated":"2014-01-06 14:05:40.000000000","message":"Done","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"}],"etc/policy.json":[{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"b01bf9e4146f2220359ac0c0c7947c76a7489f7f","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    \"identity:get_federated_providers\": \"rule:admin_required\","},{"line_number":114,"context_line":"    \"identity:update_federated_provider\": \"rule:admin_required\","},{"line_number":115,"context_line":"    \"identity:delete_federated_provider\": \"rule:admin_required\","},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    \"identity:put_protocol\": \"rule:admin_required\","},{"line_number":118,"context_line":"    \"identity:update_protocol\": \"rule:admin_required\","},{"line_number":119,"context_line":"    \"identity:get_protocol\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":12,"id":"AAAAUH%2F%2FWgg%3D","line":116,"updated":"2014-01-14 18:46:52.000000000","message":"Can use \"federation\" in place of \"federated\"?\nFederated sound like verb\n\nAt the same time there should be some resemblance between API strings and collection/member names. Which below from controller  \n\ncollection_name \u003d \u0027identity_providers\u0027\nmember_name \u003d \u0027identity_provider\u0027\n\nThoughts?","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    \"identity:update_identity_provider\": \"rule:admin_required\","},{"line_number":115,"context_line":"    \"identity:delete_identity_provider\": \"rule:admin_required\","},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    \"identity:put_protocol\": \"rule:admin_required\","},{"line_number":118,"context_line":"    \"identity:update_protocol\": \"rule:admin_required\","},{"line_number":119,"context_line":"    \"identity:get_protocol\": \"rule:admin_required\","},{"line_number":120,"context_line":"    \"identity:list_protocols\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":17,"id":"AAAAUH%2F%2B16o%3D","line":117,"updated":"2014-01-21 14:58:39.000000000","message":"create_protocol - the fact that it\u0027s implemented as a PUT is irellevant here","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"}],"etc/policy.v3cloudsample.json":[{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"b01bf9e4146f2220359ac0c0c7947c76a7489f7f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"    \"identity:get_federated_providers\": \"rule:admin_required\","},{"line_number":120,"context_line":"    \"identity:update_federated_provider\": \"rule:admin_required\","},{"line_number":121,"context_line":"    \"identity:delete_federated_provider\": \"rule:admin_required\","},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    \"identity:put_protocol\": \"rule:admin_required\","},{"line_number":124,"context_line":"    \"identity:update_protocol\": \"rule:admin_required\","},{"line_number":125,"context_line":"    \"identity:get_protocol\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":12,"id":"AAAAUH%2F%2FWgc%3D","line":122,"updated":"2014-01-14 18:46:52.000000000","message":"Same comment\nFederated \u003e\u003e\u003e Federation","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    \"identity:update_identity_provider\": \"rule:admin_required\","},{"line_number":121,"context_line":"    \"identity:delete_identity_provider\": \"rule:admin_required\","},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    \"identity:put_protocol\": \"rule:admin_required\","},{"line_number":124,"context_line":"    \"identity:update_protocol\": \"rule:admin_required\","},{"line_number":125,"context_line":"    \"identity:get_protocol\": \"rule:admin_required\","},{"line_number":126,"context_line":"    \"identity:list_protocols\": \"rule:admin_required\","}],"source_content_type":"application/json","patch_set":17,"id":"AAAAUH%2F%2B14c%3D","line":123,"updated":"2014-01-21 14:58:39.000000000","message":"same","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"}],"keystone/common/config.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    \u0027federation\u0027: ["},{"line_number":150,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":151,"context_line":"                   default\u003d(\u0027keystone.contrib.federation.\u0027,"},{"line_number":152,"context_line":"                            \u0027backends.sql.IdentityProvider\u0027))],"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9G28%3D","line":151,"updated":"2013-12-16 19:46:41.000000000","message":"there\u0027s a random comma at the end of this line??","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    \u0027federation\u0027: ["},{"line_number":146,"context_line":"        cfg.StrOpt("},{"line_number":147,"context_line":"            \u0027driver\u0027, default\u003d("},{"line_number":148,"context_line":"                \u0027keystone.contrib.federation.backends.sql.IdentityProvider\u0027))],"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAT3%2F%2F5Fw%3D","line":147,"updated":"2013-12-27 19:58:57.000000000","message":"Why the extra parentheses around the default value?","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    \u0027federation\u0027: ["},{"line_number":146,"context_line":"        cfg.StrOpt("},{"line_number":147,"context_line":"            \u0027driver\u0027, default\u003d("},{"line_number":148,"context_line":"                \u0027keystone.contrib.federation.backends.sql.IdentityProvider\u0027))],"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2F8OM%3D","line":147,"in_reply_to":"AAAAT3%2F%2F5Fw%3D","updated":"2014-01-06 14:05:40.000000000","message":"Done","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    \u0027federation\u0027: ["},{"line_number":146,"context_line":"        cfg.StrOpt("},{"line_number":147,"context_line":"            \u0027driver\u0027, default\u003d\u0027keystone.contrib.federation.\u0027"},{"line_number":148,"context_line":"                              \u0027backends.sql.Federation\u0027)],"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    \u0027policy\u0027: ["}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6oQ%3D","line":147,"updated":"2014-01-20 20:19:18.000000000","message":"(NIT): could this be moved up a line to be consistent with most of the rest of the file? \n\n    \u0027federation\u0027: [\n        cfg.StrOpt(\u0027driver\u0027,\n                    default\u003d(\u0027keystone.contrib.federation\u0027\n                              \u0027.backends.sql.Federation\u0027))],","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"}],"keystone/contrib/federation/__init__.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6oE%3D","line":3,"updated":"2014-01-20 20:19:18.000000000","message":"(NIT): copyright for a newly added file?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"}],"keystone/contrib/federation/backends/__init__.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6n4%3D","line":3,"updated":"2014-01-20 20:19:18.000000000","message":"ditto","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B14I%3D","line":1,"updated":"2014-01-21 14:58:39.000000000","message":"empty files don\u0027t need copyrights","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B14E%3D","line":3,"updated":"2014-01-21 14:58:39.000000000","message":"you can\u0027t assign copyright to the foundation","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"}],"keystone/contrib/federation/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        with session.begin():"},{"line_number":95,"context_line":"            idp_ref \u003d IdentityProviderModel.from_dict(idp)"},{"line_number":96,"context_line":"            session.add(idp_ref)"},{"line_number":97,"context_line":"            session.flush()"},{"line_number":98,"context_line":"        return idp_ref.to_dict()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def delete_idp(self, idp_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90Eg%3D","line":97,"updated":"2013-12-05 16:51:08.000000000","message":"I think session.flush() calls are in the process of being pulled out as flush is automatically called on commit calls. \n\nhttp://docs.sqlalchemy.org/en/latest/orm/session.html#committing","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            session.delete(key_ref)"},{"line_number":203,"context_line":"            session.flush()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"# Potocol handling"},{"line_number":206,"context_line":"    def _get_protocol(self, session, idp_id, protocol_id):"},{"line_number":207,"context_line":"        q \u003d session.query(FederationProtocolModel)"},{"line_number":208,"context_line":"        q \u003d q.filter_by(id\u003dprotocol_id, idp_id\u003didp_id)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90FI%3D","line":205,"updated":"2013-12-05 16:51:08.000000000","message":"Protocol*","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027idp_id\u0027, \u0027mapping_id\u0027]"},{"line_number":27,"context_line":"    mutable_attributes \u003d frozenset([\u0027mapping_id\u0027])"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, autoincrement\u003dFalse)"},{"line_number":30,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":31,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":32,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9G04%3D","line":29,"updated":"2013-12-16 19:46:41.000000000","message":"you need a composite primary key between id + idp_id ... the way this is defined right now, two IdPs would be unable to use the same protocol ID (e.g. saml2)","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            raise exception.IdentityProviderNotFound(idp_id\u003didp_id)"},{"line_number":81,"context_line":"        return idp_ref"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"#NOTE(marek-denis): Shall we paginate it here, somehow?"},{"line_number":84,"context_line":"    def list_idps(self):"},{"line_number":85,"context_line":"        session \u003d self.get_session()"},{"line_number":86,"context_line":"        with session.begin():"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9EuE%3D","line":83,"updated":"2013-12-17 02:21:34.000000000","message":"no, it\u0027s not in the current api spec.","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                setattr(idp_ref, attr, getattr(new_idp, attr))"},{"line_number":105,"context_line":"        return idp_ref.to_dict()"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# Protocol management"},{"line_number":108,"context_line":"    def _get_protocol(self, session, idp_id, protocol_id):"},{"line_number":109,"context_line":"        q \u003d session.query(FederationProtocolModel)"},{"line_number":110,"context_line":"        q \u003d q.filter_by(id\u003dprotocol_id, idp_id\u003didp_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9EuA%3D","line":107,"updated":"2013-12-17 02:21:34.000000000","message":"tab this please :)","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6n0%3D","line":3,"updated":"2014-01-20 20:19:18.000000000","message":"Same copyright comment.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, autoincrement\u003dFalse)"},{"line_number":28,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":29,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":30,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":31,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":32,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027id\u0027, \u0027idp_id\u0027), dict())"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE%2BU%3D","line":30,"updated":"2014-01-17 17:24:52.000000000","message":"mapping ID is required according to the spec, so this column shouldn\u0027t be nullable.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1b6a7007d027eeb72f81328210bd7da60c9a26c3","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, autoincrement\u003dFalse)"},{"line_number":28,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":29,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":30,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":31,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":32,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027id\u0027, \u0027idp_id\u0027), dict())"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEPo%3D","line":30,"in_reply_to":"AAAAUH%2F%2FE%2BU%3D","updated":"2014-01-17 19:10:53.000000000","message":"++","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, autoincrement\u003dFalse)"},{"line_number":28,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":29,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":30,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":31,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":32,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027id\u0027, \u0027idp_id\u0027), dict())"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBOQ%3D","line":30,"in_reply_to":"AAAAUH%2F%2FE%2BU%3D","updated":"2014-01-18 22:04:10.000000000","message":"will remove.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":29,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":30,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":31,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":32,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027id\u0027, \u0027idp_id\u0027), dict())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE%2BE%3D","line":31,"updated":"2014-01-17 17:24:52.000000000","message":"do we need to support extra for everything?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":29,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":30,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dTrue)"},{"line_number":31,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":32,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027id\u0027, \u0027idp_id\u0027), dict())"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBMU%3D","line":31,"in_reply_to":"AAAAUH%2F%2FE%2BE%3D","updated":"2014-01-18 22:04:10.000000000","message":"probably not, will remove in the next patch.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1b6a7007d027eeb72f81328210bd7da60c9a26c3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027enabled\u0027, \u0027description\u0027]"},{"line_number":38,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027name\u0027, \u0027enabled\u0027])"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEPY%3D","line":40,"updated":"2014-01-17 19:10:53.000000000","message":"this should become user-specified and immutable, just like in protocols","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027enabled\u0027, \u0027description\u0027]"},{"line_number":38,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027name\u0027, \u0027enabled\u0027])"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBK8%3D","line":40,"in_reply_to":"AAAAUH%2F%2FEPY%3D","updated":"2014-01-18 22:04:10.000000000","message":"according to the https://github.com/openstack/identity-api/blob/master/openstack-identity-api/v3/src/markdown/identity-api-v3-os-federation-ext.md id is a random uuid assigned when new IdentityProvider is being created... shall i follow other specs?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1b6a7007d027eeb72f81328210bd7da60c9a26c3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027name\u0027, \u0027enabled\u0027])"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":44,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEPc%3D","line":41,"updated":"2014-01-17 19:10:53.000000000","message":"this should be dropped","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":44,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE9E%3D","line":43,"updated":"2014-01-17 17:24:52.000000000","message":"according to the spec the description is required, so no need to allow null for this column.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1b6a7007d027eeb72f81328210bd7da60c9a26c3","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":44,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEZg%3D","line":43,"in_reply_to":"AAAAUH%2F%2FE9E%3D","updated":"2014-01-17 19:10:53.000000000","message":"hmm... i followed up on this in https://review.openstack.org/#/c/67549/","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":41,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":42,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":43,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":44,"context_line":"    extra \u003d sql.Column(sql.JsonBlob(), nullable\u003dTrue)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBMk%3D","line":43,"in_reply_to":"AAAAUH%2F%2FE9E%3D","updated":"2014-01-18 22:04:10.000000000","message":"will remove.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            idp_ref \u003d self._get_idp(session, idp_id)"},{"line_number":65,"context_line":"            q \u003d session.query(IdentityProviderModel)"},{"line_number":66,"context_line":"            q \u003d q.filter_by(id\u003didp_id)"},{"line_number":67,"context_line":"            q.delete(False)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            session.delete(idp_ref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE8o%3D","line":67,"updated":"2014-01-17 17:24:52.000000000","message":"give a name to the False magic number so that reviewers know what it indicates.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            idp_ref \u003d self._get_idp(session, idp_id)"},{"line_number":65,"context_line":"            q \u003d session.query(IdentityProviderModel)"},{"line_number":66,"context_line":"            q \u003d q.filter_by(id\u003didp_id)"},{"line_number":67,"context_line":"            q.delete(False)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            session.delete(idp_ref)"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBK4%3D","line":67,"in_reply_to":"AAAAUH%2F%2FE8o%3D","updated":"2014-01-18 22:04:10.000000000","message":"will fix and make more readable.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        return idps_list"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def get_idp(self, idp_id):"},{"line_number":85,"context_line":"        session \u003d self.get_session()"},{"line_number":86,"context_line":"        idp_ref \u003d self._get_idp(session, idp_id)"},{"line_number":87,"context_line":"        return idp_ref.to_dict()"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6m8%3D","line":85,"updated":"2014-01-20 20:19:18.000000000","message":"Do we need to make sure this session is closed (using a with or try except to make sure the connection is closed)?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        idp_ref \u003d self._get_idp(session, idp_id)"},{"line_number":87,"context_line":"        return idp_ref.to_dict()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update_idp(self, idp_id, identity_provider):"},{"line_number":90,"context_line":"        session \u003d self.get_session()"},{"line_number":91,"context_line":"        with session.begin():"},{"line_number":92,"context_line":"            idp_ref \u003d self._get_idp(session, idp_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE6I%3D","line":89,"updated":"2014-01-17 17:24:52.000000000","message":"suggest change \"identity_provider\" to \"idp\" since that\u0027s what\u0027s used for the other functions.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        idp_ref \u003d self._get_idp(session, idp_id)"},{"line_number":87,"context_line":"        return idp_ref.to_dict()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def update_idp(self, idp_id, identity_provider):"},{"line_number":90,"context_line":"        session \u003d self.get_session()"},{"line_number":91,"context_line":"        with session.begin():"},{"line_number":92,"context_line":"            idp_ref \u003d self._get_idp(session, idp_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBMo%3D","line":89,"in_reply_to":"AAAAUH%2F%2FE6I%3D","updated":"2014-01-18 22:04:10.000000000","message":"will remove.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        return proto_ref.to_dict()"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def get_protocol(self, idp_id, protocol_id):"},{"line_number":140,"context_line":"        session \u003d self.get_session()"},{"line_number":141,"context_line":"        protocol_ref \u003d self._get_protocol(session, idp_id, protocol_id)"},{"line_number":142,"context_line":"        return protocol_ref.to_dict()"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6mU%3D","line":140,"updated":"2014-01-20 20:19:18.000000000","message":"same comment about sessions here as above.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    # Identity Provider CRUD"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def put_idp(self, idp_id, idp):"},{"line_number":76,"context_line":"        session \u003d self.get_session()"},{"line_number":77,"context_line":"        with session.begin():"},{"line_number":78,"context_line":"            idp[\u0027id\u0027] \u003d idp_id"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B13s%3D","line":75,"updated":"2014-01-21 14:58:39.000000000","message":"create_idp","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9610bf627af777b7760316f3f691470aa927a1d5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027idp_id\u0027, \u0027mapping_id\u0027]"},{"line_number":26,"context_line":"    mutable_attributes \u003d frozenset([\u0027mapping_id\u0027])"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue, autoincrement\u003dFalse)"},{"line_number":29,"context_line":"    idp_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                        ondelete\u003d\u0027CASCADE\u0027), primary_key\u003dTrue)"},{"line_number":31,"context_line":"    mapping_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz3c%3D","line":28,"updated":"2014-01-21 21:47:18.000000000","message":"Is \"autoincrement\u003dFalse\" needed here since it\u0027s a String(64) instead of an int? (see below at line 52, this is inconsistent)","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/contrib/federation/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @classmethod"},{"line_number":40,"context_line":"    def check_immutable_params(cls, ref, keys\u003dNone):"},{"line_number":41,"context_line":"        \"\"\"Raise exception when unallowed parameter is stored in the keys"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        Unless the keys argument is specified, use the class list."},{"line_number":44,"context_line":"        @raises exception.ImmutableAttributeError"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90Cg%3D","line":41,"updated":"2013-12-05 16:51:08.000000000","message":"Missing docstrings for parameters and return values. This applies to all instances in this module.","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    - _mutable_parameters - set of parameters that can be changed by users."},{"line_number":33,"context_line":"                            Usually used by cls.check_immutable_params()"},{"line_number":34,"context_line":"    - _public_parameters - set of parameters that are accepted and returned to"},{"line_number":35,"context_line":"                           the user. Usually used by cls.filter_params()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    collection_name \u003d \u0027identity_providers\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9G0I%3D","line":35,"updated":"2013-12-16 19:46:41.000000000","message":"awesome","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Add URLs for entitities related with Identity Provider."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        Add URLs pointing to:"},{"line_number":108,"context_line":"        - public_keys tried to the Identity Provider"},{"line_number":109,"context_line":"        - protocols tied to the Identity Provider"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9Gy4%3D","line":108,"updated":"2013-12-16 19:46:41.000000000","message":"need to remove pub keys","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        base_path \u003d ref[\u0027links\u0027].get(\u0027self\u0027)"},{"line_number":114,"context_line":"        if base_path is None:"},{"line_number":115,"context_line":"            base_path \u003d \u0027/\u0027.join([IdentityProvider.base_url(), ref[\u0027id\u0027]])"},{"line_number":116,"context_line":"        for name in [\u0027public_keys\u0027, \u0027protocols\u0027]:"},{"line_number":117,"context_line":"            ref[\u0027links\u0027][name] \u003d \u0027/\u0027.join([base_path, name])"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9Gyw%3D","line":116,"updated":"2013-12-16 19:46:41.000000000","message":"need to remove pub keys","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                       be removed."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        pass"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @controller.protected()"},{"line_number":146,"context_line":"    def create_federated_provider(self, context, identity_provider):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9Gyg%3D","line":143,"updated":"2013-12-16 19:46:41.000000000","message":"should at least log a warning that this isn\u0027t implemented","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                       be removed."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        pass"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @controller.protected()"},{"line_number":146,"context_line":"    def create_federated_provider(self, context, identity_provider):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9ExM%3D","line":143,"in_reply_to":"AAAATn%2F9Gyg%3D","updated":"2013-12-17 02:21:34.000000000","message":"add a TODO tag, and raise an exception","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        ref[\u0027links\u0027][\u0027identity_provider\u0027] \u003d base_path"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"#NOTE(marek-denis): This method transparently calls cls.filter_params() not"},{"line_number":229,"context_line":"#                   sure, whether it\u0027s a good approach."},{"line_number":230,"context_line":"    @classmethod"},{"line_number":231,"context_line":"    def wrap_member(cls, context, ref):"},{"line_number":232,"context_line":"        cls._add_related_links(ref)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9EvA%3D","line":229,"updated":"2013-12-17 02:21:34.000000000","message":"i don\u0027t have an issue with this","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    def base_url(cls, path\u003dNone):"},{"line_number":97,"context_line":"        \"\"\"Construct a path and pass it to V3Controller.base_url method.\"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        path \u003d \u0027/OS-IDP/\u0027 + cls.collection_name"},{"line_number":100,"context_line":"        return controller.V3Controller.base_url(path\u003dpath)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85kk%3D","line":99,"updated":"2013-12-19 01:26:32.000000000","message":"so change /OS-IDP/ to /OS-FEDERATION/","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"b01bf9e4146f2220359ac0c0c7947c76a7489f7f","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":"    collection_name \u003d \u0027identity_providers\u0027"},{"line_number":39,"context_line":"    member_name \u003d \u0027identity_provider\u0027"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    _mutable_parameters \u003d frozenset([\u0027description\u0027, \u0027name\u0027,"},{"line_number":42,"context_line":"                                     \u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2FWfI%3D","line":39,"updated":"2014-01-14 18:46:52.000000000","message":"Why the API \"federated_provider\" is so different from the controller name \"IdentityProvider\"\n\nCan we use matching names","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Two new class parameters:"},{"line_number":32,"context_line":"    - _mutable_parameters - set of parameters that can be changed by users."},{"line_number":33,"context_line":"                            Usually used by cls.check_immutable_params()"},{"line_number":34,"context_line":"    - _public_parameters - set of parameters that exposed to the user."},{"line_number":35,"context_line":"                           Usually used by cls.filter_params()"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE2o%3D","line":33,"updated":"2014-01-17 17:24:52.000000000","message":"why have \"extra\" field in the database when only some fields can be changed?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Two new class parameters:"},{"line_number":32,"context_line":"    - _mutable_parameters - set of parameters that can be changed by users."},{"line_number":33,"context_line":"                            Usually used by cls.check_immutable_params()"},{"line_number":34,"context_line":"    - _public_parameters - set of parameters that exposed to the user."},{"line_number":35,"context_line":"                           Usually used by cls.filter_params()"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKY%3D","line":33,"in_reply_to":"AAAAUH%2F%2FE2o%3D","updated":"2014-01-18 22:04:10.000000000","message":"good comment. I will remove extra attributes from the DB entity definitions. Any objections from the rest?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def check_immutable_params(cls, ref, keys\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Raise exception when unallowed parameter is stored in the keys"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        Check whether ref dictionary representing a request/response"},{"line_number":51,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE04%3D","line":50,"updated":"2014-01-17 17:24:52.000000000","message":"why would we check that a response has mutable parameters?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        Check whether ref dictionary representing a request/response"},{"line_number":51,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE2M%3D","line":53,"updated":"2014-01-17 17:24:52.000000000","message":"add a .","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        Check whether ref dictionary representing a request/response"},{"line_number":51,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBK0%3D","line":53,"in_reply_to":"AAAAUH%2F%2FE2M%3D","updated":"2014-01-18 22:04:10.000000000","message":"Done","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"},{"line_number":57,"context_line":"        :param keys: set with mutable parameters. If None, use default class"},{"line_number":58,"context_line":"                     attribute - _mutable_parameters"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE1Q%3D","line":55,"updated":"2014-01-17 17:24:52.000000000","message":"how would a response involve mutating parameters?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"},{"line_number":57,"context_line":"        :param keys: set with mutable parameters. If None, use default class"},{"line_number":58,"context_line":"                     attribute - _mutable_parameters"},{"line_number":59,"context_line":"        :raises exception.ImmutableAttributeError"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE1U%3D","line":56,"updated":"2014-01-17 17:24:52.000000000","message":"should be \"stored\" rather than \"serialized\"?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"},{"line_number":57,"context_line":"        :param keys: set with mutable parameters. If None, use default class"},{"line_number":58,"context_line":"                     attribute - _mutable_parameters"},{"line_number":59,"context_line":"        :raises exception.ImmutableAttributeError"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKw%3D","line":56,"in_reply_to":"AAAAUH%2F%2FE1U%3D","updated":"2014-01-18 22:04:10.000000000","message":"Done","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        ref_keys \u003d set(ref.keys())"},{"line_number":66,"context_line":"        blocked_keys \u003d ref_keys - keys"},{"line_number":67,"context_line":"        for blocked_param in blocked_keys:"},{"line_number":68,"context_line":"            exception_args \u003d {\u0027target\u0027: cls.__name__,"},{"line_number":69,"context_line":"                              \u0027attribute\u0027: blocked_param}"},{"line_number":70,"context_line":"            raise exception.ImmutableAttributeError(**exception_args)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEzg%3D","line":67,"updated":"2014-01-17 17:24:52.000000000","message":"how many exceptions do you think can be thrown here?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        ref_keys \u003d set(ref.keys())"},{"line_number":66,"context_line":"        blocked_keys \u003d ref_keys - keys"},{"line_number":67,"context_line":"        for blocked_param in blocked_keys:"},{"line_number":68,"context_line":"            exception_args \u003d {\u0027target\u0027: cls.__name__,"},{"line_number":69,"context_line":"                              \u0027attribute\u0027: blocked_param}"},{"line_number":70,"context_line":"            raise exception.ImmutableAttributeError(**exception_args)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKo%3D","line":67,"in_reply_to":"AAAAUH%2F%2FEzg%3D","updated":"2014-01-18 22:04:10.000000000","message":"the idea was to raise an exception when the first condition is met, no matter if latter params might be also invalid. \nAny suggested changes here, and why can\u0027t it stay like it is now?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        This function will remove unspecified parameters from the dictionary."},{"line_number":77,"context_line":"        See check_immutable_parameters for corresponding function that raises"},{"line_number":78,"context_line":"        exceptions."},{"line_number":79,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":82,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FE0U%3D","line":79,"updated":"2014-01-17 17:24:52.000000000","message":"add a .","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        This function will remove unspecified parameters from the dictionary."},{"line_number":77,"context_line":"        See check_immutable_parameters for corresponding function that raises"},{"line_number":78,"context_line":"        exceptions."},{"line_number":79,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":82,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKk%3D","line":79,"in_reply_to":"AAAAUH%2F%2FE0U%3D","updated":"2014-01-18 22:04:10.000000000","message":"Done","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"46f62dce14429260cda550143550022d32a2b7b7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        exceptions."},{"line_number":79,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":82,"context_line":"                    serialized"},{"line_number":83,"context_line":"        :param keys: set of attribute names, that are allowed in the request."},{"line_number":84,"context_line":"                     If None, use the class attribute _public_parameters"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEz8%3D","line":81,"updated":"2014-01-17 17:24:52.000000000","message":"why would we need to filter_params on the request? this is for filtering the response data.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        exceptions."},{"line_number":79,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":82,"context_line":"                    serialized"},{"line_number":83,"context_line":"        :param keys: set of attribute names, that are allowed in the request."},{"line_number":84,"context_line":"                     If None, use the class attribute _public_parameters"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKg%3D","line":81,"in_reply_to":"AAAAUH%2F%2FEz8%3D","updated":"2014-01-18 22:04:10.000000000","message":"right! Are you suggesting to remove this method completely and not filter input data or just make docstring more specific?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        cls._add_related_links(ref)"},{"line_number":128,"context_line":"        return {cls.member_name: ref}"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    #TODO(marek-denis): Implement, when mapping engine is ready"},{"line_number":131,"context_line":"    def _delete_tokens_issued_by_idp(self, idp_id):"},{"line_number":132,"context_line":"        \"\"\"Delete tokens created upon authentication from an IdP"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6mE%3D","line":130,"updated":"2014-01-20 20:19:18.000000000","message":"When is this planned to be implemented? Can this point to a bp at all, or some form of reference?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        Adds \u0027identity_provider\u0027 key, with URL pointing to related identity"},{"line_number":217,"context_line":"        provider as a value."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        \"\"\""},{"line_number":220,"context_line":"        ref.setdefault(\u0027links\u0027, {})"},{"line_number":221,"context_line":"        base_path \u003d \u0027/\u0027.join([IdentityProvider.base_url(), ref[\u0027idp_id\u0027]])"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6cY%3D","line":218,"updated":"2014-01-20 20:19:18.000000000","message":"Add doc strings here to be consistent with  def _add_self_referential_links","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        raise exception.NotImplemented()"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    @controller.protected()"},{"line_number":144,"context_line":"    def put_identity_provider(self, context, idp_id, identity_provider):"},{"line_number":145,"context_line":"        mutable_params \u003d set([\u0027description\u0027, \u0027enabled\u0027])"},{"line_number":146,"context_line":"        public_params \u003d set([\u0027id\u0027, \u0027description\u0027, \u0027enabled\u0027])"},{"line_number":147,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B11c%3D","line":144,"updated":"2014-01-21 14:58:39.000000000","message":"create_identity_provider","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        identity_provider.setdefault(\u0027enabled\u0027, False)"},{"line_number":150,"context_line":"        IdentityProvider.check_immutable_params(identity_provider,"},{"line_number":151,"context_line":"                                                keys\u003dmutable_params)"},{"line_number":152,"context_line":"        idp_ref \u003d self.federation_api.put_idp(idp_id, identity_provider)"},{"line_number":153,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"},{"line_number":154,"context_line":"        response \u003d IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":155,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B10Q%3D","line":152,"updated":"2014-01-21 14:58:39.000000000","message":"create_idp","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        return {cls.member_name: ref}"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    @controller.protected()"},{"line_number":236,"context_line":"    def put_protocol(self, context, idp_id, protocol_id, protocol):"},{"line_number":237,"context_line":"        ref \u003d self._normalize_dict(protocol)"},{"line_number":238,"context_line":"        keys \u003d self._mutable_parameters.copy()"},{"line_number":239,"context_line":"        FederationProtocol.check_immutable_params(ref, keys\u003dkeys)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B11k%3D","line":236,"updated":"2014-01-21 14:58:39.000000000","message":"create_protocol","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":47,"context_line":"    def check_immutable_params(cls, ref, keys\u003dNone):"},{"line_number":48,"context_line":"        \"\"\"Raise exception when disallowed parameter is stored in the keys."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        Check whether ref dictionary representing a request/response"},{"line_number":51,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1tc%3D","line":50,"updated":"2014-01-21 15:22:31.000000000","message":"why would we check that a response has mutable parameters?","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        Check whether ref dictionary representing a request/response"},{"line_number":51,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1tQ%3D","line":53,"updated":"2014-01-21 15:22:31.000000000","message":"add a .","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"},{"line_number":57,"context_line":"        :param keys: set with mutable parameters. If None, use default class"},{"line_number":58,"context_line":"                     attribute - _mutable_parameters"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1tE%3D","line":55,"updated":"2014-01-21 15:22:31.000000000","message":"how would a response involve mutating parameters?","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":56,"context_line":"                    serialized"},{"line_number":57,"context_line":"        :param keys: set with mutable parameters. If None, use default class"},{"line_number":58,"context_line":"                     attribute - _mutable_parameters"},{"line_number":59,"context_line":"        :raises exception.ImmutableAttributeError"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1sg%3D","line":56,"updated":"2014-01-21 15:22:31.000000000","message":"should be \"stored\" rather than \"serialized\"?","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        ref_keys \u003d set(ref.keys())"},{"line_number":66,"context_line":"        blocked_keys \u003d ref_keys - keys"},{"line_number":67,"context_line":"        for blocked_param in blocked_keys:"},{"line_number":68,"context_line":"            exception_args \u003d {\u0027target\u0027: cls.__name__,"},{"line_number":69,"context_line":"                              \u0027attribute\u0027: blocked_param}"},{"line_number":70,"context_line":"            raise exception.ImmutableAttributeError(**exception_args)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1qo%3D","line":67,"updated":"2014-01-21 15:22:31.000000000","message":"suggest change to\n\n if not blocked_keys:\n    # No immutable parameters changed.\n    return\n\n exception_args \u003d {\u0027target\u0027: cls.__name__,\n                    \u0027attribute\u0027: blocked_params.pop()}\n raise exception.ImmutableAttributeError(**exception_args)\n\nthen it will be obvious that there\u0027s no actual looping going on here.","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        See check_immutable_parameters for corresponding function that raises"},{"line_number":78,"context_line":"        exceptions."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":83,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1qg%3D","line":80,"updated":"2014-01-21 15:22:31.000000000","message":"add a .","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        This method checks only root-level keys from ref dictionary"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param ref: dictionary representing deserialized request/response to be"},{"line_number":83,"context_line":"                    serialized"},{"line_number":84,"context_line":"        :param keys: set of attribute names, that are allowed in the request."},{"line_number":85,"context_line":"                     If None, use the class attribute _public_parameters"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1qY%3D","line":82,"updated":"2014-01-21 15:22:31.000000000","message":"make docstring more specific since this is for filtering the response data and not the request data.","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a92f45139d64c2d6b23ef6b45438ef0c969516a4","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"},{"line_number":157,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"},{"line_number":158,"context_line":"        response \u003d IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":159,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @controller.protected()"},{"line_number":162,"context_line":"    def list_identity_providers(self, context):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B1DI%3D","line":159,"updated":"2014-01-21 16:57:51.000000000","message":"i\u0027ll open a bug for this, we should be able to do somehting better than go to the wsgi layer.","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        Check whether the ref dictionary representing a request"},{"line_number":50,"context_line":"        has only mutable parameters included. If not, raise an exception."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        This method checks only root-level keys from a ref dictionary"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        :param ref: a dictionary representing deserialized request to be"},{"line_number":55,"context_line":"                    stored"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0Mk%3D","line":52,"updated":"2014-01-21 20:14:24.000000000","message":"add a . at end of sentence.","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        This function removes unspecified parameters from the dictionary."},{"line_number":80,"context_line":"        See check_immutable_parameters for corresponding function that raises"},{"line_number":81,"context_line":"        exceptions."},{"line_number":82,"context_line":"        This method checks only root-level keys from a ref dictionary"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        :param ref: a dictionary representing deserialized response to be"},{"line_number":85,"context_line":"                    serialized"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0Mc%3D","line":82,"updated":"2014-01-21 20:14:24.000000000","message":"add . at end of sentence.","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    Two new class parameters:"},{"line_number":33,"context_line":"    - _mutable_parameters - set of parameters that can be changed by users."},{"line_number":34,"context_line":"                            Usually used by cls.check_immutable_params()"},{"line_number":35,"context_line":"    - _public_parameters - set of parameters that exposed to the user."},{"line_number":36,"context_line":"                           Usually used by cls.filter_params()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B0Cw%3D","line":35,"updated":"2014-01-21 21:03:41.000000000","message":"(nit) change \"that exposed\" to \"that are exposed\"","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9610bf627af777b7760316f3f691470aa927a1d5","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def check_immutable_params(cls, ref, keys\u003dNone):"},{"line_number":47,"context_line":"        \"\"\"Raise exception when disallowed parameter is stored in the keys"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        Check whether the ref dictionary representing a request has only"},{"line_number":50,"context_line":"        mutable parameters included. If not, raise an exception. This method"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2BzwE%3D","line":47,"updated":"2014-01-21 21:47:18.000000000","message":"period is needed at the end of this line.  This might actually be a pep8 violation according to hacking","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        blocked_keys \u003d ref_keys - keys"},{"line_number":93,"context_line":"        for blocked_param in blocked_keys:"},{"line_number":94,"context_line":"            del ref[blocked_param]"},{"line_number":95,"context_line":"        return ref"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @classmethod"},{"line_number":98,"context_line":"    def base_url(cls, path\u003dNone):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz%2BQ%3D","line":95,"updated":"2014-01-21 21:03:41.000000000","message":"this function modifies ref so there\u0027s no need to return it.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        mutable_params \u003d set([\u0027description\u0027, \u0027enabled\u0027])"},{"line_number":149,"context_line":"        public_params \u003d set([\u0027id\u0027, \u0027description\u0027, \u0027enabled\u0027])"},{"line_number":150,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"},{"line_number":151,"context_line":"        identity_provider.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":152,"context_line":"        identity_provider.setdefault(\u0027enabled\u0027, False)"},{"line_number":153,"context_line":"        IdentityProvider.check_immutable_params(identity_provider,"},{"line_number":154,"context_line":"                                                keys\u003dmutable_params)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B0Bc%3D","line":151,"updated":"2014-01-21 21:03:41.000000000","message":"why set the default if this is nullable in the database?","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"},{"line_number":151,"context_line":"        identity_provider.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":152,"context_line":"        identity_provider.setdefault(\u0027enabled\u0027, False)"},{"line_number":153,"context_line":"        IdentityProvider.check_immutable_params(identity_provider,"},{"line_number":154,"context_line":"                                                keys\u003dmutable_params)"},{"line_number":155,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"},{"line_number":156,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz98%3D","line":153,"updated":"2014-01-21 21:03:41.000000000","message":"can this use self.check_immutable_params since it\u0027s the same class?","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        IdentityProvider.check_immutable_params(identity_provider,"},{"line_number":154,"context_line":"                                                keys\u003dmutable_params)"},{"line_number":155,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"},{"line_number":156,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"},{"line_number":157,"context_line":"        response \u003d IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":158,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz%2BM%3D","line":156,"updated":"2014-01-21 21:03:41.000000000","message":"the idp_ref was modified by filter_params, so remove \"idp_ref \u003d \"","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"},{"line_number":156,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"},{"line_number":157,"context_line":"        response \u003d IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":158,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @controller.protected()"},{"line_number":161,"context_line":"    def list_identity_providers(self, context):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz%2FI%3D","line":158,"updated":"2014-01-21 21:03:41.000000000","message":"According to the HTTP 1.1 spec a 201 Created response must set the Location header, too.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"353fb0386114e3157157f293f3931be7b140075d","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        idp_ref \u003d self.federation_api.create_idp(idp_id, identity_provider)"},{"line_number":156,"context_line":"        idp_ref \u003d IdentityProvider.filter_params(idp_ref, keys\u003dpublic_params)"},{"line_number":157,"context_line":"        response \u003d IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":158,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @controller.protected()"},{"line_number":161,"context_line":"    def list_identity_providers(self, context):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz1A%3D","line":158,"in_reply_to":"AAAAUH%2F%2Bz%2FI%3D","updated":"2014-01-21 21:15:50.000000000","message":"++ but i think we have an open bug for this -- the rest of keystone is guilty of this as well","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    @controller.protected()"},{"line_number":177,"context_line":"    def update_identity_provider(self, context, idp_id, identity_provider):"},{"line_number":178,"context_line":"        identity_provider \u003d self._normalize_dict(identity_provider)"},{"line_number":179,"context_line":"        IdentityProvider.check_immutable_params(identity_provider)"},{"line_number":180,"context_line":"        idp_ref \u003d self.federation_api.update_idp(idp_id, identity_provider)"},{"line_number":181,"context_line":"        return IdentityProvider.wrap_member(context, idp_ref)"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B0As%3D","line":179,"updated":"2014-01-21 21:03:41.000000000","message":"it\u0027s weird that this is only called in 2 places, one place it uses the default and the other passes keys. How about pass the set of mutable parameters each time and then don\u0027t have to use the complicated class defaults method?","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"@dependency.requires(\u0027federation_api\u0027)"},{"line_number":185,"context_line":"class FederationProtocol(IdentityProvider):"},{"line_number":186,"context_line":"    \"\"\"A federation protocol representation."},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    See IdentityProvider docstring for explanation on _mutable_parameters"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2B0AU%3D","line":185,"updated":"2014-01-21 21:03:41.000000000","message":"I don\u0027t see how is-a is the correct relationship here -- a federation protocol is a child of identityprovider not equivalent. Suggest have a different class that both are derived from (_BaseController or something).","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":239,"context_line":"    def create_protocol(self, context, idp_id, protocol_id, protocol):"},{"line_number":240,"context_line":"        ref \u003d self._normalize_dict(protocol)"},{"line_number":241,"context_line":"        keys \u003d self._mutable_parameters.copy()"},{"line_number":242,"context_line":"        FederationProtocol.check_immutable_params(ref, keys\u003dkeys)"},{"line_number":243,"context_line":"        ref \u003d self.federation_api.create_protocol(idp_id, protocol_id, ref)"},{"line_number":244,"context_line":"        response \u003d FederationProtocol.wrap_member(context, ref)"},{"line_number":245,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz8U%3D","line":242,"updated":"2014-01-21 21:03:41.000000000","message":"could use self here rather than \"FederationProtocol\" ?","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":242,"context_line":"        FederationProtocol.check_immutable_params(ref, keys\u003dkeys)"},{"line_number":243,"context_line":"        ref \u003d self.federation_api.create_protocol(idp_id, protocol_id, ref)"},{"line_number":244,"context_line":"        response \u003d FederationProtocol.wrap_member(context, ref)"},{"line_number":245,"context_line":"        return wsgi.render_response(body\u003dresponse, status\u003d(\u0027201\u0027, \u0027Created\u0027))"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    @controller.protected()"},{"line_number":248,"context_line":"    def update_protocol(self, context, idp_id, protocol_id, protocol):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz8E%3D","line":245,"updated":"2014-01-21 21:03:41.000000000","message":"needs a Location header in response.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/contrib/federation/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a170a734e14ff552bc28b73f09d8d3d3cd907576","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    def __init__(self):"},{"line_number":37,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9zOQ%3D","line":37,"updated":"2013-12-05 19:12:01.000000000","message":"for completion, (wait til spec is in) there should be a driver class.","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":"#NOTE(marek-denis): fill with 100% proper data."},{"line_number":28,"context_line":"EXTENSION_DATA \u003d {"},{"line_number":29,"context_line":"    \u0027name\u0027: \u0027OpenStack virtual Identity Providers API\u0027,"},{"line_number":30,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9GyE%3D","line":27,"updated":"2013-12-16 19:46:41.000000000","message":"TODO/FIXME instead?","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":27,"context_line":"#NOTE(marek-denis): fill with 100% proper data."},{"line_number":28,"context_line":"EXTENSION_DATA \u003d {"},{"line_number":29,"context_line":"    \u0027name\u0027: \u0027OpenStack virtual Identity Providers API\u0027,"},{"line_number":30,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F9Eug%3D","line":27,"in_reply_to":"AAAATn%2F9GyE%3D","updated":"2013-12-17 02:21:34.000000000","message":"@marek, go for best effort here.\n\n@ayoung, do you have more detail on how to fill in info for this dict?","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    \u0027name\u0027: \u0027OpenStack virtual Identity Providers API\u0027,"},{"line_number":29,"context_line":"    \u0027namespace\u0027: \u0027http://docs.openstack.org/identity/api/ext/\u0027"},{"line_number":30,"context_line":"                 \u0027OS-IDP/v1.0\u0027,"},{"line_number":31,"context_line":"    \u0027alias\u0027: \u0027OS-IDP\u0027,"},{"line_number":32,"context_line":"    \u0027updated\u0027: \u00272013-12-17T12:00:0-00:00\u0027,"},{"line_number":33,"context_line":"    \u0027description\u0027: \u0027OpenStack virtual Identity Providers Mechanism.\u0027,"},{"line_number":34,"context_line":"    \u0027links\u0027: ["}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85kw%3D","line":31,"updated":"2013-12-19 01:26:32.000000000","message":"so change /OS-IDP/ to /OS-FEDERATION/","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Extension supporting Clouds Federation.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common import dependency"},{"line_number":20,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAT3%2F%2F5EI%3D","line":17,"updated":"2013-12-27 19:58:57.000000000","message":"Clouds should be Cloud","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Extension supporting Clouds Federation.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common import dependency"},{"line_number":20,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2F8QE%3D","line":17,"in_reply_to":"AAAAT3%2F%2F5EI%3D","updated":"2014-01-06 14:05:40.000000000","message":"Done","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Extension supporting Cloud Federation.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common import dependency"},{"line_number":20,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F0O0%3D","line":17,"updated":"2014-01-08 05:53:59.000000000","message":"drop the \u0027cloud\u0027 part","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"# under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Extension supporting Cloud Federation.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from keystone.common import dependency"},{"line_number":20,"context_line":"from keystone.common import extension"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzUU%3D","line":17,"in_reply_to":"AAAAUH%2F%2F0O0%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                 \u0027OS-FEDERATION/v1.0\u0027,"},{"line_number":31,"context_line":"    \u0027alias\u0027: \u0027OS-FEDERATION\u0027,"},{"line_number":32,"context_line":"    \u0027updated\u0027: \u00272013-12-17T12:00:0-00:00\u0027,"},{"line_number":33,"context_line":"    \u0027description\u0027: \u0027OpenStack virtual Identity Providers Mechanism.\u0027,"},{"line_number":34,"context_line":"    \u0027links\u0027: ["},{"line_number":35,"context_line":"            {"},{"line_number":36,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F0O4%3D","line":33,"updated":"2014-01-08 05:53:59.000000000","message":"drop the \u0027virtual\u0027 part,","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                 \u0027OS-FEDERATION/v1.0\u0027,"},{"line_number":31,"context_line":"    \u0027alias\u0027: \u0027OS-FEDERATION\u0027,"},{"line_number":32,"context_line":"    \u0027updated\u0027: \u00272013-12-17T12:00:0-00:00\u0027,"},{"line_number":33,"context_line":"    \u0027description\u0027: \u0027OpenStack virtual Identity Providers Mechanism.\u0027,"},{"line_number":34,"context_line":"    \u0027links\u0027: ["},{"line_number":35,"context_line":"            {"},{"line_number":36,"context_line":"            \u0027rel\u0027: \u0027describedby\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzUM%3D","line":33,"in_reply_to":"AAAAUH%2F%2F0O4%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e6f2c93a1161d4e12bfcf08769dddfd62e82f811","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B064%3D","line":54,"updated":"2014-01-21 17:33:10.000000000","message":"Needs a driver interface in a future patch","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ec3301a2ef534f7aed33fcdb6c28df5330590451","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B00M%3D","line":54,"in_reply_to":"AAAAUH%2F%2B01k%3D","updated":"2014-01-21 17:43:24.000000000","message":"thanks for the link dolph","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7405b2aa8292f6ccabcd2ad273cd4fb0d1453460","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":"    def __init__(self):"},{"line_number":54,"context_line":"        super(Manager, self).__init__(CONF.federation.driver)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B01k%3D","line":54,"in_reply_to":"AAAAUH%2F%2B064%3D","updated":"2014-01-21 17:36:57.000000000","message":"https://review.openstack.org/#/c/68184/","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9610bf627af777b7760316f3f691470aa927a1d5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":64,"context_line":"class Driver(object):"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":67,"context_line":"        \"\"\"Create an identity provider."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        :returns: idp_ref"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bzug%3D","line":66,"updated":"2014-01-21 21:47:18.000000000","message":"None of the methods here are decorated with @abc.abstractmethod\n\nThis doesn\u0027t leverage any benefit from the ABCMeta class.\n\nYou\u0027ll neeed to add them for each method a subclassed driver must override.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d47c7520f3a093b56c9c9afd1653d340d4ce0ad5","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":99,"context_line":"        \"\"\"Update an identity provider by ID."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        :raises: keystone.exception.IdentityProviderNotFound"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz6c%3D","line":100,"updated":"2014-01-21 21:02:59.000000000","message":"a bunch of these are missing :return: comments","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/contrib/federation/doc/configuration.rst":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"5d849da9a3f65770c2120baa33348a30b5a6f39b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"      WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"      under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Enablig Federation Extension"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"AAAATn%2F9Gxw%3D","line":16,"updated":"2013-12-16 19:46:41.000000000","message":"some weird RST syntax issues in this file... i\u0027ll fix","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d6cee31f278b3b773339e15a88cf759538ddfac6","unresolved":false,"context_lines":[{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":"Enablig Federation Extension"},{"line_number":19,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"To enable the federation extension:"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  1. add the federation extension catalog driver to the ``[federation]`` section"}],"source_content_type":"text/x-rst","patch_set":5,"id":"AAAATn%2F9Eto%3D","line":20,"updated":"2013-12-17 02:21:34.000000000","message":"can you move this file to docs/source/extensions, and create a new section in the doc/source/configuration.rst file that links to it? (check oauth for example)","commit_id":"a25b60baddb103b4884a851151b4d9352572cd1e"}],"keystone/contrib/federation/migrate_repo/migrate.cfg":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[db_settings]"},{"line_number":2,"context_line":"# Used to identify which repository this database is versioned under."},{"line_number":3,"context_line":"# You can use the name of your project."},{"line_number":4,"context_line":"repository_id\u003dfederation"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"# The name of the database table used to track the schema version."}],"source_content_type":"text/x-ttcn-cfg","patch_set":8,"id":"AAAAT3%2F%2F5DE%3D","line":3,"updated":"2013-12-27 19:58:57.000000000","message":"What does this mean, you can use the name of your project? Is this referring to a particular Keystone project?","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[db_settings]"},{"line_number":2,"context_line":"# Used to identify which repository this database is versioned under."},{"line_number":3,"context_line":"# You can use the name of your project."},{"line_number":4,"context_line":"repository_id\u003dfederation"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"# The name of the database table used to track the schema version."}],"source_content_type":"text/x-ttcn-cfg","patch_set":8,"id":"AAAAUH%2F%2F8PQ%3D","line":3,"in_reply_to":"AAAAT3%2F%2F5DE%3D","updated":"2014-01-06 14:05:40.000000000","message":"To be honest I haven\u0027t dug deep enough in the code, but it looks like it\u0027s the name of the module (directory) under keystone/contrib. This applies to all extensions stored under keystone/contrib.","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"}],"keystone/contrib/federation/migrate_repo/versions/001_add_identity_provider_table.py":[{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8e367e4b803ddebc931b0efd6440614ed701bd3b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        \u0027federation_protocol\u0027,"},{"line_number":35,"context_line":"        meta,"},{"line_number":36,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":37,"context_line":"                   autoincrement\u003dFalse),"},{"line_number":38,"context_line":"        sql.Column(\u0027idp_id\u0027, sql.String(64),"},{"line_number":39,"context_line":"                   sql.ForeignKey(\u0027identity_provider.id\u0027, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":40,"context_line":"                   primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bu1M%3D","line":37,"updated":"2014-01-22 18:08:44.000000000","message":"Why do you need autoincrement\u003dFalse in String id?","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/contrib/federation/routers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a170a734e14ff552bc28b73f09d8d3d3cd907576","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            action\u003d\u0027delete_provider_key\u0027,"},{"line_number":91,"context_line":"            conditions\u003ddict(method\u003d[\u0027DELETE\u0027]))"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        # Protocol CRUD operations"},{"line_number":94,"context_line":"        mapper.connect("},{"line_number":95,"context_line":"            \u0027/OS-IDP/identity_providers/{idp_id}/protocols\u0027,"},{"line_number":96,"context_line":"            controller\u003dprotocol_controller,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9zW0%3D","line":93,"updated":"2013-12-05 19:12:01.000000000","message":"can you add comments to separate the other apis?","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a170a734e14ff552bc28b73f09d8d3d3cd907576","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            \u0027/OS-IDP/identity_providers/{idp_id}/protocols\u0027,"},{"line_number":96,"context_line":"            controller\u003dprotocol_controller,"},{"line_number":97,"context_line":"            action\u003d\u0027put_protocol\u0027,"},{"line_number":98,"context_line":"            conditions\u003ddict(method\u003d[\u0027PUT\u0027]))"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        mapper.connect("},{"line_number":101,"context_line":"            \u0027/OS-IDP/identity_providers/{idp_id}/protocols/{protocol_id}\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9zWE%3D","line":98,"updated":"2013-12-05 19:12:01.000000000","message":"might want to switch this to POST and create, as PUT seems to return 204 No Content? I think..","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    \"\"\"API Endpoints for the Federation extension."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-IDP/identity_providers"},{"line_number":26,"context_line":"     GET /OS-IDP/identity_providers"},{"line_number":27,"context_line":"     GET  /OS-IDP/identity_providers/$identity_providers"},{"line_number":28,"context_line":"     PATCH /OS-IDP/identity_providers/$identity_provider"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85lg%3D","line":25,"updated":"2013-12-19 01:26:32.000000000","message":"i think we can settled on changing the alias now,\nso change /OS-IDP/ to /OS-FEDERATION/","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class FederationExtension(wsgi.ExtensionRouter):"},{"line_number":22,"context_line":"    \"\"\"API Endpoints for the Federation extension."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-FEDERATION/identity_providers"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAT3%2F%2F5D0%3D","line":22,"updated":"2013-12-27 19:58:57.000000000","message":"Great comment!!!","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"ce84605effa9d617042f98c60ba24321d48bc822","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class FederationExtension(wsgi.ExtensionRouter):"},{"line_number":22,"context_line":"    \"\"\"API Endpoints for the Federation extension."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-FEDERATION/identity_providers"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F1k4%3D","line":22,"updated":"2014-01-07 22:10:49.000000000","message":"Great comment!  The spacing between HTTP operation and the URL is a little inconsistent/funky.  Perhaps stick to just one space between each?","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class FederationExtension(wsgi.ExtensionRouter):"},{"line_number":22,"context_line":"    \"\"\"API Endpoints for the Federation extension."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-FEDERATION/identity_providers"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzSA%3D","line":22,"in_reply_to":"AAAAUH%2F%2F1k4%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-FEDERATION/identity_providers"},{"line_number":26,"context_line":"     GET /OS-FEDERATION/identity_providers"},{"line_number":27,"context_line":"     GET  /OS-FEDERATION/identity_providers/$identity_providers"},{"line_number":28,"context_line":"     PATCH /OS-FEDERATION/identity_providers/$identity_provider"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"     GET /OS-FEDERATION/identity_providers/"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F0V0%3D","line":27,"updated":"2014-01-08 05:53:59.000000000","message":"nit, in the comment, add a DELETE","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    The API looks like:"},{"line_number":25,"context_line":"     POST /OS-FEDERATION/identity_providers"},{"line_number":26,"context_line":"     GET /OS-FEDERATION/identity_providers"},{"line_number":27,"context_line":"     GET  /OS-FEDERATION/identity_providers/$identity_providers"},{"line_number":28,"context_line":"     PATCH /OS-FEDERATION/identity_providers/$identity_provider"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"     GET /OS-FEDERATION/identity_providers/"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzSE%3D","line":27,"in_reply_to":"AAAAUH%2F%2F0V0%3D","updated":"2014-01-08 10:03:25.000000000","message":"Done","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"ce84605effa9d617042f98c60ba24321d48bc822","unresolved":false,"context_lines":[{"line_number":31,"context_line":"         $identity_providers/protocols"},{"line_number":32,"context_line":"     GET /OS-FEDERATION/identity_providers/"},{"line_number":33,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":34,"context_line":"     PUT /OS-FEDERATION/identity_providers/"},{"line_number":35,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":36,"context_line":"     PATCH /OS-FEDERATION/identity_providers/"},{"line_number":37,"context_line":"         $identity_providers/protocols/$protocol"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F1dM%3D","line":34,"updated":"2014-01-07 22:10:49.000000000","message":"Why did you have both a put and a patch here?  Is the put a replace and the patch an update?","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":31,"context_line":"         $identity_providers/protocols"},{"line_number":32,"context_line":"     GET /OS-FEDERATION/identity_providers/"},{"line_number":33,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":34,"context_line":"     PUT /OS-FEDERATION/identity_providers/"},{"line_number":35,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":36,"context_line":"     PATCH /OS-FEDERATION/identity_providers/"},{"line_number":37,"context_line":"         $identity_providers/protocols/$protocol"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzTQ%3D","line":34,"in_reply_to":"AAAAUH%2F%2F0Vk%3D","updated":"2014-01-08 10:03:25.000000000","message":"steve++","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"         $identity_providers/protocols"},{"line_number":32,"context_line":"     GET /OS-FEDERATION/identity_providers/"},{"line_number":33,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":34,"context_line":"     PUT /OS-FEDERATION/identity_providers/"},{"line_number":35,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":36,"context_line":"     PATCH /OS-FEDERATION/identity_providers/"},{"line_number":37,"context_line":"         $identity_providers/protocols/$protocol"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F0Vk%3D","line":34,"in_reply_to":"AAAAUH%2F%2F1dM%3D","updated":"2014-01-08 05:53:59.000000000","message":"the PUT in this case is similar to a create (POST, we don\u0027t have one here). If the $protocol does not exist, it\u0027ll be created. if it does, it\u0027ll be replaced. \n\nPOST \u003d create | PUT \u003d create or replace (sauce: http://stackoverflow.com/questions/630453/put-vs-post-in-rest)\n\nthe PATCH on line 36 is just there for updating.","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"## Identity Providers CRUD operations"},{"line_number":49,"context_line":"        mapper.connect("},{"line_number":50,"context_line":"            \u0027/OS-FEDERATION/identity_providers\u0027,"},{"line_number":51,"context_line":"            controller\u003didp_controller,"},{"line_number":52,"context_line":"            action\u003d\u0027create_identity_provider\u0027,"},{"line_number":53,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEcU%3D","line":50,"updated":"2014-01-17 19:07:22.000000000","message":"suggest have a constant for /OS-FEDERATION so doesn\u0027t have to be duplicated.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"## Identity Providers CRUD operations"},{"line_number":49,"context_line":"        mapper.connect("},{"line_number":50,"context_line":"            \u0027/OS-FEDERATION/identity_providers\u0027,"},{"line_number":51,"context_line":"            controller\u003didp_controller,"},{"line_number":52,"context_line":"            action\u003d\u0027create_identity_provider\u0027,"},{"line_number":53,"context_line":"            conditions\u003ddict(method\u003d[\u0027POST\u0027]))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBJw%3D","line":50,"in_reply_to":"AAAAUH%2F%2FEcU%3D","updated":"2014-01-18 22:04:10.000000000","message":"ok.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        mapper.connect("},{"line_number":53,"context_line":"            self._construct_url(\u0027identity_providers/{idp_id}\u0027),"},{"line_number":54,"context_line":"            controller\u003didp_controller,"},{"line_number":55,"context_line":"            action\u003d\u0027put_identity_provider\u0027,"},{"line_number":56,"context_line":"            conditions\u003ddict(method\u003d[\u0027PUT\u0027]))"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        mapper.connect("}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B1z8%3D","line":55,"updated":"2014-01-21 14:58:39.000000000","message":"create_","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            self._construct_url(\u0027identity_providers/{idp_id}/\u0027"},{"line_number":85,"context_line":"                                \u0027protocols/{protocol_id}\u0027),"},{"line_number":86,"context_line":"            controller\u003dprotocol_controller,"},{"line_number":87,"context_line":"            action\u003d\u0027put_protocol\u0027,"},{"line_number":88,"context_line":"            conditions\u003ddict(method\u003d[\u0027PUT\u0027]))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        mapper.connect("}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B10A%3D","line":87,"updated":"2014-01-21 14:58:39.000000000","message":"create_","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":29,"context_line":"     PATCH /OS-FEDERATION/identity_providers/$identity_providers"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"     GET /OS-FEDERATION/identity_providers/"},{"line_number":32,"context_line":"         $identity_providers/protocols"},{"line_number":33,"context_line":"     GET /OS-FEDERATION/identity_providers/"},{"line_number":34,"context_line":"         $identity_providers/protocols/$protocol"},{"line_number":35,"context_line":"     PUT /OS-FEDERATION/identity_providers/"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0L8%3D","line":32,"updated":"2014-01-21 20:14:24.000000000","message":"identity_providers should be identity_provider ?","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"## Protocol CRUD operations"},{"line_number":83,"context_line":"        mapper.connect("},{"line_number":84,"context_line":"            self._construct_url(\u0027identity_providers/{idp_id}/\u0027"},{"line_number":85,"context_line":"                                \u0027protocols/{protocol_id}\u0027),"},{"line_number":86,"context_line":"            controller\u003dprotocol_controller,"},{"line_number":87,"context_line":"            action\u003d\u0027create_protocol\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0Lw%3D","line":84,"updated":"2014-01-21 20:14:24.000000000","message":"could have \"construct_identity_provider_url()\" so don\u0027t have to duplicate identity_providers/{idp_id}/ everywhere.","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like::"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        PUT /OS-FEDERATION/identity_providers"},{"line_number":27,"context_line":"        GET /OS-FEDERATION/identity_providers"},{"line_number":28,"context_line":"        GET /OS-FEDERATION/identity_providers/$identity_provider"},{"line_number":29,"context_line":"        DELETE /OS-FEDERATION/identity_providers/$identity_provider"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz6g%3D","line":26,"updated":"2014-01-21 21:03:41.000000000","message":"should be\n\n PUT /OS-FEDERATION/identity_providers/$identity_provider","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9610bf627af777b7760316f3f691470aa927a1d5","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    The API looks like::"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"        PUT /OS-FEDERATION/identity_providers"},{"line_number":27,"context_line":"        GET /OS-FEDERATION/identity_providers"},{"line_number":28,"context_line":"        GET /OS-FEDERATION/identity_providers/$identity_provider"},{"line_number":29,"context_line":"        DELETE /OS-FEDERATION/identity_providers/$identity_provider"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bzt8%3D","line":26,"in_reply_to":"AAAAUH%2F%2Bz6g%3D","updated":"2014-01-21 21:47:18.000000000","message":"++","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/exception.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    message_format \u003d _(\"Could not find IdentityProvider, %(idp_id)s.\")"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class IdentityProviderKeyNotFound(NotFound):"},{"line_number":238,"context_line":"    message_format \u003d _(\"Could not find public key for\""},{"line_number":239,"context_line":"                       \"IdentityProvider, %(idp_id)s\")"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85lU%3D","line":237,"updated":"2013-12-19 01:26:32.000000000","message":"remove this block","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                       \" of column %(type)s(CHAR(%(length)d)).\")"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class ImmutableAttributeError(ValidationError):"},{"line_number":104,"context_line":"    message_format \u003d _(\"Could not change immutable attribute %(attribute)s\""},{"line_number":105,"context_line":"                       \" in target %(target)s\")"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEcE%3D","line":103,"updated":"2014-01-17 19:07:22.000000000","message":"It\u0027s incorrect to send a 400 Bad Request for this since the server understood the request. Should be 403 Forbidden since the server didn\u0027t want to do it.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                       \" of column %(type)s(CHAR(%(length)d)).\")"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class ImmutableAttributeError(ValidationError):"},{"line_number":104,"context_line":"    message_format \u003d _(\"Could not change immutable attribute %(attribute)s\""},{"line_number":105,"context_line":"                       \" in target %(target)s\")"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKI%3D","line":103,"in_reply_to":"AAAAUH%2F%2FEcE%3D","updated":"2014-01-18 22:04:10.000000000","message":"awesome comment. I will fix it!","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class FederatedProtocolNotFound(NotFound):"},{"line_number":238,"context_line":"    message_format \u003d _(\"Could not find federated protocol for\""},{"line_number":239,"context_line":"                       \" IdentityProvider, %(idp_id)s\")"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class Conflict(Error):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEb0%3D","line":239,"updated":"2014-01-17 19:07:22.000000000","message":"shouldn\u0027t this also include the protocol ID?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"cf9ab19f8c1f433ab4560c97e5186f5d53dd99f8","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class FederatedProtocolNotFound(NotFound):"},{"line_number":238,"context_line":"    message_format \u003d _(\"Could not find federated protocol for\""},{"line_number":239,"context_line":"                       \" IdentityProvider, %(idp_id)s\")"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class Conflict(Error):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FBKQ%3D","line":239,"in_reply_to":"AAAAUH%2F%2FEb0%3D","updated":"2014-01-18 22:04:10.000000000","message":"good point!","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"e309679b4ea1f56a7bf5cbef40454ec92e091442","unresolved":false,"context_lines":[{"line_number":163,"context_line":"                       \" requested action, %(action)s.\")"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"class ImmutableAttributeError(Forbidden):"},{"line_number":167,"context_line":"    message_format \u003d _(\"Could not change immutable attribute %(attribute)s\""},{"line_number":168,"context_line":"                       \" in target %(target)s\")"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUH%2F%2B1zk%3D","line":166,"updated":"2014-01-21 14:58:39.000000000","message":"400 ValidationError","commit_id":"02eaf8994fecf22071eedbdb446ec45df42efe64"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"070dd0413a097285568565282e1f788c3f771d26","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    title \u003d \u0027Bad Request\u0027"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"class ImmutableAttributeError(ValidationError):"},{"line_number":114,"context_line":"    message_format \u003d _("},{"line_number":115,"context_line":"        \u0027Could not change immutable attribute %(attribute)s in %(target)s\u0027)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F%2B1pw%3D","line":113,"updated":"2014-01-21 15:22:31.000000000","message":"It\u0027s incorrect to send a 400 Bad Request for this since the server understood the request. Should be 403 Forbidden since the server didn\u0027t want to do it.","commit_id":"818e11738025e310650689caf9965a051495de75"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                       \" of column %(type)s(CHAR(%(length)d)).\")"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class ImmutableAttributeError(ValidationError):"},{"line_number":104,"context_line":"    message_format \u003d _(\"Could not change immutable attribute %(attribute)s\""},{"line_number":105,"context_line":"                       \" in target %(target)s\")"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0Lk%3D","line":103,"updated":"2014-01-21 20:14:24.000000000","message":"It\u0027s incorrect to send a 400 Bad Request for this since the server understood the request. Should be 403 Forbidden since the server didn\u0027t want to do it.","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"8e367e4b803ddebc931b0efd6440614ed701bd3b","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"class FederatedProtocolNotFound(NotFound):"},{"line_number":242,"context_line":"    message_format \u003d _(\"Could not find federated protocol %(protocol_id)s for\""},{"line_number":243,"context_line":"                       \" IdentityProvider, %(idp_id)s\")"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Buyo%3D","line":242,"updated":"2014-01-22 18:08:44.000000000","message":"nit-pick: federated or federation","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/service.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4faa9387fe5ca13a77cdb117055557e9ef7a60d3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        DRIVERS[\u0027oauth1_api\u0027] \u003d oauth1.Manager()"},{"line_number":67,"context_line":"    if include_federation:"},{"line_number":68,"context_line":"        from keystone.contrib import federation"},{"line_number":69,"context_line":"        DRIVERS[\u0027federation_api\u0027] \u003d federation.Manager()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    dependency.resolve_future_dependencies()"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2F0Oc%3D","line":69,"updated":"2014-01-08 05:53:59.000000000","message":"just a heads up, in case this patch gets in first, you may have to rebase: https://review.openstack.org/#/c/64349/","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c196fd22566ea4061c3aafd247cf80f92f7cc65b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        DRIVERS[\u0027oauth1_api\u0027] \u003d oauth1.Manager()"},{"line_number":67,"context_line":"    if include_federation:"},{"line_number":68,"context_line":"        from keystone.contrib import federation"},{"line_number":69,"context_line":"        DRIVERS[\u0027federation_api\u0027] \u003d federation.Manager()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    dependency.resolve_future_dependencies()"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUH%2F%2FzS4%3D","line":69,"in_reply_to":"AAAAUH%2F%2F0Oc%3D","updated":"2014-01-08 10:03:25.000000000","message":"thanks.","commit_id":"a1ac1fe78fe0a56b47f24c64e18c56e6621a0d6e"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def load_backends():"},{"line_number":46,"context_line":"    # Ensure that the identity driver is created before the assignment manager."},{"line_number":47,"context_line":"    # The default assignment driver is determined by the identity driver, so"},{"line_number":48,"context_line":"    # the identity driver must be available to the assignment manager."},{"line_number":49,"context_line":"    _IDENTITY_API \u003d identity.Manager()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEbs%3D","line":46,"updated":"2014-01-17 19:07:22.000000000","message":"revert whitespace change on previous line.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def load_backends():"},{"line_number":46,"context_line":"    # Ensure that the identity driver is created before the assignment manager."},{"line_number":47,"context_line":"    # The default assignment driver is determined by the identity driver, so"},{"line_number":48,"context_line":"    # the identity driver must be available to the assignment manager."},{"line_number":49,"context_line":"    _IDENTITY_API \u003d identity.Manager()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz6M%3D","line":46,"updated":"2014-01-21 21:03:41.000000000","message":"revert whitespace change on previous line.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/tests/test_backend_federation_sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                (\u0027enabled\u0027, sql.Boolean, None),"},{"line_number":35,"context_line":"                (\u0027domain_id\u0027, sql.String, 64),"},{"line_number":36,"context_line":"                (\u0027description\u0027, sql.Text, None))"},{"line_number":37,"context_line":"#                (\u0027protocols\u0027, sql.JsonBlob, None))"},{"line_number":38,"context_line":"        self.assertExpectedSchema(\u0027identity_provider\u0027, cols)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def test_identity_provider_key(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90B0%3D","line":37,"updated":"2013-12-05 16:51:08.000000000","message":"Remove commented out code.","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\"Set of tests for checking SQL Federation.\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def setUp(self):"},{"line_number":28,"context_line":"        super(SqlFederation, self).setUp()"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_identity_provider(self):"},{"line_number":31,"context_line":"        cols \u003d ((\u0027id\u0027, sql.String, 64),"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz50%3D","line":28,"updated":"2014-01-21 21:03:41.000000000","message":"remove this function since this is the default.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/tests/test_sql_migrate_extensions.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":144,"context_line":"        super(FederationExtension, self).__init__(*args, **kwargs)"},{"line_number":145,"context_line":"        self.identity_provider \u003d \u0027identity_provider\u0027"},{"line_number":146,"context_line":"        self.federation_protocol \u003d \u0027federation_protocol\u0027"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def repo_package(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz5M%3D","line":145,"updated":"2014-01-21 21:03:41.000000000","message":"suggest move this to setUp rather than changing __init__ for testcase.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}],"keystone/tests/test_v3_federation.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"03d6557ae296927a1ee948690b6c3f31ac37e612","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # Now that the app has been served, we can query CONF values"},{"line_number":64,"context_line":"        self.base_url \u003d (CONF.public_endpoint % CONF) + \"v3\""},{"line_number":65,"context_line":"        self.controller \u003d controllers.IdentityProvider()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class FederatedIdentityProviderTests(FederationTests):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9ue0%3D","line":65,"updated":"2013-12-06 17:13:57.000000000","message":"these two variables aren\u0027t being used anywhere","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        pubkey \u003d {\u0027key\u0027: key}"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        url \u003d url % {\u0027idp_id\u0027: idp_id}"},{"line_number":140,"context_line":"## SHOULD BE expected_status\u003d201"},{"line_number":141,"context_line":"        resp \u003d self.put(url, body\u003d{\u0027public_key\u0027: pubkey},"},{"line_number":142,"context_line":"                        expected_status\u003dexpected_status, **kwargs)"},{"line_number":143,"context_line":"        return (resp, idp_id, key)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90Bc%3D","line":140,"updated":"2013-12-05 16:51:08.000000000","message":"Convert to NOTE format:\n\nhttps://github.com/openstack/keystone/blob/master/HACKING.rst#todo-vs-fixme","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"74bee29c900b1cd3a3df8028e5e9f4b36b718b1d","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        for key in body.keys():"},{"line_number":275,"context_line":"            self.assertEqual(body[key], updated_idp.get(key))"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"# check whether changes were stored in the backend."},{"line_number":278,"context_line":"        resp \u003d self.get(url)"},{"line_number":279,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":280,"context_line":"                                                          \u0027identity_provider\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F90BU%3D","line":277,"updated":"2013-12-05 16:51:08.000000000","message":"ditto","commit_id":"041364afbc118047c5bdc613b862cbcef9255013"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def dummy_validator(*args, **kwargs):"},{"line_number":39,"context_line":"    pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class FederationTests(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85j8%3D","line":39,"updated":"2013-12-19 01:26:32.000000000","message":"are you planning to implement the validator?","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"a12125d3c971b4705dc13740c3e2c6d65a60f1f8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                    \u0027enabled\u0027: True}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def base_url(self, suffix\u003d\u0027\u0027):"},{"line_number":72,"context_line":"        return \u0027/OS-IDP/identity_providers\u0027 + suffix"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _fetch_attribute_from_response(self, resp, parameter,"},{"line_number":75,"context_line":"                                       assertNone\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F85k0%3D","line":72,"updated":"2013-12-19 01:26:32.000000000","message":"change /OS-IDP/ to /OS-FEDERATION/","commit_id":"8ccb3cbc229ad021d8e76fe4b5b36558aff1ef6d"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        resp, idp_id, proto \u003d self._assign_protocol_to_idp(expected_status\u003d200)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_protocol_composite_pk(self):"},{"line_number":307,"context_line":"        \"\"\"Check whether Keystone let\u0027s add two entities with identical"},{"line_number":308,"context_line":"        names, however attached to diferent IdPs."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        1. Add IdP and assign it protocol with predefined name"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAT3%2F%2F5DU%3D","line":307,"updated":"2013-12-27 19:58:57.000000000","message":"\"let\u0027s\" should be  \"lets us\"","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":304,"context_line":"        resp, idp_id, proto \u003d self._assign_protocol_to_idp(expected_status\u003d200)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_protocol_composite_pk(self):"},{"line_number":307,"context_line":"        \"\"\"Check whether Keystone let\u0027s add two entities with identical"},{"line_number":308,"context_line":"        names, however attached to diferent IdPs."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        1. Add IdP and assign it protocol with predefined name"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2F8O0%3D","line":307,"in_reply_to":"AAAAT3%2F%2F5DU%3D","updated":"2014-01-06 14:05:40.000000000","message":"Done","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"67eca411a4b193b645e94d875631c86802ebe726","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_protocol_composite_pk(self):"},{"line_number":307,"context_line":"        \"\"\"Check whether Keystone let\u0027s add two entities with identical"},{"line_number":308,"context_line":"        names, however attached to diferent IdPs."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        1. Add IdP and assign it protocol with predefined name"},{"line_number":311,"context_line":"        2. Add another IdP and assign it a protocol with same name."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAT3%2F%2F5DQ%3D","line":308,"updated":"2013-12-27 19:58:57.000000000","message":"\"however\" should be \"with each\"","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"dc0a064aef6d5bac2550155d2cc2169adeb1aa63","unresolved":false,"context_lines":[{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_protocol_composite_pk(self):"},{"line_number":307,"context_line":"        \"\"\"Check whether Keystone let\u0027s add two entities with identical"},{"line_number":308,"context_line":"        names, however attached to diferent IdPs."},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        1. Add IdP and assign it protocol with predefined name"},{"line_number":311,"context_line":"        2. Add another IdP and assign it a protocol with same name."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2F8Ow%3D","line":308,"in_reply_to":"AAAAT3%2F%2F5DQ%3D","updated":"2014-01-06 14:05:40.000000000","message":"Done","commit_id":"b04108a2725be2173a293468c467b30cf3446c46"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"217d72e56b345d77dc3b64e98ff8cf0df700d748","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    return \u0027\u0027.join(random.choice(chars) for x in range(size))"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def dummy_validator(*args, **kwargs):"},{"line_number":39,"context_line":"    pass"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Fl6g%3D","line":38,"updated":"2014-01-10 17:34:16.000000000","message":"?","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"217d72e56b345d77dc3b64e98ff8cf0df700d748","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        keys_to_check \u003d self.minimum_idp_keys"},{"line_number":164,"context_line":"        body \u003d self._http_input()"},{"line_number":165,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":166,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":167,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":168,"context_line":"                                 ref\u003dbody)"},{"line_number":169,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F%2Fl60%3D","line":166,"updated":"2014-01-10 17:34:16.000000000","message":"probably should use something other than the dummy validator","commit_id":"74d75a1050c96eef498e9daaa80fcb9652003a20"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                       assertNone\u003dTrue):"},{"line_number":76,"context_line":"        \"\"\"Fetch single attribute from TestResponse object.\"\"\""},{"line_number":77,"context_line":"        result \u003d resp.result.get(parameter, None)"},{"line_number":78,"context_line":"        if assertNone:"},{"line_number":79,"context_line":"            self.assertIsNotNone(result)"},{"line_number":80,"context_line":"        return result"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEac%3D","line":78,"updated":"2014-01-17 19:07:22.000000000","message":"shouldn\u0027t this be \"if assert_is_not_none\" ?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return result"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _fetch_attributes_from_response(self, resp, parameters\u003d[],"},{"line_number":83,"context_line":"                                        assertNone\u003dTrue):"},{"line_number":84,"context_line":"        \"\"\"Fetch parameters from the TestResponse object.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        result \u003d dict()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEaQ%3D","line":83,"updated":"2014-01-17 19:07:22.000000000","message":"user normal naming convention for parameters -- assert_none\u003dTrue","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        return result"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _fetch_attributes_from_response(self, resp, parameters\u003d[],"},{"line_number":83,"context_line":"                                        assertNone\u003dTrue):"},{"line_number":84,"context_line":"        \"\"\"Fetch parameters from the TestResponse object.\"\"\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        result \u003d dict()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6Zw%3D","line":83,"in_reply_to":"AAAAUH%2F%2FEaQ%3D","updated":"2014-01-20 20:19:18.000000000","message":"+1 this will make it much easier to review since it looks a lot like self.assertIsNone()","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":96,"context_line":"        idp \u003d self._fetch_attribute_from_response(default_resp,"},{"line_number":97,"context_line":"                                                  \u0027identity_provider\u0027)"},{"line_number":98,"context_line":"        self.assertIsNotNone(idp)"},{"line_number":99,"context_line":"        idp_id \u003d idp.get(\u0027id\u0027)"},{"line_number":100,"context_line":"        self.assertIsNotNone(idp_id)"},{"line_number":101,"context_line":"        return (str(idp_id), idp)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEaM%3D","line":98,"updated":"2014-01-17 19:07:22.000000000","message":"this is already asserted by the next line.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":121,"context_line":"    def _http_input(self, **kwargs):"},{"line_number":122,"context_line":"        body \u003d None"},{"line_number":123,"context_line":"        if \u0027body\u0027 not in kwargs:"},{"line_number":124,"context_line":"            body \u003d FederatedIdentityProviderTests.default_body.copy()"},{"line_number":125,"context_line":"            body[\u0027name\u0027] \u003d string_generator()"},{"line_number":126,"context_line":"            body[\u0027description\u0027] \u003d string_generator()"},{"line_number":127,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEZo%3D","line":124,"updated":"2014-01-17 19:07:22.000000000","message":"change \"FederatedIdentityProviderTests\" to \"self\"","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            idp_id, _ \u003d self._create_and_decapsulate_response()"},{"line_number":137,"context_line":"        if proto is None:"},{"line_number":138,"context_line":"            proto \u003d string_generator(size\u003d8)"},{"line_number":139,"context_line":"        if mapping_id is None:"},{"line_number":140,"context_line":"            mapping_id \u003d string_generator(size\u003d8)"},{"line_number":141,"context_line":"        body \u003d {\u0027mapping_id\u0027: mapping_id}"},{"line_number":142,"context_line":"        url \u003d url % {\u0027idp_id\u0027: idp_id,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6ZI%3D","line":139,"updated":"2014-01-20 20:19:18.000000000","message":"Can\u0027t we use hex.uuid here like: \n\nhttps://github.com/openstack/keystone/blob/master/keystone/tests/test_v3.py#L110","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        return r"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_create_idp(self):"},{"line_number":161,"context_line":"        \"\"\"Creates the IdentityProvider entity.\"\"\""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        keys_to_check \u003d self.minimum_idp_keys"},{"line_number":164,"context_line":"        body \u003d self._http_input()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6Yw%3D","line":161,"updated":"2014-01-20 20:19:18.000000000","message":"(NIT): \"\"\"Test creation of an IdentityProvider entity.\"\"\"","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                                 ref\u003dbody)"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":171,"context_line":"        \"\"\"Lists all available IdentityProviders."},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        This test collects ids of created IdPs and"},{"line_number":174,"context_line":"        intersects it with the list of all available IdPs."}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6YA%3D","line":171,"updated":"2014-01-20 20:19:18.000000000","message":"(NIT): \"\"\"Test listing available IdentityProviders.\"\"\"","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        url \u003d self.base_url()"},{"line_number":185,"context_line":"        ids \u003d []"},{"line_number":186,"context_line":"        for _ in xrange(iterations):"},{"line_number":187,"context_line":"            id \u003d get_id(self._create_default_idp())"},{"line_number":188,"context_line":"            ids.append(id)"},{"line_number":189,"context_line":"        ids \u003d set(ids)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6Xg%3D","line":186,"updated":"2014-01-20 20:19:18.000000000","message":"Suggest changing this to something a little more readable: \n\n    for idp in xrange(iterations)\n\nAlso, it the number of iterations something that needs to be passed in or could it just be defined in the test case as five?","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            ids.append(id)"},{"line_number":189,"context_line":"        ids \u003d set(ids)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        keys_to_check \u003d FederatedIdentityProviderTests.full_idp_keys"},{"line_number":192,"context_line":"        resp \u003d self.get(url)"},{"line_number":193,"context_line":"        self.assertValidListResponse(resp, \u0027identity_providers\u0027,"},{"line_number":194,"context_line":"                                     dummy_validator,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEYk%3D","line":191,"updated":"2014-01-17 19:07:22.000000000","message":"change \"FederatedIdentityProviderTests\" to \"self\"","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                                                       \u0027identity_providers\u0027)"},{"line_number":198,"context_line":"        entities_ids \u003d set([e[\u0027id\u0027] for e in entities])"},{"line_number":199,"context_line":"        ids_intersect \u003d entities_ids \u0026 ids"},{"line_number":200,"context_line":"        self.assertEqual(len(ids_intersect), len(ids))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_get_idp(self):"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FEXI%3D","line":200,"updated":"2014-01-17 19:07:22.000000000","message":"we should know what the resulting list is supposed to look like so that we can check that the lists are equal instead of the length.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fdc0e9d682581e175f2af288ef5ec68de69bc8b2","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        ids_intersect \u003d entities_ids \u0026 ids"},{"line_number":200,"context_line":"        self.assertEqual(len(ids_intersect), len(ids))"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def test_get_idp(self):"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        url \u003d self.base_url(suffix\u003d\u0027/%(idp_id)s\u0027)"},{"line_number":205,"context_line":"        body \u003d self._http_input()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2B6XM%3D","line":202,"updated":"2014-01-20 20:19:18.000000000","message":"Add doc strings to be consistent with other test cases.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        idp_id \u003d default_idp.get(\u0027id\u0027)"},{"line_number":235,"context_line":"        self.assertIsNotNone(idp_id)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        url \u003d url % {\u0027idp_id\u0027: str(idp_id)}"},{"line_number":238,"context_line":"        self.delete(url)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"        self.get(url, expected_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FESU%3D","line":237,"updated":"2014-01-17 19:07:22.000000000","message":"suggest move line 229 here - url \u003d self.base_url(suffix\u003d\u0027/%(idp_id)s\u0027 % idp_id)\n\n(applies throughout these changes... don\u0027t need 2 lines where 1 would do)","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":301,"context_line":"        self.patch(url, body\u003dbody, expected_status\u003d404)"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def test_assign_protocol_to_idp(self):"},{"line_number":304,"context_line":"        resp, idp_id, proto \u003d self._assign_protocol_to_idp(expected_status\u003d200)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_protocol_composite_pk(self):"},{"line_number":307,"context_line":"        \"\"\"Check whether Keystone let\u0027s add two entities with identical"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FERo%3D","line":304,"updated":"2014-01-17 19:07:22.000000000","message":"the response variables are not used, remove them.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"f3209bfa73e9b4ebc48c0edd1f9195fed459b20c","unresolved":false,"context_lines":[{"line_number":315,"context_line":"        url \u003d self.base_url(suffix\u003d\u0027/%(idp_id)s/protocols/%(protocol_id)s\u0027)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        kwargs \u003d {\u0027expected_status\u0027: 200}"},{"line_number":318,"context_line":"        resp, idp_id, proto \u003d self._assign_protocol_to_idp(proto\u003d\u0027saml2\u0027,"},{"line_number":319,"context_line":"                                                           url\u003durl, **kwargs)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"        resp, idp_id, proto \u003d self._assign_protocol_to_idp(proto\u003d\u0027saml2\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2FERg%3D","line":318,"updated":"2014-01-17 19:07:22.000000000","message":"not used -- this applies throughout these changes.","commit_id":"5f1d8898a4a19a1360b9ceed28207987adac9306"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e6f2c93a1161d4e12bfcf08769dddfd62e82f811","unresolved":false,"context_lines":[{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def dummy_validator(*args, **kwargs):"},{"line_number":34,"context_line":"    pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B02Y%3D","line":33,"updated":"2014-01-21 17:33:10.000000000","message":"This needs to be replaced with an appropriate validator for IdP and for Protocol.  Potentially multiple","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"e6f2c93a1161d4e12bfcf08769dddfd62e82f811","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"        idp_id \u003d uuid.uuid4().hex"},{"line_number":359,"context_line":"        kwargs \u003d {\u0027expected_status\u0027: 404}"},{"line_number":360,"context_line":"        self._assign_protocol_to_idp(proto\u003d\u0027saml2\u0027,"},{"line_number":361,"context_line":"                                     idp_id\u003didp_id,"},{"line_number":362,"context_line":"                                     validate\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2B05o%3D","line":359,"updated":"2014-01-21 17:33:10.000000000","message":"You could make these constants:\nkwargs \u003d {\u0027expected_status\u0027: 404}  could be\nEXPECT_NOT_FOUND \u003d {\u0027expected_status\u0027: 404}","commit_id":"5128e9298a2a31ca1cae076cd74ba0ed6df04b59"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2147c34094a4e0e9679f2bfc875e2dd7ed46e722","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        body[\u0027protocols\u0027] \u003d [uuid.uuid4().hex, uuid.uuid4().hex]"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        url \u003d self.base_url(suffix\u003didp_id)"},{"line_number":293,"context_line":"        self.patch(url, body\u003d{\u0027identity_provider\u0027: body}, expected_status\u003d400)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def test_update_nonexistent_idp(self):"},{"line_number":296,"context_line":"        \"\"\"Update nonexistent IdP"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F%2B0K8%3D","line":293,"updated":"2014-01-21 20:14:24.000000000","message":"since the request was understood this should not be a 400, should be 403 Forbidden since the server understood but didn\u0027t want to do it.","commit_id":"619b6670b04bdb97543685f0cfc8232fa9f609e4"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d47c7520f3a093b56c9c9afd1653d340d4ce0ad5","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def dummy_validator(*args, **kwargs):"},{"line_number":34,"context_line":"    pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class FederationTests(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz5Y%3D","line":34,"updated":"2014-01-21 21:02:59.000000000","message":"needs a better validator","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9610bf627af777b7760316f3f691470aa927a1d5","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def dummy_validator(*args, **kwargs):"},{"line_number":34,"context_line":"    pass"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class FederationTests(test_v3.RestfulTestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2BztY%3D","line":34,"in_reply_to":"AAAAUH%2F%2Bz5Y%3D","updated":"2014-01-21 21:47:18.000000000","message":"Or at least an example of what you\u0027re expecting a validator to do.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d441779264c0a4566c42e0fb58225a6356df3487","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    EXTENSION_TO_ADD \u003d \u0027federation_extension\u0027"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":43,"context_line":"        super(FederationTests, self).__init__(*args, **kwargs)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setup_database(self):"},{"line_number":46,"context_line":"        super(FederationTests, self).setup_database()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUH%2F%2Bz5E%3D","line":43,"updated":"2014-01-21 21:03:41.000000000","message":"remove this method since it\u0027s the default.","commit_id":"20840199e6558d6e2ad908cb3d2d3c319befaec5"}]}
