)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28743,"name":"huang liujie","email":"huang.liujie@99cloud.net","username":"ljhuang"},"change_message_id":"c8cc82aaca85389ebf9125bb9632e9c620a87c4d","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2019-08-12 13:11:30 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Update UserRoleAssignment and GroupRoleAssignment to support domain_id"},{"line_number":8,"context_line":"Update Keystone client to support user@domain in user property"},{"line_number":9,"context_line":"Fixed pep issue"},{"line_number":10,"context_line":"Removed new properties user_domain and group_domain"},{"line_number":11,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"7faddb67_bc3572dd","line":8,"range":{"start_line":8,"start_character":0,"end_line":8,"end_character":62},"updated":"2019-08-13 14:47:56.000000000","message":"one empty blank should be added\n\nPlease follow proper formatting for commit messages\nTitle of commit \u003c less then 50 characters \u003cCR\u003e \nDescription of commit (wrapped at 71 characters) may be mulltiline\nCloses-Bug: #X or TrivialFix or Implements:","commit_id":"735d0f2c438cdc418d8b5b50dd0fb06ede84b17f"}],"heat/engine/clients/os/keystone/__init__.py":[{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"b338637af6da8702fc0dc1631ce1563dc5f67b89","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            role_obj \u003d self.client().client.roles.get(role)"},{"line_number":43,"context_line":"            return role_obj.id"},{"line_number":44,"context_line":"        except ks_exceptions.NotFound:"},{"line_number":45,"context_line":"            role_list \u003d self.client().client.roles.list(name\u003drole,"},{"line_number":46,"context_line":"                                                        domain\u003ddomain)"},{"line_number":47,"context_line":"            for role_obj in role_list:"},{"line_number":48,"context_line":"                if role_obj.name \u003d\u003d role:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_b6e81bb3","line":45,"range":{"start_line":45,"start_character":12,"end_line":45,"end_character":21},"updated":"2019-08-14 13:46:55.000000000","message":"and what about role@domain here?:)","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            role_obj \u003d self.client().client.roles.get(role)"},{"line_number":43,"context_line":"            return role_obj.id"},{"line_number":44,"context_line":"        except ks_exceptions.NotFound:"},{"line_number":45,"context_line":"            role_list \u003d self.client().client.roles.list(name\u003drole,"},{"line_number":46,"context_line":"                                                        domain\u003ddomain)"},{"line_number":47,"context_line":"            for role_obj in role_list:"},{"line_number":48,"context_line":"                if role_obj.name \u003d\u003d role:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_a70d323f","line":45,"range":{"start_line":45,"start_character":12,"end_line":45,"end_character":21},"in_reply_to":"7faddb67_b6e81bb3","updated":"2019-08-15 13:44:00.000000000","message":"I\u0027ll apply the logic applied in get_user_id function here.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"b338637af6da8702fc0dc1631ce1563dc5f67b89","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_project_id(self, project, domain\u003dNone):"},{"line_number":54,"context_line":"        if project is None:"},{"line_number":55,"context_line":"            return None"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            project_obj \u003d self.client().client.projects.get(project)"},{"line_number":58,"context_line":"            return project_obj.id"},{"line_number":59,"context_line":"        except ks_exceptions.NotFound:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_96e5dfde","line":56,"range":{"start_line":56,"start_character":11,"end_line":56,"end_character":12},"updated":"2019-08-14 13:46:55.000000000","message":"what about project@domain here?:)","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    def get_project_id(self, project, domain\u003dNone):"},{"line_number":54,"context_line":"        if project is None:"},{"line_number":55,"context_line":"            return None"},{"line_number":56,"context_line":"        try:"},{"line_number":57,"context_line":"            project_obj \u003d self.client().client.projects.get(project)"},{"line_number":58,"context_line":"            return project_obj.id"},{"line_number":59,"context_line":"        except ks_exceptions.NotFound:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_6703ba11","line":56,"range":{"start_line":56,"start_character":11,"end_line":56,"end_character":12},"in_reply_to":"7faddb67_96e5dfde","updated":"2019-08-15 13:44:00.000000000","message":"I\u0027ll apply the logic applied in get_user_id function here.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2b272ff7ded987f5fbafa075cf27b999ac30312","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        raise exception.EntityNotFound(entity\u003d\u0027KeystoneDomain\u0027, name\u003ddomain)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_group_id(self, group, domain\u003dNone):"},{"line_number":84,"context_line":"        if group is None:"},{"line_number":85,"context_line":"            return None"},{"line_number":86,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_56ce8783","line":83,"updated":"2019-08-14 13:40:48.000000000","message":"I\u0027m not clear on what the advantage of also being able to pass a domain here is?","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        raise exception.EntityNotFound(entity\u003d\u0027KeystoneDomain\u0027, name\u003ddomain)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_group_id(self, group, domain\u003dNone):"},{"line_number":84,"context_line":"        if group is None:"},{"line_number":85,"context_line":"            return None"},{"line_number":86,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_a75f723f","line":83,"in_reply_to":"7faddb67_56ce8783","updated":"2019-08-15 13:44:00.000000000","message":"All get_*_id functions are not useful if UUIDs are not used. We assume heat templates use UUIDs (via get_resource) to get UUIDs of users/groups etc, but if UUIDs are not available For Eg: LDAP based users these functions are not useful. \nI recommend we make all these get_*_id functions support domain. This is discussed in the US: https://storyboard.openstack.org/#!/story/2005523.\n\nThe current implementation would support passing domain in two ways:\n1) Pass the domain ID as a parameter to the function (This can be used anywhere in any heat resource)\n2) Pass the domain along with group: group@domain (This is used by property constraints)","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2b272ff7ded987f5fbafa075cf27b999ac30312","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                group_with_domain \u003d group"},{"line_number":89,"context_line":"                group, domain \u003d group_with_domain.split(\u0027@\u0027)"},{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_56c44792","line":91,"updated":"2019-08-14 13:40:48.000000000","message":"IIUC correctly we\u0027re trying to catch two different errors here:\n\n* fail to assign the result of the split() to a 2-tuple because there\u0027s more than one \u0027@\u0027\n* fail to look up the domain\n\nThey share the same error message (though print out different values for the group). It\u0027s better to be more explicit about which exceptions you\u0027re catching.\n\nIn this case I think we should just eliminate the first failure by doing something like:\n\n  group, domain \u003d group.split(\u0027@\u0027, 1)","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2b272ff7ded987f5fbafa075cf27b999ac30312","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                group, domain \u003d group_with_domain.split(\u0027@\u0027)"},{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            group_obj \u003d self.client().client.groups.get(group)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_161a4f16","line":92,"updated":"2019-08-14 13:40:48.000000000","message":"I don\u0027t think replacing the EntityNotFound exception with an Invalid exception is the right thing to do here.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                group, domain \u003d group_with_domain.split(\u0027@\u0027)"},{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            group_obj \u003d self.client().client.groups.get(group)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_c7214eb6","line":92,"in_reply_to":"7faddb67_161a4f16","updated":"2019-08-15 13:44:00.000000000","message":"I\u0027ll move this logic to a separate function and throw EntityNotFound exception.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2b272ff7ded987f5fbafa075cf27b999ac30312","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            group_obj \u003d self.client().client.groups.get(group)"},{"line_number":96,"context_line":"            return group_obj.id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_f6d45321","line":93,"updated":"2019-08-14 13:40:48.000000000","message":"In the domain lookup failure case this doesn\u0027t include the name of the domain that we failed to look up.\n\nAlso, extra parentheses are superfluous.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"b338637af6da8702fc0dc1631ce1563dc5f67b89","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def get_group_id(self, group, domain\u003dNone):"},{"line_number":84,"context_line":"        if group is None:"},{"line_number":85,"context_line":"            return None"},{"line_number":86,"context_line":"        try:"},{"line_number":87,"context_line":"            if \u0027@\u0027 in group and not domain:"},{"line_number":88,"context_line":"                group_with_domain \u003d group"},{"line_number":89,"context_line":"                group, domain \u003d group_with_domain.split(\u0027@\u0027)"},{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            group_obj \u003d self.client().client.groups.get(group)"},{"line_number":96,"context_line":"            return group_obj.id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_b6ac9b9f","line":93,"range":{"start_line":86,"start_character":0,"end_line":93,"end_character":44},"updated":"2019-08-14 13:46:55.000000000","message":"just make a new function reference in here and at line 126 will be easier IMO:)","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def get_group_id(self, group, domain\u003dNone):"},{"line_number":84,"context_line":"        if group is None:"},{"line_number":85,"context_line":"            return None"},{"line_number":86,"context_line":"        try:"},{"line_number":87,"context_line":"            if \u0027@\u0027 in group and not domain:"},{"line_number":88,"context_line":"                group_with_domain \u003d group"},{"line_number":89,"context_line":"                group, domain \u003d group_with_domain.split(\u0027@\u0027)"},{"line_number":90,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":91,"context_line":"        except Exception:"},{"line_number":92,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid group provided: %s\" %"},{"line_number":93,"context_line":"                                    (group))"},{"line_number":94,"context_line":"        try:"},{"line_number":95,"context_line":"            group_obj \u003d self.client().client.groups.get(group)"},{"line_number":96,"context_line":"            return group_obj.id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_672ada91","line":93,"range":{"start_line":86,"start_character":0,"end_line":93,"end_character":44},"in_reply_to":"7faddb67_b6ac9b9f","updated":"2019-08-15 13:44:00.000000000","message":"I\u0027ll move this logic to a separate function and throw EntityNotFound exception.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"e2b272ff7ded987f5fbafa075cf27b999ac30312","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":131,"context_line":"        except Exception:"},{"line_number":132,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid user provided: %s\" %"},{"line_number":133,"context_line":"                                    (user))"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            user_obj \u003d self.client().client.users.get(user)"},{"line_number":136,"context_line":"            return user_obj.id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_16efafe9","line":133,"updated":"2019-08-14 13:40:48.000000000","message":"This is begging to be refactored out into a common method.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"a49f9d047b4212e50a36596285d1675bbba33101","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":131,"context_line":"        except Exception:"},{"line_number":132,"context_line":"            raise exception.Invalid(reason\u003d\"Invalid user provided: %s\" %"},{"line_number":133,"context_line":"                                    (user))"},{"line_number":134,"context_line":"        try:"},{"line_number":135,"context_line":"            user_obj \u003d self.client().client.users.get(user)"},{"line_number":136,"context_line":"            return user_obj.id"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_8727d6c7","line":133,"in_reply_to":"7faddb67_16efafe9","updated":"2019-08-15 13:44:00.000000000","message":"I\u0027ll move this logic to a separate function and throw EntityNotFound exception.","commit_id":"c81cada494a0464680238575d095996e8b1ee7d8"},{"author":{"_account_id":27427,"name":"David Peacock","email":"dpeacock@redhat.com","username":"davidjpeacock"},"change_message_id":"7b4260a9220e4ff9df9220f1f2c2b9990307df23","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def is_conflict(self, ex):"},{"line_number":38,"context_line":"        return isinstance(ex, ks_exceptions.Conflict)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def prase_entity_with_domain(self, entity_with_domain):"},{"line_number":41,"context_line":"        if \u0027@\u0027 in entity_with_domain:"},{"line_number":42,"context_line":"            entity, domain \u003d entity_with_domain.split(\u0027@\u0027, 1)"},{"line_number":43,"context_line":"            domain \u003d self.get_domain_id(domain)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5faad753_204d0572","line":40,"updated":"2019-09-09 18:02:19.000000000","message":"what does \"prase\" mean?\n\nIs that a typo?  Or some acronym?","commit_id":"d80591ad4906df9413509629c0f71f73c173f66c"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"d772e213073958a257a408a28253486984fac62b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def is_conflict(self, ex):"},{"line_number":38,"context_line":"        return isinstance(ex, ks_exceptions.Conflict)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def prase_entity_with_domain(self, entity_with_domain):"},{"line_number":41,"context_line":"        if \u0027@\u0027 in entity_with_domain:"},{"line_number":42,"context_line":"            entity, domain \u003d entity_with_domain.split(\u0027@\u0027, 1)"},{"line_number":43,"context_line":"            domain \u003d self.get_domain_id(domain)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5faad753_8332c3f0","line":40,"in_reply_to":"5faad753_204d0572","updated":"2019-09-09 18:59:59.000000000","message":"I should be parse. I update the function name.","commit_id":"d80591ad4906df9413509629c0f71f73c173f66c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"7a781a32ec3a998e578387b4e4c2f8133b905b70","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            domain \u003d self.get_domain_id(domain)"},{"line_number":44,"context_line":"            return (entity, domain)"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            return (entity, None)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def get_role_id(self, role, domain\u003dNone):"},{"line_number":49,"context_line":"        if role is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5faad753_84bb770c","line":46,"range":{"start_line":46,"start_character":20,"end_line":46,"end_character":26},"updated":"2019-09-11 16:26:22.000000000","message":"variable used before assignment","commit_id":"5f742a6ac6c18ab8cd7119cc6a828753998f1984"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"7a781a32ec3a998e578387b4e4c2f8133b905b70","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            return None"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            if \u0027@\u0027 in role and not domain:"},{"line_number":54,"context_line":"                role, domain \u003d self.parse_entity_with_domain(role)"},{"line_number":55,"context_line":"        except Exception:"},{"line_number":56,"context_line":"            raise exception.EntityNotFound(entity\u003d\u0027KeystoneRole\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5faad753_a4dd5371","line":53,"updated":"2019-09-11 16:26:22.000000000","message":"This could just be\n\n  if domain is None:\n\ncouldn\u0027t it? We\u0027re checking for the @ in parse_entity_with_domain.","commit_id":"5f742a6ac6c18ab8cd7119cc6a828753998f1984"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"7a781a32ec3a998e578387b4e4c2f8133b905b70","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            if \u0027@\u0027 in role and not domain:"},{"line_number":54,"context_line":"                role, domain \u003d self.parse_entity_with_domain(role)"},{"line_number":55,"context_line":"        except Exception:"},{"line_number":56,"context_line":"            raise exception.EntityNotFound(entity\u003d\u0027KeystoneRole\u0027,"},{"line_number":57,"context_line":"                                           name\u003drole)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5faad753_2485e35a","line":55,"updated":"2019-09-11 16:26:22.000000000","message":"The exception we\u0027re expecting to catch here is specifically exception.EntityNotFound. It would be better to be explicit about that.\n\nAlso, if you passed the entity type to parse_entity_with_domain() then you could do the exception translation in one place instead of having to repeat it.","commit_id":"5f742a6ac6c18ab8cd7119cc6a828753998f1984"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"05feabd58b87cdea3cf0c071d68f3d1e7521c186","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \"\"\"Parse keystone entity user/role/project with domain."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        entity_with_domain should be in entity{domain} format."},{"line_number":46,"context_line":"        First check if entity_with_domain contains a string in"},{"line_number":47,"context_line":"        entity{domain} format using regex. Then split"},{"line_number":48,"context_line":"        entity{domain} at first { and assign to entity. Then"},{"line_number":49,"context_line":"        split domain} at first } and assign to domain"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        Returns a tuple of (entity, domain)."},{"line_number":52,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_c95a7c81","line":49,"range":{"start_line":46,"start_character":0,"end_line":49,"end_character":53},"updated":"2019-09-27 17:33:59.000000000","message":"This is going into too much detail imho. We can read the code.","commit_id":"4135ee10c7e8f50f0950bdc0153a3afcb85dc6fb"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"69d4afad8eee9dbd5f0ef0b6d7f11a39c320ab99","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        \"\"\"Parse keystone entity user/role/project with domain."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        entity_with_domain should be in entity{domain} format."},{"line_number":46,"context_line":"        First check if entity_with_domain contains a string in"},{"line_number":47,"context_line":"        entity{domain} format using regex. Then split"},{"line_number":48,"context_line":"        entity{domain} at first { and assign to entity. Then"},{"line_number":49,"context_line":"        split domain} at first } and assign to domain"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        Returns a tuple of (entity, domain)."},{"line_number":52,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_3886d1dd","line":49,"range":{"start_line":46,"start_character":0,"end_line":49,"end_character":53},"in_reply_to":"3fa7e38b_c95a7c81","updated":"2019-10-01 16:10:57.000000000","message":"Done","commit_id":"4135ee10c7e8f50f0950bdc0153a3afcb85dc6fb"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"05feabd58b87cdea3cf0c071d68f3d1e7521c186","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            if re.search(r\"\\{(.*?)\\}$\", entity_with_domain):"},{"line_number":55,"context_line":"                entity, domain \u003d entity_with_domain.split(\u0027{\u0027, 1)"},{"line_number":56,"context_line":"                domain, _ignore \u003d domain.split(\u0027}\u0027, 1)"},{"line_number":57,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":58,"context_line":"                return (entity, domain)"},{"line_number":59,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_49752cf9","line":56,"updated":"2019-09-27 17:33:59.000000000","message":"There\u0027s a safer way to do this:\n\n    match \u003d re.search(r\"\\{(.*?)\\}$\", entity_with_domain)\n    if match:\n        entity \u003d entity_with_domain[:match.start()]\n        domain \u003d match.group(1)","commit_id":"4135ee10c7e8f50f0950bdc0153a3afcb85dc6fb"},{"author":{"_account_id":30515,"name":"Sampat Ponnaganti","email":"sp810x@att.com","username":"sp810x@att.com"},"change_message_id":"69d4afad8eee9dbd5f0ef0b6d7f11a39c320ab99","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        try:"},{"line_number":54,"context_line":"            if re.search(r\"\\{(.*?)\\}$\", entity_with_domain):"},{"line_number":55,"context_line":"                entity, domain \u003d entity_with_domain.split(\u0027{\u0027, 1)"},{"line_number":56,"context_line":"                domain, _ignore \u003d domain.split(\u0027}\u0027, 1)"},{"line_number":57,"context_line":"                domain \u003d self.get_domain_id(domain)"},{"line_number":58,"context_line":"                return (entity, domain)"},{"line_number":59,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_d86a1d1a","line":56,"in_reply_to":"3fa7e38b_49752cf9","updated":"2019-10-01 16:10:57.000000000","message":"Done","commit_id":"4135ee10c7e8f50f0950bdc0153a3afcb85dc6fb"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"eb05f18c862f9eba41b5641c62f15f0e274ee001","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        Returns a tuple of (entity, domain)."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            match \u003d re.search(r\"\\{(.*?)\\}$\", entity_with_domain)"},{"line_number":51,"context_line":"            if match:"},{"line_number":52,"context_line":"                entity \u003d entity_with_domain[:match.start()]"},{"line_number":53,"context_line":"                domain \u003d match.group(1)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_7f07ef1d","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":38},"updated":"2019-10-08 06:39:40.000000000","message":"I think this should be `.+` since we do not expect to match \u0027user{}\u0027 here and try to use an empty string to find domain id.\nTo only expect matches when there is actually something between {} might save some time (and potentially trouble)","commit_id":"169a35e0599a0582dce65c86b0e1a9920ce6bd66"},{"author":{"_account_id":12404,"name":"Rico Lin","email":"ricolin@ricolky.com","username":"rico.lin"},"change_message_id":"1835345c0637d45a779025a3f31479ecda374729","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        Returns a tuple of (entity, domain)."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            match \u003d re.search(r\"\\{(.*?)\\}$\", entity_with_domain)"},{"line_number":51,"context_line":"            if match:"},{"line_number":52,"context_line":"                entity \u003d entity_with_domain[:match.start()]"},{"line_number":53,"context_line":"                domain \u003d match.group(1)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_c5ff2a65","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":38},"in_reply_to":"3fa7e38b_463a6798","updated":"2019-10-08 16:21:31.000000000","message":"sure, get_domain_id will just return None so it won\u0027t hurt anyway.","commit_id":"169a35e0599a0582dce65c86b0e1a9920ce6bd66"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"6d84cdf84dfcd22d1f88b55f0da81995610085a6","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        Returns a tuple of (entity, domain)."},{"line_number":48,"context_line":"        \"\"\""},{"line_number":49,"context_line":"        try:"},{"line_number":50,"context_line":"            match \u003d re.search(r\"\\{(.*?)\\}$\", entity_with_domain)"},{"line_number":51,"context_line":"            if match:"},{"line_number":52,"context_line":"                entity \u003d entity_with_domain[:match.start()]"},{"line_number":53,"context_line":"                domain \u003d match.group(1)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3fa7e38b_463a6798","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":38},"in_reply_to":"3fa7e38b_7f07ef1d","updated":"2019-10-08 13:45:06.000000000","message":"I see your point, but it might be more consistent to always match {} even if there\u0027s nothing inside.","commit_id":"169a35e0599a0582dce65c86b0e1a9920ce6bd66"}],"heat/engine/resources/openstack/keystone/role_assignments.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fbdfb4770220db1d19880864b60ca859e0ed5476","unresolved":false,"context_lines":[{"line_number":401,"context_line":"    def user_domain_id(self):"},{"line_number":402,"context_line":"        try:"},{"line_number":403,"context_line":"            return self.client_plugin().get_domain_id("},{"line_number":404,"context_line":"                self.properties.get(self.USER_DOMAIN))"},{"line_number":405,"context_line":"        except Exception as ex:"},{"line_number":406,"context_line":"            self.client_plugin().ignore_not_found(ex)"},{"line_number":407,"context_line":"            return None"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_c50b897a","line":404,"range":{"start_line":404,"start_character":32,"end_line":404,"end_character":35},"updated":"2019-06-10 13:49:20.000000000","message":"Don\u0027t use get(). self.properties[self.USER_DOMAIN] is guaranteed to work.","commit_id":"d28beb040197ba072745969af00d53dc16e8bd78"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fbdfb4770220db1d19880864b60ca859e0ed5476","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            return self.client_plugin().get_domain_id("},{"line_number":404,"context_line":"                self.properties.get(self.USER_DOMAIN))"},{"line_number":405,"context_line":"        except Exception as ex:"},{"line_number":406,"context_line":"            self.client_plugin().ignore_not_found(ex)"},{"line_number":407,"context_line":"            return None"},{"line_number":408,"context_line":""},{"line_number":409,"context_line":"    def handle_create(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_c58069c2","line":406,"updated":"2019-06-10 13:49:20.000000000","message":"I don\u0027t think this logic is correct. If the user specifies a domain and that domain doesn\u0027t exist, that\u0027s an error - we don\u0027t want to allow keystone to just select a user in another domain.\n\nIf the user does not specify a domain, then we want to return None.","commit_id":"d28beb040197ba072745969af00d53dc16e8bd78"}],"heat/tests/openstack/keystone/test_role_assignments.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"fbdfb4770220db1d19880864b60ca859e0ed5476","unresolved":false,"context_lines":[{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        self.keystone_client_plugin \u003d mock.MagicMock()"},{"line_number":445,"context_line":"        self.keystone_client_plugin.get_user_id.side_effect \u003d ("},{"line_number":446,"context_line":"            _side_effect_multi)"},{"line_number":447,"context_line":"        self.keystone_client_plugin.get_domain_id.side_effect \u003d _side_effect"},{"line_number":448,"context_line":"        self.keystone_client_plugin.get_role_id.side_effect \u003d _side_effect"},{"line_number":449,"context_line":"        self.keystone_client_plugin.get_project_id.side_effect \u003d _side_effect"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_25694520","line":446,"updated":"2019-06-10 13:49:20.000000000","message":"Why not just change the implementation of _side_effect()?","commit_id":"d28beb040197ba072745969af00d53dc16e8bd78"}]}
