)]}'
{"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        role_ids \u003d set(self._roles_from_role_dicts("},{"line_number":222,"context_line":"            metadata_ref.get(\u0027roles\u0027, []), inherited_to_projects))"},{"line_number":223,"context_line":"        if role_id not in role_ids:"},{"line_number":224,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":227,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_b1499c90","line":224,"updated":"2014-11-19 12:38:20.000000000","message":"Taking into account my comment at keystone/exception.py, you should pass role_id, user_id, group_id, domain_id and project_id here.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        role_ids \u003d set(self._roles_from_role_dicts("},{"line_number":222,"context_line":"            metadata_ref.get(\u0027roles\u0027, []), inherited_to_projects))"},{"line_number":223,"context_line":"        if role_id not in role_ids:"},{"line_number":224,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":227,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_11c2d533","line":224,"in_reply_to":"5a890539_b1499c90","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        role_ids \u003d set(self._roles_from_role_dicts("},{"line_number":222,"context_line":"            metadata_ref.get(\u0027roles\u0027, []), inherited_to_projects))"},{"line_number":223,"context_line":"        if role_id not in role_ids:"},{"line_number":224,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":227,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_ff6107d5","line":224,"in_reply_to":"5a890539_b1499c90","updated":"2014-11-30 12:40:02.000000000","message":"the same reply in the sql.py.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self.remove_role_from_user_and_project("},{"line_number":243,"context_line":"                    user_id, project_id, role_id)"},{"line_number":244,"context_line":"        except KeyError:"},{"line_number":245,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def list_grant_role_ids(self, user_id\u003dNone, group_id\u003dNone,"},{"line_number":248,"context_line":"                            domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_315dac49","line":245,"updated":"2014-11-19 12:38:20.000000000","message":"Same as above.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self.remove_role_from_user_and_project("},{"line_number":243,"context_line":"                    user_id, project_id, role_id)"},{"line_number":244,"context_line":"        except KeyError:"},{"line_number":245,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def list_grant_role_ids(self, user_id\u003dNone, group_id\u003dNone,"},{"line_number":248,"context_line":"                            domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_31bfd9ab","line":245,"in_reply_to":"5a890539_315dac49","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self.remove_role_from_user_and_project("},{"line_number":243,"context_line":"                    user_id, project_id, role_id)"},{"line_number":244,"context_line":"        except KeyError:"},{"line_number":245,"context_line":"            raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"    def list_grant_role_ids(self, user_id\u003dNone, group_id\u003dNone,"},{"line_number":248,"context_line":"                            domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_1f6173d3","line":245,"in_reply_to":"5a890539_315dac49","updated":"2014-11-30 12:40:02.000000000","message":"ditto.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    inherited_to_projects)"},{"line_number":158,"context_line":"                q.one()"},{"line_number":159,"context_line":"            except sql.NotFound:"},{"line_number":160,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":163,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_f16c040b","line":160,"updated":"2014-11-19 12:38:20.000000000","message":"Taking into account my comment at keystone/exception.py, you should pass role_id, user_id, group_id, domain_id and project_id here.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    inherited_to_projects)"},{"line_number":158,"context_line":"                q.one()"},{"line_number":159,"context_line":"            except sql.NotFound:"},{"line_number":160,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":163,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_91fc0574","line":160,"in_reply_to":"5a890539_f16c040b","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":157,"context_line":"                    inherited_to_projects)"},{"line_number":158,"context_line":"                q.one()"},{"line_number":159,"context_line":"            except sql.NotFound:"},{"line_number":160,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def delete_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":163,"context_line":"                     domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_3f5c6f19","line":160,"in_reply_to":"5a890539_f16c040b","updated":"2014-11-30 12:40:02.000000000","message":"Samuel, maybe we need think more about this.\n- Is there any case that role_id is None while other field is not None? see the parameter definition in this function.\n- If RoleAssignmentNotFound need other fileds beside role_id, we need pass all of them here which maybe None instead, is that a good behavior? \n\nI think role_id is enough within the scope of role assignment, agree?","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                session, role_id, user_id, group_id, domain_id, project_id,"},{"line_number":168,"context_line":"                inherited_to_projects)"},{"line_number":169,"context_line":"            if not q.delete(False):"},{"line_number":170,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def list_project_ids_for_user(self, user_id, group_ids, hints):"},{"line_number":173,"context_line":"        # TODO(henry-nash): Now that we have a single assignment table, we"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_917d80b4","line":170,"updated":"2014-11-19 12:38:20.000000000","message":"Same as above.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                session, role_id, user_id, group_id, domain_id, project_id,"},{"line_number":168,"context_line":"                inherited_to_projects)"},{"line_number":169,"context_line":"            if not q.delete(False):"},{"line_number":170,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def list_project_ids_for_user(self, user_id, group_ids, hints):"},{"line_number":173,"context_line":"        # TODO(henry-nash): Now that we have a single assignment table, we"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_d1f91d81","line":170,"in_reply_to":"5a890539_917d80b4","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                session, role_id, user_id, group_id, domain_id, project_id,"},{"line_number":168,"context_line":"                inherited_to_projects)"},{"line_number":169,"context_line":"            if not q.delete(False):"},{"line_number":170,"context_line":"                raise exception.RoleAssignmentNotFound(role_id\u003drole_id)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def list_project_ids_for_user(self, user_id, group_ids, hints):"},{"line_number":173,"context_line":"        # TODO(henry-nash): Now that we have a single assignment table, we"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_5f9a1bc6","line":170,"in_reply_to":"5a890539_917d80b4","updated":"2014-11-30 12:40:02.000000000","message":"ditto.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"}],"keystone/exception.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_fd1e9c0c","line":251,"updated":"2014-11-19 12:38:20.000000000","message":"Suppose I provide a user_id and no role assignments are found for him, what message will I get? Something like:\n\"Could not find role assignment with role: \"\n\nIn other words, in the cases the user provides the role_id, this message containing only the role-id is enough.\nOn all the other cases, it won\u0027t be accurate enough.\n\nI suggest you to add more information in this message.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_31ed19b8","line":251,"in_reply_to":"5a890539_fd1e9c0c","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_ba84ed0b","line":251,"in_reply_to":"5a890539_fd1e9c0c","updated":"2014-11-30 12:40:02.000000000","message":"Samuel, we need more discussion on this, pls see my reply in the sql.py.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"11a4fb1f98e9ecf186d6ff53855db37eae06cff5","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_3a71dd0c","line":251,"updated":"2014-11-30 13:09:29.000000000","message":"Regarding Samuel\u0027s comments in the patchset 6, will leave my reply here so we can continue with the discussion.\n\nBy definition a role assignment is a way to associate a role, an actor and a target. That\u0027s why is not accurate for the message to include just the role_id.\n\nIt\u0027s possible to have a role assignment with such role_id, but not for the target or actor you are checking against.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5c9e82c725d3825fd839ddaf43ba73c4cd7c8aaf","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_31dae317","line":251,"in_reply_to":"5a890539_2ebd1e03","updated":"2014-11-30 16:43:48.000000000","message":"actor/target assignment isn\u0027t special case, since role_assignment is a role given to an actor in a target.\n\nAll meaningful fields are role, actor (user or group) and target (project or domain). You can pass these 3 fields.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8d058b4c1059ad3ec93b9c594da9733b858daf96","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_51060d87","line":251,"in_reply_to":"5a890539_3a71dd0c","updated":"2015-02-05 08:39:08.000000000","message":"Done","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"624bd9acd1a5b8c7285d86ec6b980033cb112933","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_ce701aa7","line":251,"in_reply_to":"5a890539_3a71dd0c","updated":"2014-11-30 14:21:37.000000000","message":"Rodrigo, I agree with you, that\u0027s should be the case. \n\nBut another case is we can query role assignment based on only role_id, right? (method definition of check_grant_role_id has show us)\n\nso, if we do that, we may get the follow message which also looks pretty trivial.\n\nCould not find role assignment with role: ***, user: None, group: None, project: None, domain: None","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"0f18eb6c84b6fa6b9a109973c52b76b55d95b783","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_2ebd1e03","line":251,"in_reply_to":"5a890539_ce701aa7","updated":"2014-11-30 14:38:56.000000000","message":"If we agree that role id with specific actor or target\u0027s assignment is one special case of the assigment with that role id, then role assignment exception message is enough with the role id.\n\nAnother way is append all of the meaningful fields and then pass to here. I believe this will a good approach to do that, agree?","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cb5362ad97d5aef8e6f89cc2027db05c361c1c18","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"class RoleAssignmentNotFound(NotFound):"},{"line_number":251,"context_line":"    message_format \u003d _(\"Could not find role assignment with role: %(role_id)s\")"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"class RegionNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_cecc9abe","line":251,"in_reply_to":"5a890539_ce701aa7","updated":"2014-11-30 14:31:40.000000000","message":"You should use only role, actor and target, instead of all possibilities from each.\n\nTo check a grant, you need the 3 fields. To list role_assignments, you would query using just the role_id, but it\u0027s a different case, because you would return an empty list instead of raising an exception.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":860,"context_line":"                          self.assignment_api.check_grant_role_id,"},{"line_number":861,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":862,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":863,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":864,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_b4734ab3","line":861,"updated":"2014-11-19 12:38:20.000000000","message":"We just need the code on lines 859-863.\nWe don\u0027t need to clean up things, they come from the loaded default fixtures.\n\nJust delete the code above and pass user_id\u003duuid.uuid4() in this call. :-)","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":860,"context_line":"                          self.assignment_api.check_grant_role_id,"},{"line_number":861,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":862,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":863,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":864,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_512d2dfd","line":861,"in_reply_to":"5a890539_b4734ab3","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f8c1fce0cdfb9e72d73c381fc2dc1adc9174e61b","unresolved":false,"context_lines":[{"line_number":858,"context_line":""},{"line_number":859,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":860,"context_line":"                          self.assignment_api.check_grant_role_id,"},{"line_number":861,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":862,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":863,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":864,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_9aaf317d","line":861,"in_reply_to":"5a890539_b4734ab3","updated":"2014-11-30 12:40:02.000000000","message":"Samuel, I am not sure about clean up stuff, agree with you to remove them in the next patch.\n\nThis testcase intends to test the case when the role is existed while role assignment is not, user_id seems is not important here.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"427da738462ac0bc1bbb1cc894fb657a5ed6d8a2","unresolved":false,"context_lines":[{"line_number":875,"context_line":""},{"line_number":876,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":877,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":878,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":879,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":880,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":881,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a890539_5464e6e4","line":878,"updated":"2014-11-19 12:38:20.000000000","message":"Same comment as above.","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"191dad731b58a74be20e55350227f89634e7e2b9","unresolved":false,"context_lines":[{"line_number":875,"context_line":""},{"line_number":876,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":877,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":878,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":879,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":880,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":881,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_71323160","line":878,"in_reply_to":"5a890539_5464e6e4","updated":"2015-02-05 08:39:24.000000000","message":"Done","commit_id":"700cb5f5b3e165641ae3b4abcabdff7cdfefaca0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c8205510e3fdb272d0c9d47ae1b3fba595fa0658","unresolved":false,"context_lines":[{"line_number":858,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":859,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":860,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":861,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def test_get_and_remove_role_grant_by_group_and_project(self):"},{"line_number":864,"context_line":"        new_domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_60016f69","line":861,"updated":"2015-02-05 13:46:24.000000000","message":"worth doing at least one test with a domain...and another with a group?","commit_id":"b5fff45ac78ac4c74e0057e532c5e42043a3ff2e"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e69149ddad5ee7595f54d069432ac72c14a9b42c","unresolved":false,"context_lines":[{"line_number":858,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":859,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":860,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":861,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def test_get_and_remove_role_grant_by_group_and_project(self):"},{"line_number":864,"context_line":"        new_domain \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_ab45bf18","line":861,"in_reply_to":"da86d52c_60016f69","updated":"2015-02-07 11:23:27.000000000","message":"Done","commit_id":"b5fff45ac78ac4c74e0057e532c5e42043a3ff2e"}],"keystone/tests/test_backend_ldap.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6e60ed16a0fcf72d4fd5aa0e73bbb5b1c9fd27fb","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":186,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_get_role_assignment_not_found(self):"},{"line_number":189,"context_line":"        # First, clean up the test environment in case grant has been"},{"line_number":190,"context_line":"        # created by other test cases but not properly cleaned up."},{"line_number":191,"context_line":"        roles_ref \u003d self.assignment_api.list_grants("}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_3350790a","line":188,"updated":"2014-11-18 14:17:07.000000000","message":"Is there a reason these tests are duplicated here (is there a difference between these and the ones in test_backend.py)?  If not, then they\u0027ll get run against the ldap backend automatically.","commit_id":"0e64449855b6a92ec04810fed84e023e5b8dd316"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a010587da6a8467695a098266bf0464812d267ce","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"},{"line_number":186,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_get_role_assignment_not_found(self):"},{"line_number":189,"context_line":"        # First, clean up the test environment in case grant has been"},{"line_number":190,"context_line":"        # created by other test cases but not properly cleaned up."},{"line_number":191,"context_line":"        roles_ref \u003d self.assignment_api.list_grants("}],"source_content_type":"text/x-python","patch_set":4,"id":"5a890539_44b52230","line":188,"in_reply_to":"5a890539_3350790a","updated":"2014-11-19 02:44:15.000000000","message":"Done","commit_id":"0e64449855b6a92ec04810fed84e023e5b8dd316"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c8205510e3fdb272d0c9d47ae1b3fba595fa0658","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":198,"context_line":"        self.assertRaises(exception.RoleNotFound,"},{"line_number":199,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":200,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":201,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_a0c8c755","line":198,"updated":"2015-02-05 13:46:24.000000000","message":"I\u0027m unclear what this should be RoleNotFound...and in fact why we need to override this test at all...","commit_id":"b5fff45ac78ac4c74e0057e532c5e42043a3ff2e"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e69149ddad5ee7595f54d069432ac72c14a9b42c","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                          role_id\u003d\u0027member\u0027)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":198,"context_line":"        self.assertRaises(exception.RoleNotFound,"},{"line_number":199,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":200,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":201,"context_line":"                          project_id\u003dself.tenant_baz[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"da86d52c_4b3603b6","line":198,"in_reply_to":"da86d52c_a0c8c755","updated":"2015-02-07 11:23:27.000000000","message":"Done","commit_id":"b5fff45ac78ac4c74e0057e532c5e42043a3ff2e"}],"keystone/tests/test_backend_sql.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"11a4fb1f98e9ecf186d6ff53855db37eae06cff5","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_9a82d1c6","line":415,"updated":"2014-11-30 13:09:29.000000000","message":"think this test should be placed in the test_backend,py file and in the test_backend_ldap.py, you would test for its expected behaviour.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5c9e82c725d3825fd839ddaf43ba73c4cd7c8aaf","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_51eccfbb","line":415,"in_reply_to":"5a890539_4efd0ab1","updated":"2014-11-30 16:43:48.000000000","message":"I don\u0027t see the SQL driver as the special case here, but the LDAP one.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"4c230ba6324841b0a7551176ad19e7cdaf275584","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_c804811a","line":415,"in_reply_to":"5a890539_51eccfbb","updated":"2014-12-01 14:14:25.000000000","message":"Rodrigo, I cannot catch your idea, let me repeat why I put the testcase here instead of test_backend.py.\n\nFirst, if I put the test case in test_backend.py which will mean the testcase will be executed both in test_backend_sql.py and test_backend_ldap.py.\n\nBut I think the test case is not applicable in test_backend_ldap.py since the changed delete_grant method in henry\u0027s patch intends to remove user_dn from role_dn and the exception thrown there imo is correct (role not found), so this is why I remove the the change in ldap backend as well.\n\nThis is why the testcase is here specific to sql backend. Is that clear?\n\npls let me know if there is any other comments.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"609abd4ad4b5cd9c5a1fe454887dbac44133f5d7","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_4efd0ab1","line":415,"in_reply_to":"5a890539_8e39b2a5","updated":"2014-11-30 14:48:03.000000000","message":"Only SQL driver\u0027s invocation is suitable for thrown such an exception, you can check it in henry\u0027s patch, ldap driver\u0027s invocation is not expected such an exception.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cb5362ad97d5aef8e6f89cc2027db05c361c1c18","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_8e39b2a5","line":415,"in_reply_to":"5a890539_9a3ad1e5","updated":"2014-11-30 14:31:40.000000000","message":"that is not the case, delete a grant is a call from the assignment driver layer, not from the SQL driver. So it\u0027s not specific to the SQL backend.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8d058b4c1059ad3ec93b9c594da9733b858daf96","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_51dfed0c","line":415,"in_reply_to":"5a890539_9a82d1c6","updated":"2015-02-05 08:39:08.000000000","message":"Done","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"624bd9acd1a5b8c7285d86ec6b980033cb112933","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_9a3ad1e5","line":415,"in_reply_to":"5a890539_9a82d1c6","updated":"2014-11-30 14:21:37.000000000","message":"Rodrigo, would you pls see the comment in patchset4 by henry? we needn\u0027t place the testcase both in test_backend.py and test_backend_**.py.\n\nAnd why I put this testcase here instead of test_backend.py is it\u0027s SQL backend specific in henry\u0027s latest patchset.\nhttps://review.openstack.org/#/c/130954/27","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b99a1b15090ce6c6ee22d2d8cdfc7674fa66014f","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        # roles assignments."},{"line_number":413,"context_line":"        self.assertThat(user_domains, matchers.HasLength(0))"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    def test_del_role_assignment_not_found(self):"},{"line_number":416,"context_line":"        self.assertRaises(exception.RoleAssignmentNotFound,"},{"line_number":417,"context_line":"                          self.assignment_api.delete_grant,"},{"line_number":418,"context_line":"                          user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a890539_1f8a4064","line":415,"in_reply_to":"5a890539_c804811a","updated":"2014-12-01 14:35:49.000000000","message":"Ok, let\u0027s start again.\n\nThe backend tests should mirror the operations made in the Manager/Driver level, right? The \"delete_grant()\" method is placed in the Manager: https://github.com/openstack/keystone/blob/master/keystone/assignment/core.py#L556\n\nThis means, that we must have all possible testcases placed in \"test_backend.py\", which includes the case where the role_assignment was not found, IMHO.\n\nSince the LDAP backend does not raise the exception, this role_assignment not found test in \"test_backend.py\" should be overwritten in \"test_backend_ldap.py\" to check its particular behaviour.","commit_id":"82446cf94d97e6bf4bed51dca32698ee034953d5"}]}
