)]}'
{"keystone/common/ldap/core.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"99f897eff097191b5565d5c741a9a813543f05ee","unresolved":false,"context_lines":[{"line_number":393,"context_line":"            except ldap.NO_SUCH_OBJECT:"},{"line_number":394,"context_line":"                raise self._not_found(id)"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        return self.get(id)"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"    def delete(self, id):"},{"line_number":399,"context_line":"        if not self.allow_delete:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fjis%3D","line":396,"updated":"2013-05-04 03:06:53.000000000","message":"Assume the additional returns are needed for the validate default domain method?","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"309ea25d0c9fe21d241b4f75bbe165eb2f3dfa58","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \u0027id\u0027: CONF.identity.default_domain_id,"},{"line_number":35,"context_line":"    \u0027name\u0027: \u0027Default\u0027,"},{"line_number":36,"context_line":"    \u0027enabled\u0027: True,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Identity(identity.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fjs4%3D","line":37,"updated":"2013-05-03 22:55:14.000000000","message":"Remove the comma at the end after True.","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bafe62422bc3164db59ac8c24c2e8b628a8bbc72","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    \u0027id\u0027: CONF.identity.default_domain_id,"},{"line_number":35,"context_line":"    \u0027name\u0027: \u0027Default\u0027,"},{"line_number":36,"context_line":"    \u0027enabled\u0027: True,"},{"line_number":37,"context_line":"}"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Identity(identity.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FgcI%3D","line":37,"in_reply_to":"AAAAOn%2F%2Fjs4%3D","updated":"2013-05-07 14:52:17.000000000","message":"Done","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"309ea25d0c9fe21d241b4f75bbe165eb2f3dfa58","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":139,"context_line":"        # TODO(henry-nash): Use domain_id once domains are implemented"},{"line_number":140,"context_line":"        # in LDAP backend"},{"line_number":141,"context_line":"        return self._set_default_domain(self.project.get_by_name(tenant_name))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _get_user(self, user_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fjso%3D","line":140,"updated":"2013-05-03 22:55:14.000000000","message":"I think Henry\u0027s comment is no longer needed.","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bafe62422bc3164db59ac8c24c2e8b628a8bbc72","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":139,"context_line":"        # TODO(henry-nash): Use domain_id once domains are implemented"},{"line_number":140,"context_line":"        # in LDAP backend"},{"line_number":141,"context_line":"        return self._set_default_domain(self.project.get_by_name(tenant_name))"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def _get_user(self, user_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FgaA%3D","line":140,"in_reply_to":"AAAAOn%2F%2Fjso%3D","updated":"2013-05-07 14:52:17.000000000","message":"hmm, nice catch... the provided domain_id here should be validated to be the default, otherwise a 404 should be raised. will fix that and remove all these comments","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"309ea25d0c9fe21d241b4f75bbe165eb2f3dfa58","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":315,"context_line":"        if domain_id \u003d\u003d CONF.identity.default_domain_id:"},{"line_number":316,"context_line":"            msg \u003d \u0027Duplicate ID, %s.\u0027 % domain_id"},{"line_number":317,"context_line":"            raise exception.Conflict(type\u003d\u0027domain\u0027, details\u003dmsg)"},{"line_number":318,"context_line":"        raise exception.Forbidden(\u0027Domains are read-only against LDAP\u0027)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def get_domain(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FjrY%3D","line":317,"updated":"2013-05-03 22:55:14.000000000","message":"I think it may be better just to go with \u0027Domains are read-only against LDAP\u0027 exception like update_domain or delete_domain. since in the ldap server a domain with domain_id is not really created, so \u0027duplicate\u0027 message is confusing.","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bafe62422bc3164db59ac8c24c2e8b628a8bbc72","unresolved":false,"context_lines":[{"line_number":314,"context_line":"    def create_domain(self, domain_id, domain):"},{"line_number":315,"context_line":"        if domain_id \u003d\u003d CONF.identity.default_domain_id:"},{"line_number":316,"context_line":"            msg \u003d \u0027Duplicate ID, %s.\u0027 % domain_id"},{"line_number":317,"context_line":"            raise exception.Conflict(type\u003d\u0027domain\u0027, details\u003dmsg)"},{"line_number":318,"context_line":"        raise exception.Forbidden(\u0027Domains are read-only against LDAP\u0027)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def get_domain(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FgZM%3D","line":317,"in_reply_to":"AAAAOn%2F%2FjrY%3D","updated":"2013-05-07 14:52:17.000000000","message":"revised all these calls to raise 404 if the default_domain_id isn\u0027t provided, and then forbidden if it is, which follows the pattern of other drivers. in this case, 409 Conflict is appropriate because the api user is attempting to create the default domain again, which already exists (again, other drivers do this)","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a6528e846e33e6aa58863ac0b1445dc2b19dbb10","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        ref \u003d ref.copy()"},{"line_number":73,"context_line":"        domain_id \u003d ref.pop(\u0027domain_id\u0027, CONF.identity.default_domain_id)"},{"line_number":74,"context_line":"        if domain_id !\u003d CONF.identity.default_domain_id:"},{"line_number":75,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_id)"},{"line_number":76,"context_line":"        self._validate_domain_id(domain_id)"},{"line_number":77,"context_line":"        return ref"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Ffho%3D","line":75,"updated":"2013-05-07 23:36:26.000000000","message":"remove 74 and 75 because 76 does the same thing.","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a6528e846e33e6aa58863ac0b1445dc2b19dbb10","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        Also removes the domain from the ref so that LDAP doesn\u0027t have to"},{"line_number":83,"context_line":"        persist the attribute."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        if domain_id !\u003d CONF.identity.default_domain_id:"},{"line_number":87,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_id)"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Ffhk%3D","line":85,"updated":"2013-05-07 23:36:26.000000000","message":"this isn\u0027t the correct docstring, it\u0027s a copy of _validate_domain\u0027s.","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a6528e846e33e6aa58863ac0b1445dc2b19dbb10","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        return self._set_default_domain(self.project.get_by_name(tenant_name))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _get_user(self, user_id):"},{"line_number":154,"context_line":"        return self.user.get(user_id)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def get_user(self, user_id):"},{"line_number":157,"context_line":"        ref \u003d identity.filter_user(self._get_user(user_id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FfgA%3D","line":154,"updated":"2013-05-07 23:36:26.000000000","message":"suggest change _get_user to set the default domain then don\u0027t have to change other places.","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1fded50a2a3e7b6e558dcf546c4922ba7913271","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        return self._set_default_domain(self.project.get_by_name(tenant_name))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _get_user(self, user_id):"},{"line_number":154,"context_line":"        return self.user.get(user_id)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def get_user(self, user_id):"},{"line_number":157,"context_line":"        ref \u003d identity.filter_user(self._get_user(user_id))"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fej8%3D","line":154,"in_reply_to":"AAAAOn%2F%2FfgA%3D","updated":"2013-05-08 14:29:23.000000000","message":"forgot to reply to this- I *don\u0027t* think it should be done in _get_user because (from the driver\u0027s perspective) _set_default_domain is a superficial change being made for the layer above the driver, and _get_user() is intended to be an internal method. Anyway, doing it in _get_user() feels wrong to me as a result","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a6528e846e33e6aa58863ac0b1445dc2b19dbb10","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_projects_for_user(self, user_id):"},{"line_number":187,"context_line":"        self.get_user(user_id)"},{"line_number":188,"context_line":"        return [p[\u0027id\u0027] for p in self.project.get_user_projects(user_id)]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def get_project_users(self, tenant_id):"},{"line_number":191,"context_line":"        self.get_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fffc%3D","line":188,"updated":"2013-05-07 23:36:26.000000000","message":"need to set default domain here?","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b1fded50a2a3e7b6e558dcf546c4922ba7913271","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def get_projects_for_user(self, user_id):"},{"line_number":187,"context_line":"        self.get_user(user_id)"},{"line_number":188,"context_line":"        return [p[\u0027id\u0027] for p in self.project.get_user_projects(user_id)]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def get_project_users(self, tenant_id):"},{"line_number":191,"context_line":"        self.get_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fej4%3D","line":188,"in_reply_to":"AAAAOn%2F%2Fffc%3D","updated":"2013-05-08 14:29:23.000000000","message":"no, because this method is only returning a list of project ID\u0027s, not refs","commit_id":"69f3b306ae5c36740a02173ba8ae4f60db9db831"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0bff54d4f5f8a04c5cc0ababe5a629f6f24d1194","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        user_ref \u003d self._set_default_domain(identity.filter_user(user_ref))"},{"line_number":136,"context_line":"        if tenant_ref is not None:"},{"line_number":137,"context_line":"            tenant_ref \u003d self._set_default_domain(tenant_ref)"},{"line_number":138,"context_line":"        return (user_ref, tenant_ref, metadata_ref)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Feb0%3D","line":137,"updated":"2013-05-08 15:31:20.000000000","message":"get_project at line 125 would have set the default domain already (line 141), so remove 136 and 137.","commit_id":"fd7354d615d7bdc591fd61a06c682ee97fdd99ec"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"219d0eebd051b54fa385f2bc049c5eff24ac4157","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        user_ref \u003d self._set_default_domain(identity.filter_user(user_ref))"},{"line_number":136,"context_line":"        if tenant_ref is not None:"},{"line_number":137,"context_line":"            tenant_ref \u003d self._set_default_domain(tenant_ref)"},{"line_number":138,"context_line":"        return (user_ref, tenant_ref, metadata_ref)"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def get_project(self, tenant_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FeTc%3D","line":137,"in_reply_to":"AAAAOn%2F%2Feb0%3D","updated":"2013-05-08 16:19:01.000000000","message":"godo catch, i was thinking there was an alternative code path here to get a tenant_ref, but that doesn\u0027t seem to be true!","commit_id":"fd7354d615d7bdc591fd61a06c682ee97fdd99ec"}],"tests/test_backend_ldap.py":[{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"309ea25d0c9fe21d241b4f75bbe165eb2f3dfa58","unresolved":false,"context_lines":[{"line_number":553,"context_line":"        domains \u003d self.identity_api.list_domains()"},{"line_number":554,"context_line":"        self.assertEquals("},{"line_number":555,"context_line":"            domains,"},{"line_number":556,"context_line":"            [{\u0027id\u0027: \u0027default\u0027, \u0027name\u0027: \u0027Default\u0027, \u0027enabled\u0027: True}])"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"class LDAPIdentityEnabledEmulation(LDAPIdentity):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2Fjq4%3D","line":556,"updated":"2013-05-03 22:55:14.000000000","message":"CONF.identity.default_domain_id instead of \u0027default\u0027.","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"bafe62422bc3164db59ac8c24c2e8b628a8bbc72","unresolved":false,"context_lines":[{"line_number":553,"context_line":"        domains \u003d self.identity_api.list_domains()"},{"line_number":554,"context_line":"        self.assertEquals("},{"line_number":555,"context_line":"            domains,"},{"line_number":556,"context_line":"            [{\u0027id\u0027: \u0027default\u0027, \u0027name\u0027: \u0027Default\u0027, \u0027enabled\u0027: True}])"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"class LDAPIdentityEnabledEmulation(LDAPIdentity):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2FgYc%3D","line":556,"in_reply_to":"AAAAOn%2F%2Fjq4%3D","updated":"2013-05-07 14:52:17.000000000","message":"thanks, fixed","commit_id":"86d1b2f5143322e5e786068ad734779b7c3fc238"}]}
