)]}'
{"keystone/identity/backends/sql.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ee34abbd029dbce916ad2e5ff881f549373a64e8","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def create_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":266,"context_line":"                     domain_id\u003dNone, project_id\u003dNone):"},{"line_number":267,"context_line":"        session \u003d self.get_session()"},{"line_number":268,"context_line":"        self._get_role(session, role_id)"},{"line_number":269,"context_line":"        if user_id:"},{"line_number":270,"context_line":"            self._get_user(session, user_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fjjo%3D","line":267,"updated":"2013-05-04 01:32:06.000000000","message":"self.get_session90 should be self.create_session(), as get implies accessor.","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"402022627962cde23416dff65a37e234ae0cf914","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def create_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":266,"context_line":"                     domain_id\u003dNone, project_id\u003dNone):"},{"line_number":267,"context_line":"        session \u003d self.get_session()"},{"line_number":268,"context_line":"        self._get_role(session, role_id)"},{"line_number":269,"context_line":"        if user_id:"},{"line_number":270,"context_line":"            self._get_user(session, user_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FU%2BQ%3D","line":267,"in_reply_to":"AAAAOn%2F%2FVBo%3D","updated":"2013-05-14 15:14:42.000000000","message":"here you go: https://review.openstack.org/#/c/29093/","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"01af0d3c0a8004f6bb72c553e5450c492e87e1ad","unresolved":false,"context_lines":[{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def create_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":266,"context_line":"                     domain_id\u003dNone, project_id\u003dNone):"},{"line_number":267,"context_line":"        session \u003d self.get_session()"},{"line_number":268,"context_line":"        self._get_role(session, role_id)"},{"line_number":269,"context_line":"        if user_id:"},{"line_number":270,"context_line":"            self._get_user(session, user_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FVBo%3D","line":267,"in_reply_to":"AAAAOn%2F%2Fjjo%3D","updated":"2013-05-14 15:03:55.000000000","message":"good point -- i\u0027ll do that in a separate patch","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"48e930f801beb3a87e6a6b4867e401720c58885e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"        session \u003d self.get_session()"},{"line_number":340,"context_line":"        self._get_role(session, role_id)"},{"line_number":341,"context_line":"        if user_id:"},{"line_number":342,"context_line":"            self._get_user(session, user_id)"},{"line_number":343,"context_line":"        if group_id:"},{"line_number":344,"context_line":"            self._get_group(session, group_id)"},{"line_number":345,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Flxs%3D","line":342,"updated":"2013-05-02 17:42:32.000000000","message":"why doesn\u0027t _get_user directly access self.session?  Why is it passed in as a param instead?","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"59f5fd447fa14e7a171805ac909be58f278a680a","unresolved":false,"context_lines":[{"line_number":339,"context_line":"        session \u003d self.get_session()"},{"line_number":340,"context_line":"        self._get_role(session, role_id)"},{"line_number":341,"context_line":"        if user_id:"},{"line_number":342,"context_line":"            self._get_user(session, user_id)"},{"line_number":343,"context_line":"        if group_id:"},{"line_number":344,"context_line":"            self._get_group(session, group_id)"},{"line_number":345,"context_line":"        if domain_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Flo0%3D","line":342,"in_reply_to":"AAAAOn%2F%2Flxs%3D","updated":"2013-05-02 19:01:11.000000000","message":"self.session doesn\u0027t exist","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ee34abbd029dbce916ad2e5ff881f549373a64e8","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        self._get_role(session, role_id)"},{"line_number":341,"context_line":"        if user_id:"},{"line_number":342,"context_line":"            self._get_user(session, user_id)"},{"line_number":343,"context_line":"        if group_id:"},{"line_number":344,"context_line":"            self._get_group(session, group_id)"},{"line_number":345,"context_line":"        if domain_id:"},{"line_number":346,"context_line":"            self._get_domain(session, domain_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fjjk%3D","line":343,"updated":"2013-05-04 01:32:06.000000000","message":"My concern here is that we are creating session objects this way, but we are not destroying or releasing them. Usually, each session maps to a one database connection, so I am worried that we are going to consume all of the database connections.","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"01af0d3c0a8004f6bb72c553e5450c492e87e1ad","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        self._get_role(session, role_id)"},{"line_number":341,"context_line":"        if user_id:"},{"line_number":342,"context_line":"            self._get_user(session, user_id)"},{"line_number":343,"context_line":"        if group_id:"},{"line_number":344,"context_line":"            self._get_group(session, group_id)"},{"line_number":345,"context_line":"        if domain_id:"},{"line_number":346,"context_line":"            self._get_domain(session, domain_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FVBY%3D","line":343,"in_reply_to":"AAAAOn%2F%2Fjjk%3D","updated":"2013-05-14 15:03:55.000000000","message":"not sure i follow - this is recycling the session, so it would be alleviating your concern","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"48e930f801beb3a87e6a6b4867e401720c58885e","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            pass"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def get_roles_for_user_and_project(self, user_id, tenant_id):"},{"line_number":401,"context_line":"        session \u003d self.get_session()"},{"line_number":402,"context_line":"        self._get_user(session, user_id)"},{"line_number":403,"context_line":"        self._get_project(session, tenant_id)"},{"line_number":404,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Flxw%3D","line":401,"updated":"2013-05-02 17:42:32.000000000","message":"Does this pattern automatically clean up the session?","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"59f5fd447fa14e7a171805ac909be58f278a680a","unresolved":false,"context_lines":[{"line_number":398,"context_line":"            pass"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def get_roles_for_user_and_project(self, user_id, tenant_id):"},{"line_number":401,"context_line":"        session \u003d self.get_session()"},{"line_number":402,"context_line":"        self._get_user(session, user_id)"},{"line_number":403,"context_line":"        self._get_project(session, tenant_id)"},{"line_number":404,"context_line":"        metadata_ref \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Flow%3D","line":401,"in_reply_to":"AAAAOn%2F%2Flxw%3D","updated":"2013-05-02 19:01:11.000000000","message":"this shouldn\u0027t result in a dirty session","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a5a949f51764f3cb6fe68011d6d1faecebbcdcc5","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        session \u003d self.get_session()"},{"line_number":487,"context_line":""},{"line_number":488,"context_line":"        with session.begin():"},{"line_number":489,"context_line":"            tenant_ref \u003d self._get_project(session, tenant_id)"},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"            q \u003d session.query(UserProjectGrant)"},{"line_number":492,"context_line":"            q \u003d q.filter_by(project_id\u003dtenant_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FnTU%3D","line":489,"updated":"2013-05-01 20:21:32.000000000","message":"I really like how you moved the exception checking code into the _get_project method and the similar methods.  You made the code incredibly cleaner by doing that!","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ea8c8a5f8f2b32907e69d12b4a6d0d987fe3a52","unresolved":false,"context_lines":[{"line_number":681,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        with session.begin():"},{"line_number":684,"context_line":"            user_ref \u003d session.query(User).get(user_id)"},{"line_number":685,"context_line":"            if user_ref is None:"},{"line_number":686,"context_line":"                raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":687,"context_line":"            old_user_dict \u003d user_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2FXQ%3D","line":684,"updated":"2013-05-17 00:02:17.000000000","message":"use self._get_user() here?","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4731cc55d72fa18091b41a08a1482d1a036a8397","unresolved":false,"context_lines":[{"line_number":681,"context_line":"            raise exception.ValidationError(\u0027Cannot change user ID\u0027)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        with session.begin():"},{"line_number":684,"context_line":"            user_ref \u003d session.query(User).get(user_id)"},{"line_number":685,"context_line":"            if user_ref is None:"},{"line_number":686,"context_line":"                raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":687,"context_line":"            old_user_dict \u003d user_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2BWw%3D","line":684,"in_reply_to":"AAAAPH%2F%2F%2FXQ%3D","updated":"2013-05-17 13:35:20.000000000","message":"Done","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ea8c8a5f8f2b32907e69d12b4a6d0d987fe3a52","unresolved":false,"context_lines":[{"line_number":755,"context_line":"    def delete_user(self, user_id):"},{"line_number":756,"context_line":"        session \u003d self.get_session()"},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        ref \u003d session.query(User).get(user_id)"},{"line_number":759,"context_line":"        if not ref:"},{"line_number":760,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":761,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2FXM%3D","line":758,"updated":"2013-05-17 00:02:17.000000000","message":"use self._get_user() here?","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4731cc55d72fa18091b41a08a1482d1a036a8397","unresolved":false,"context_lines":[{"line_number":755,"context_line":"    def delete_user(self, user_id):"},{"line_number":756,"context_line":"        session \u003d self.get_session()"},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"        ref \u003d session.query(User).get(user_id)"},{"line_number":759,"context_line":"        if not ref:"},{"line_number":760,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":761,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2BWc%3D","line":758,"in_reply_to":"AAAAPH%2F%2F%2FXM%3D","updated":"2013-05-17 13:35:20.000000000","message":"Done","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"}],"keystone/token/backends/sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ea8c8a5f8f2b32907e69d12b4a6d0d987fe3a52","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        session \u003d self.get_session()"},{"line_number":44,"context_line":"        token_ref \u003d session.query(TokenModel).get(token.unique_id(token_id))"},{"line_number":45,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":46,"context_line":"        if not token_ref or not token_ref.valid:"},{"line_number":47,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":48,"context_line":"        if not token_ref.expires:"},{"line_number":49,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2FV8%3D","line":46,"updated":"2013-05-17 00:02:17.000000000","message":"suggest move this to a separate if statement to match the pattern.\n\nAlso, maybe should do this in its own commit since looks like it\u0027s fixing a bug?","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4731cc55d72fa18091b41a08a1482d1a036a8397","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        session \u003d self.get_session()"},{"line_number":44,"context_line":"        token_ref \u003d session.query(TokenModel).get(token.unique_id(token_id))"},{"line_number":45,"context_line":"        now \u003d datetime.datetime.utcnow()"},{"line_number":46,"context_line":"        if not token_ref or not token_ref.valid:"},{"line_number":47,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":48,"context_line":"        if not token_ref.expires:"},{"line_number":49,"context_line":"            raise exception.TokenNotFound(token_id\u003dtoken_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2BV4%3D","line":46,"in_reply_to":"AAAAPH%2F%2F%2FV8%3D","updated":"2013-05-17 13:35:20.000000000","message":"there\u0027s no bug fix - note that i removed valid\u003dTrue from the filter and checked it here instead","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6ea8c8a5f8f2b32907e69d12b4a6d0d987fe3a52","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        key \u003d token.unique_id(token_id)"},{"line_number":73,"context_line":"        with session.begin():"},{"line_number":74,"context_line":"            token_ref \u003d session.query(TokenModel).get(key)"},{"line_number":75,"context_line":"            if not token_ref or not token_ref.valid:"},{"line_number":76,"context_line":"                raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":77,"context_line":"            token_ref.valid \u003d False"},{"line_number":78,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2FVU%3D","line":75,"updated":"2013-05-17 00:02:17.000000000","message":"this looks like it\u0027s fixing a different bug.","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4731cc55d72fa18091b41a08a1482d1a036a8397","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        key \u003d token.unique_id(token_id)"},{"line_number":73,"context_line":"        with session.begin():"},{"line_number":74,"context_line":"            token_ref \u003d session.query(TokenModel).get(key)"},{"line_number":75,"context_line":"            if not token_ref or not token_ref.valid:"},{"line_number":76,"context_line":"                raise exception.TokenNotFound(token_id\u003dtoken_id)"},{"line_number":77,"context_line":"            token_ref.valid \u003d False"},{"line_number":78,"context_line":"            session.flush()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPH%2F%2F%2BVk%3D","line":75,"in_reply_to":"AAAAPH%2F%2F%2FVU%3D","updated":"2013-05-17 13:35:20.000000000","message":"same as above; using .get() and checking validity after the ref is returned. don\u0027t have benchmarks, but i suspect this will be faster for valid tokens and slower for invalid tokens","commit_id":"ca314cdd3b96b3791717dfe3b3a2e6a4be69dd03"}],"tests/test_backend_sql.py":[{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"a5a949f51764f3cb6fe68011d6d1faecebbcdcc5","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class SqlIdentity(SqlTests, test_backend.IdentityTests):"},{"line_number":69,"context_line":"    def test_password_hashed(self):"},{"line_number":70,"context_line":"        session \u003d self.identity_api.get_session()"},{"line_number":71,"context_line":"        user_ref \u003d self.identity_api._get_user(session, self.user_foo[\u0027id\u0027])"},{"line_number":72,"context_line":"        self.assertNotEqual(user_ref[\u0027password\u0027], self.user_foo[\u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FnR4%3D","line":69,"updated":"2013-05-01 20:21:32.000000000","message":"what was it about the query.get optimization that made you decide to add a test method to ensure that the password is being hashed?  Not clear to me why this is related to the optimization you put in.","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8e2903c55586cceee8e49697c182ecf34c441bb6","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"class SqlIdentity(SqlTests, test_backend.IdentityTests):"},{"line_number":69,"context_line":"    def test_password_hashed(self):"},{"line_number":70,"context_line":"        session \u003d self.identity_api.get_session()"},{"line_number":71,"context_line":"        user_ref \u003d self.identity_api._get_user(session, self.user_foo[\u0027id\u0027])"},{"line_number":72,"context_line":"        self.assertNotEqual(user_ref[\u0027password\u0027], self.user_foo[\u0027password\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fm2o%3D","line":69,"in_reply_to":"AAAAOn%2F%2FnR4%3D","updated":"2013-05-02 01:36:52.000000000","message":"this is overriding a test in test_backend by the same name... the test is designed to reach into private methods of the driver and verify that it\u0027s not storing the password in plaintext. naturally, the way it gets into those private methods will vary from driver to driver, so i had to do a custom implementation here after changing_get_user()\u0027s method signature (to require an existing session)","commit_id":"8f6e4907cec05433343b18ac8e2301cf24454876"}]}
