)]}'
{"keystone/common/controller.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":740,"context_line":""},{"line_number":741,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":742,"context_line":"        \"\"\"Fill in domain_id if not specified in a v3 call.\"\"\""},{"line_number":743,"context_line":"        if not ref.get(\u0027domain_id\u0027):"},{"line_number":744,"context_line":"            ref[\u0027domain_id\u0027] \u003d self._get_domain_id_from_token(context)"},{"line_number":745,"context_line":"        return ref"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_727da7e6","line":743,"updated":"2015-08-22 09:29:11.000000000","message":"This looks like it is fixing a separate bug - that of if you put \u0027domain_id \u003d None\u0027 in the entity, we fail to look in the token.  If so, then we should raise and fix this as a separate change.","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":740,"context_line":""},{"line_number":741,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":742,"context_line":"        \"\"\"Fill in domain_id if not specified in a v3 call.\"\"\""},{"line_number":743,"context_line":"        if not ref.get(\u0027domain_id\u0027):"},{"line_number":744,"context_line":"            ref[\u0027domain_id\u0027] \u003d self._get_domain_id_from_token(context)"},{"line_number":745,"context_line":"        return ref"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_d4ca5b6e","line":743,"in_reply_to":"fa1b9901_727da7e6","updated":"2015-08-22 18:00:56.000000000","message":"agreed. I\u0027ll undo and put a todo here to handle the case where domain_id\u003dNone","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e7136fad5d9ff1e19d6f1b29a8e08c672be30374","unresolved":false,"context_lines":[{"line_number":740,"context_line":""},{"line_number":741,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":742,"context_line":"        \"\"\"Fill in domain_id if not specified in a v3 call.\"\"\""},{"line_number":743,"context_line":"        # TODO(htruta): handle domain_id passed as None"},{"line_number":744,"context_line":"        if \u0027domain_id\u0027 not in ref:"},{"line_number":745,"context_line":"            ref[\u0027domain_id\u0027] \u003d self._get_domain_id_from_token(context)"},{"line_number":746,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f9ede58e","line":743,"updated":"2015-08-26 15:04:58.000000000","message":"This is a bug independent of reseller.  You should raise it as a defect and quote the defect number here.","commit_id":"0f49cdabfd7bd89850fa80263a5ad78e91635a5d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"af31090fce133aea629d5961d3052c5c8da1c6c7","unresolved":false,"context_lines":[{"line_number":740,"context_line":""},{"line_number":741,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":742,"context_line":"        \"\"\"Fill in domain_id if not specified in a v3 call.\"\"\""},{"line_number":743,"context_line":"        # TODO(htruta): handle domain_id passed as None"},{"line_number":744,"context_line":"        if \u0027domain_id\u0027 not in ref:"},{"line_number":745,"context_line":"            ref[\u0027domain_id\u0027] \u003d self._get_domain_id_from_token(context)"},{"line_number":746,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_d25cef1a","line":743,"in_reply_to":"fa1b9901_f9ede58e","updated":"2015-08-31 22:51:40.000000000","message":"Done","commit_id":"0f49cdabfd7bd89850fa80263a5ad78e91635a5d"},{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"a4d65fa68dad56aee3364b6d84290e015f6b1490","unresolved":false,"context_lines":[{"line_number":740,"context_line":""},{"line_number":741,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":742,"context_line":"        \"\"\"Fill in domain_id if not specified in a v3 call.\"\"\""},{"line_number":743,"context_line":"        # TODO(htruta): handle domain_id passed as None, as in bug #1490764"},{"line_number":744,"context_line":"        if \u0027domain_id\u0027 not in ref:"},{"line_number":745,"context_line":"            ref[\u0027domain_id\u0027] \u003d self._get_domain_id_from_token(context)"},{"line_number":746,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":10,"id":"da20952f_a71a52c4","line":743,"updated":"2015-09-01 04:02:30.000000000","message":"i think bug #1490764 is not a bug","commit_id":"3a280c9ed78ca456a765fbddb19b7e55af94c92d"}],"keystone/resource/controllers.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bf64d05eae4403b3423b1994390bb22519ac26d0","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            raise exception.NotImplemented(msg)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":222,"context_line":"        # be normalized to the domain_id in the token if domain scoped"},{"line_number":223,"context_line":"        # or to the domain default."},{"line_number":224,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":225,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_612c05ac","line":222,"updated":"2015-08-17 13:36:46.000000000","message":"update comment - this won\u0027t be always the behavior. Maybe just say that the domain_id will be normalized\n\nalso... this patch is supposed to add only Manager support, right?","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2b15933ed8f4c442e949929977ed6bf9f6ba934e","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            raise exception.NotImplemented(msg)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":222,"context_line":"        # be normalized to the domain_id in the token if domain scoped"},{"line_number":223,"context_line":"        # or to the domain default."},{"line_number":224,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":225,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_97f950cb","line":222,"in_reply_to":"fa1b9901_612c05ac","updated":"2015-08-17 17:43:52.000000000","message":"Ok.  We say in the commit message that we are also doing this","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        # be normalized."},{"line_number":223,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":224,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":227,"context_line":"        try:"},{"line_number":228,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_7264c748","line":225,"updated":"2015-08-22 09:29:11.000000000","message":"Just for clarity, it might be better to have this above the is_domain check, so it is a replacement in the same place as the original call to normalise domain.","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        # be normalized."},{"line_number":223,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":224,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":227,"context_line":"        try:"},{"line_number":228,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_79a90a24","line":225,"in_reply_to":"fa1b9901_7264c748","updated":"2015-08-22 18:00:56.000000000","message":"Done","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f0ca88d5dd16af80c90fbe3dfbf39984bc609d0a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":217,"context_line":"        # be normalized."},{"line_number":218,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":219,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_6753b13a","line":217,"updated":"2015-09-08 15:01:08.000000000","message":"these comment is not helpful, it\u0027s easy to see from the code below, comments here is better to explain the reason for this.","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":217,"context_line":"        # be normalized."},{"line_number":218,"context_line":"        if not ref.get(\u0027parent_id\u0027) and not ref.get(\u0027domain_id\u0027):"},{"line_number":219,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_85f921cb","line":217,"in_reply_to":"da20952f_6753b13a","updated":"2015-09-24 18:51:21.000000000","message":"you\u0027re right. it\u0027s done for the same reason it was done before. It might be better to remove the comment","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"}],"keystone/resource/core.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bf64d05eae4403b3423b1994390bb22519ac26d0","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            # compatibility with the existing domain behaviour, we allow a"},{"line_number":279,"context_line":"            # project acting as a domain to be disabled irrespective of the"},{"line_number":280,"context_line":"            # state of its children. The act of disabling such a project will"},{"line_number":281,"context_line":"            # cause its children to be disabled."},{"line_number":282,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":283,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":284,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_444b0f5a","line":281,"updated":"2015-08-17 13:36:46.000000000","message":"maybe \"Disabling a project acting as domain effectively disables its children\"\n\nwhat if there is another project acting as a domain below it?","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f086e4a16d7303abed7857880839d886b7d69a91","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            # compatibility with the existing domain behaviour, we allow a"},{"line_number":279,"context_line":"            # project acting as a domain to be disabled irrespective of the"},{"line_number":280,"context_line":"            # state of its children. The act of disabling such a project will"},{"line_number":281,"context_line":"            # cause its children to be disabled."},{"line_number":282,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":283,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":284,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_782a3680","line":281,"in_reply_to":"fa1b9901_378de431","updated":"2015-08-18 17:09:46.000000000","message":"not at all... it should stop in the first domain - like it is done in the subtree list call. If you have three is_domain projects A -\u003e B -\u003e C, C doesn\u0027t belong to A, but to B, so it doesn\u0027t have power over C.","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2b15933ed8f4c442e949929977ed6bf9f6ba934e","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            # compatibility with the existing domain behaviour, we allow a"},{"line_number":279,"context_line":"            # project acting as a domain to be disabled irrespective of the"},{"line_number":280,"context_line":"            # state of its children. The act of disabling such a project will"},{"line_number":281,"context_line":"            # cause its children to be disabled."},{"line_number":282,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":283,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":284,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_378de431","line":281,"in_reply_to":"fa1b9901_444b0f5a","updated":"2015-08-17 17:43:52.000000000","message":"I think that it must also be disabled.","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bf64d05eae4403b3423b1994390bb22519ac26d0","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def delete_project(self, tenant_id, initiator\u003dNone):"},{"line_number":294,"context_line":"        project \u003d self.driver.get_project(tenant_id)"},{"line_number":295,"context_line":"        if project.get(\u0027is_domain\u0027) and project.get(\u0027enabled\u0027):"},{"line_number":296,"context_line":"            raise exception.ValidationError("},{"line_number":297,"context_line":"                message\u003d_(\u0027cannot delete an enabled project acting as a \u0027"},{"line_number":298,"context_line":"                          \u0027domain. Please disable the project %s first.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_042677ba","line":295,"updated":"2015-08-17 13:36:46.000000000","message":"maybe use [\u0027is_domain\u0027] and [\u0027enabled\u0027] - if they aren\u0027t present we have much more problems to be worried here","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2b15933ed8f4c442e949929977ed6bf9f6ba934e","unresolved":false,"context_lines":[{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def delete_project(self, tenant_id, initiator\u003dNone):"},{"line_number":294,"context_line":"        project \u003d self.driver.get_project(tenant_id)"},{"line_number":295,"context_line":"        if project.get(\u0027is_domain\u0027) and project.get(\u0027enabled\u0027):"},{"line_number":296,"context_line":"            raise exception.ValidationError("},{"line_number":297,"context_line":"                message\u003d_(\u0027cannot delete an enabled project acting as a \u0027"},{"line_number":298,"context_line":"                          \u0027domain. Please disable the project %s first.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_d798286d","line":295,"in_reply_to":"fa1b9901_042677ba","updated":"2015-08-17 17:43:52.000000000","message":"Done","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bf64d05eae4403b3423b1994390bb22519ac26d0","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    @MEMOIZE"},{"line_number":604,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":605,"context_line":"        return self.driver.get_project_by_name("},{"line_number":606,"context_line":"            tenant_name, domain_id)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    @notifications.internal("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_6103a510","line":605,"updated":"2015-08-17 13:36:46.000000000","message":"undo this","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2b15933ed8f4c442e949929977ed6bf9f6ba934e","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    @MEMOIZE"},{"line_number":604,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":605,"context_line":"        return self.driver.get_project_by_name("},{"line_number":606,"context_line":"            tenant_name, domain_id)"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"    @notifications.internal("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_57adf886","line":605,"in_reply_to":"fa1b9901_6103a510","updated":"2015-08-17 17:43:52.000000000","message":"Done","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                action\u003d_(\u0027max hierarchy depth reached for \u0027"},{"line_number":83,"context_line":"                         \u0027%s branch.\u0027) % project_id)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _assert_is_domain_project_constraints(self, project_ref, parent_ref):"},{"line_number":86,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":87,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"},{"line_number":88,"context_line":"            raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_d201133b","line":85,"updated":"2015-08-22 09:29:11.000000000","message":"probably a good idea to add a docstring similar to the method for regular projects below","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                action\u003d_(\u0027max hierarchy depth reached for \u0027"},{"line_number":83,"context_line":"                         \u0027%s branch.\u0027) % project_id)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _assert_is_domain_project_constraints(self, project_ref, parent_ref):"},{"line_number":86,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":87,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"},{"line_number":88,"context_line":"            raise exception.ValidationError("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_f41e7f5e","line":85,"in_reply_to":"fa1b9901_d201133b","updated":"2015-08-22 18:00:56.000000000","message":"Done","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                % project_ref[\u0027id\u0027])"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _assert_regular_project_constraints(self, project_ref, parent_ref):"},{"line_number":100,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":101,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":102,"context_line":"        # regular project, this project must be in the same domain of"},{"line_number":103,"context_line":"        # its parent. If the parent is a project acting as a domain, this"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_72f28771","line":100,"updated":"2015-08-22 09:29:11.000000000","message":"Maybe turn this into a docstring","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                % project_ref[\u0027id\u0027])"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _assert_regular_project_constraints(self, project_ref, parent_ref):"},{"line_number":100,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":101,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":102,"context_line":"        # regular project, this project must be in the same domain of"},{"line_number":103,"context_line":"        # its parent. If the parent is a project acting as a domain, this"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_b95d624a","line":100,"in_reply_to":"fa1b9901_72f28771","updated":"2015-08-22 18:00:56.000000000","message":"Done","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":102,"context_line":"        # regular project, this project must be in the same domain of"},{"line_number":103,"context_line":"        # its parent. If the parent is a project acting as a domain, this"},{"line_number":104,"context_line":"        # project\u0027s domain_id must match the parent_id"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_b2e1ff9c","line":104,"updated":"2015-08-22 09:29:11.000000000","message":"I don\u0027t think we validate the last sentence here do we? i.e. a check for the domain_id if the parent is a project acting as a domain?","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":102,"context_line":"        # regular project, this project must be in the same domain of"},{"line_number":103,"context_line":"        # its parent. If the parent is a project acting as a domain, this"},{"line_number":104,"context_line":"        # project\u0027s domain_id must match the parent_id"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_193faed7","line":104,"in_reply_to":"fa1b9901_b2e1ff9c","updated":"2015-08-22 18:00:56.000000000","message":"true... that\u0027s going to happen in the follow up patchsets","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":291,"context_line":"        return ret"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _assert_no_subproject_acting_as_domain_enabled(self, project_id):"},{"line_number":294,"context_line":"        is_domain_subtree_enabled \u003d [p for p in self.list_projects_in_subtree("},{"line_number":295,"context_line":"            project_id) if p[\u0027is_domain\u0027] and p[\u0027enabled\u0027]]"},{"line_number":296,"context_line":"        if any(is_domain_subtree_enabled):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_32bacf6f","line":293,"updated":"2015-08-22 09:29:11.000000000","message":"this method name can be misinterpreted, I would suggest:\n\n_assert_subtree_under_project_acting_as_domain_disabled","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d0749935a1e7863dc6091935e9b7ad1f496d4507","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":291,"context_line":"        return ret"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _assert_no_subproject_acting_as_domain_enabled(self, project_id):"},{"line_number":294,"context_line":"        is_domain_subtree_enabled \u003d [p for p in self.list_projects_in_subtree("},{"line_number":295,"context_line":"            project_id) if p[\u0027is_domain\u0027] and p[\u0027enabled\u0027]]"},{"line_number":296,"context_line":"        if any(is_domain_subtree_enabled):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_79547553","line":293,"in_reply_to":"fa1b9901_19480e87","updated":"2015-08-24 17:52:34.000000000","message":"ok, yep, agreed","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":291,"context_line":"        return ret"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"    def _assert_no_subproject_acting_as_domain_enabled(self, project_id):"},{"line_number":294,"context_line":"        is_domain_subtree_enabled \u003d [p for p in self.list_projects_in_subtree("},{"line_number":295,"context_line":"            project_id) if p[\u0027is_domain\u0027] and p[\u0027enabled\u0027]]"},{"line_number":296,"context_line":"        if any(is_domain_subtree_enabled):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_19480e87","line":293,"in_reply_to":"fa1b9901_32bacf6f","updated":"2015-08-22 18:00:56.000000000","message":"actually, I disagree... we are only checking ig the projects acting as domains are enabled, not the whole subtree","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e7136fad5d9ff1e19d6f1b29a8e08c672be30374","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        Called when is_domain is true, ensures that multiple domains are"},{"line_number":89,"context_line":"        supported, and that it is not dealing with a federated domain."},{"line_number":90,"context_line":"        It also checks if it is not creating a root project, then parent"},{"line_number":91,"context_line":"        must be a project that acts as a domain."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":94,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_59017105","line":91,"updated":"2015-08-26 15:04:58.000000000","message":"Perhaps make this a bulleted pointed list for clarity, e.g.\n\nCalled when is_domain is true, this method ensures that:\n\n- multiple domains are enabled\n- the project name is not the reserved name for a federated domain\n- if the project is not a root project, then its parent must also be acting as a domain","commit_id":"0f49cdabfd7bd89850fa80263a5ad78e91635a5d"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"af31090fce133aea629d5961d3052c5c8da1c6c7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        Called when is_domain is true, ensures that multiple domains are"},{"line_number":89,"context_line":"        supported, and that it is not dealing with a federated domain."},{"line_number":90,"context_line":"        It also checks if it is not creating a root project, then parent"},{"line_number":91,"context_line":"        must be a project that acts as a domain."},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":94,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"da20952f_5270dfa3","line":91,"in_reply_to":"fa1b9901_59017105","updated":"2015-08-31 22:51:40.000000000","message":"Done","commit_id":"0f49cdabfd7bd89850fa80263a5ad78e91635a5d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f0ca88d5dd16af80c90fbe3dfbf39984bc609d0a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        * if the project is not a root project, then its parent must also be"},{"line_number":92,"context_line":"          acting as a domain"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":97,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_79f4c7ce","line":94,"updated":"2015-09-08 15:01:08.000000000","message":"change raise to raises and use the full path pls.\n\n:raises keystone.exception.ValidationError","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        * if the project is not a root project, then its parent must also be"},{"line_number":92,"context_line":"          acting as a domain"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":97,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_c525d95c","line":94,"in_reply_to":"da20952f_79f4c7ce","updated":"2015-09-24 18:51:21.000000000","message":"Done","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"93ce4654f329ff3a3494f4411329ea85de862adb","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":97,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"},{"line_number":98,"context_line":"            raise exception.ValidationError("},{"line_number":99,"context_line":"                message\u003d_(\u0027Multiple domains are not supported\u0027))"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assert_domain_not_federated(project_ref[\u0027id\u0027], project_ref)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_c39ff063","line":99,"updated":"2015-09-09 08:33:39.000000000","message":"better to say \"Multiple domains are not supported under which condition...\", or else, we have no idea what\u0027s going on from the log.","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"},{"line_number":97,"context_line":"                project_ref[\u0027id\u0027] !\u003d CONF.identity.default_domain_id):"},{"line_number":98,"context_line":"            raise exception.ValidationError("},{"line_number":99,"context_line":"                message\u003d_(\u0027Multiple domains are not supported\u0027))"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        self.assert_domain_not_federated(project_ref[\u0027id\u0027], project_ref)"},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_459f895f","line":99,"in_reply_to":"da20952f_c39ff063","updated":"2015-09-24 18:51:21.000000000","message":"the condition is the flag that was not set to true, which is always the case in LDAP. I don\u0027t think this change is necessary.","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f0ca88d5dd16af80c90fbe3dfbf39984bc609d0a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":115,"context_line":"        its parent."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_39fe4faf","line":117,"updated":"2015-09-08 15:01:08.000000000","message":"same here.","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":115,"context_line":"        its parent."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_0588b121","line":117,"in_reply_to":"da20952f_39fe4faf","updated":"2015-09-24 18:51:21.000000000","message":"Done","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"93ce4654f329ff3a3494f4411329ea85de862adb","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        its parent."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_83e6d8ae","line":118,"updated":"2015-09-09 08:33:39.000000000","message":"Add the following `raises` in the docstring.\n\n:raises: keystone.exception.DomainNotFound","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        its parent."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        :raise ValidationError if one of the constraints was not satisfied."},{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":121,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_45ad4987","line":118,"in_reply_to":"da20952f_83e6d8ae","updated":"2015-09-24 18:51:21.000000000","message":"Done","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"93ce4654f329ff3a3494f4411329ea85de862adb","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                       \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":136,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":137,"context_line":"        return parent_ref[\u0027domain_id\u0027]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _enforce_project_constraints(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_a35afc28","line":136,"updated":"2015-09-09 08:33:39.000000000","message":"what happened if the parent project doesn\u0027t has the domain_id?\ncan this happen? If not, why?","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                       \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":136,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":137,"context_line":"        return parent_ref[\u0027domain_id\u0027]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _enforce_project_constraints(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_e539fd42","line":136,"in_reply_to":"da20952f_a35afc28","updated":"2015-09-24 18:51:21.000000000","message":"it can\u0027t happen. in a consistent environment, every project has a domain_id","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"f0ca88d5dd16af80c90fbe3dfbf39984bc609d0a","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":164,"context_line":"                                             parents_list)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":167,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":168,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":169,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"da20952f_1974ab34","line":166,"updated":"2015-09-08 15:01:08.000000000","message":"suggest to use project_id and project since tenant has been deprecated  for a long time. I know these still used in other places so it is nice to have.","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2afc5097fe24c9dd9b70d5185e2bcc937614229","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":164,"context_line":"                                             parents_list)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":167,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":168,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":169,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a1a9d01_a5cea558","line":166,"in_reply_to":"da20952f_1974ab34","updated":"2015-09-24 18:51:21.000000000","message":"that\u0027s a good change to do, but we could do that in another refactoring patch, not this one. Those names were not changed at this patch","commit_id":"604959a9881ad928068774982ec6a96bbc89f1b6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d41bd95126569bfb8deee3b1150d2d95a0e7f225","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":181,"context_line":"        tenant.setdefault(\u0027is_domain\u0027, False)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self._enforce_project_constraints(tenant)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        ret \u003d self.driver.create_project(tenant_id, tenant)"},{"line_number":186,"context_line":"        notifications.Audit.created(self._PROJECT, tenant_id, initiator)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_37c3c239","line":183,"updated":"2015-10-01 07:36:14.000000000","message":"this name does not suggest we will be setting things like domain_id....it sounds like it will just raise exceptions if constraints fail.","commit_id":"7f572112f7ee711d5834fd3e67ac3ec9640da759"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"ee96da55fd6a9ce66d85cee38cbc211cd9f37188","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":181,"context_line":"        tenant.setdefault(\u0027is_domain\u0027, False)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        self._enforce_project_constraints(tenant)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        ret \u003d self.driver.create_project(tenant_id, tenant)"},{"line_number":186,"context_line":"        notifications.Audit.created(self._PROJECT, tenant_id, initiator)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a1a9d01_1a4d79c4","line":183,"in_reply_to":"9a1a9d01_37c3c239","updated":"2015-10-01 13:16:19.000000000","message":"ok, I\u0027ll move the domain_id setting to this point","commit_id":"7f572112f7ee711d5834fd3e67ac3ec9640da759"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6ddcf597075df3385e6d456c4235440272f677be","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.assert_domain_not_federated(project_ref[\u0027id\u0027], project_ref)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project acting as a domain under \u0027"},{"line_number":107,"context_line":"                          \u0027%s, which is a regular project.\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_6ccddf85","line":104,"updated":"2015-10-01 14:19:43.000000000","message":"if you wanted to follow my design suggestion, this would just say it must not have a parent and it\u0027s domain_id should be None.","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fef387242552db30fbcaeca91df0fc6b6229226d","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        self.assert_domain_not_federated(project_ref[\u0027id\u0027], project_ref)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project acting as a domain under \u0027"},{"line_number":107,"context_line":"                          \u0027%s, which is a regular project.\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_4be8ee16","line":104,"in_reply_to":"9a1a9d01_6ccddf85","updated":"2015-10-02 17:58:31.000000000","message":"Done","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6ddcf597075df3385e6d456c4235440272f677be","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":170,"context_line":"        # project_id of the closest project acting as a domain upward in the"},{"line_number":171,"context_line":"        # hierarchy. Root projects are always projects that act as a domain and"},{"line_number":172,"context_line":"        # have no domain_id."},{"line_number":173,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":174,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":175,"context_line":"        tenant.setdefault(\u0027is_domain\u0027, False)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_ec480f8d","line":172,"updated":"2015-10-01 14:19:43.000000000","message":"I still think this sentence is confusing.  How about:\n\nIf the caller has not specified the domain_id of the project, then it will be inferred from it\u0027s position in the hierarchy, i.e. unless it is a top level project then its domain will be the same domain as its parent. If this is a top level project, then it must be acting as a domain - and for such projects the domain_id is the project_id, so we don\u0027t bother to store a separate domain_id.","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fef387242552db30fbcaeca91df0fc6b6229226d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":170,"context_line":"        # project_id of the closest project acting as a domain upward in the"},{"line_number":171,"context_line":"        # hierarchy. Root projects are always projects that act as a domain and"},{"line_number":172,"context_line":"        # have no domain_id."},{"line_number":173,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":174,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":175,"context_line":"        tenant.setdefault(\u0027is_domain\u0027, False)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_6bbe12d6","line":172,"in_reply_to":"9a1a9d01_ec480f8d","updated":"2015-10-02 17:58:31.000000000","message":"almost agreed. except that the project_id is never the domain_id","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6ddcf597075df3385e6d456c4235440272f677be","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":305,"context_line":"        return ret"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def _assert_no_subproject_acting_as_domain_enabled(self, project_id):"},{"line_number":308,"context_line":"        is_domain_subtree_enabled \u003d [p for p in self.list_projects_in_subtree("},{"line_number":309,"context_line":"            project_id) if p[\u0027is_domain\u0027] and p[\u0027enabled\u0027]]"},{"line_number":310,"context_line":"        if any(is_domain_subtree_enabled):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_4ceedbb5","line":307,"updated":"2015-10-01 14:19:43.000000000","message":"if you were following my design suggestion, this wouldn\u0027t be needed yet","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fef387242552db30fbcaeca91df0fc6b6229226d","unresolved":false,"context_lines":[{"line_number":304,"context_line":"                                            original_tenant[\u0027domain_id\u0027])"},{"line_number":305,"context_line":"        return ret"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    def _assert_no_subproject_acting_as_domain_enabled(self, project_id):"},{"line_number":308,"context_line":"        is_domain_subtree_enabled \u003d [p for p in self.list_projects_in_subtree("},{"line_number":309,"context_line":"            project_id) if p[\u0027is_domain\u0027] and p[\u0027enabled\u0027]]"},{"line_number":310,"context_line":"        if any(is_domain_subtree_enabled):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a1a9d01_0b5756cb","line":307,"in_reply_to":"9a1a9d01_4ceedbb5","updated":"2015-10-02 17:58:31.000000000","message":"Done","commit_id":"33525f414655d7cba2908490ea80f09eda9eaa37"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b57027ace75228f125842680301fae081940f965","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        * multiple domains are enabled"},{"line_number":90,"context_line":"        * the project name is not the reserved name for a federated domain"},{"line_number":91,"context_line":"        * the project is a root project"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":94,"context_line":"            was not satisfied."}],"source_content_type":"text/x-python","patch_set":18,"id":"9a1a9d01_a5dc2047","line":91,"updated":"2015-10-03 10:06:09.000000000","message":"what about the case when they try and create an is_domain project but have specified a domain_id (which should be illegal)","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"72a880d99988b0bbe1389895f3c6e48f61069b82","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        * multiple domains are enabled"},{"line_number":90,"context_line":"        * the project name is not the reserved name for a federated domain"},{"line_number":91,"context_line":"        * the project is a root project"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":94,"context_line":"            was not satisfied."}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_f65f7573","line":91,"in_reply_to":"9a1a9d01_a5dc2047","updated":"2015-10-05 18:08:58.000000000","message":"shouldn\u0027t this be caught by the controller? and since we don\u0027t allow it yet, I don\u0027t think we need to deal with it now... only when the project really act as domains","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b57027ace75228f125842680301fae081940f965","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        if parent_ref:"},{"line_number":104,"context_line":"            raise exception.ValidationError("},{"line_number":105,"context_line":"                message\u003d_(\u0027projects acting as domains are only allowed being \u0027"},{"line_number":106,"context_line":"                          \u0027root projects.\u0027))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _assert_regular_project_constraints(self, project_ref, parent_ref):"},{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a1a9d01_451504e3","line":106,"updated":"2015-10-03 10:06:09.000000000","message":"maybe a better wording would be:\n\n\"only root projects are allowed to act as domains\"","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"72a880d99988b0bbe1389895f3c6e48f61069b82","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        if parent_ref:"},{"line_number":104,"context_line":"            raise exception.ValidationError("},{"line_number":105,"context_line":"                message\u003d_(\u0027projects acting as domains are only allowed being \u0027"},{"line_number":106,"context_line":"                          \u0027root projects.\u0027))"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def _assert_regular_project_constraints(self, project_ref, parent_ref):"},{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_8b65bde2","line":106,"in_reply_to":"9a1a9d01_451504e3","updated":"2015-10-05 18:08:58.000000000","message":"Done","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b57027ace75228f125842680301fae081940f965","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Called when is_domain is false, hence the project"},{"line_number":112,"context_line":"        must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9a1a9d01_a525005d","line":112,"updated":"2015-10-03 10:06:09.000000000","message":"shouldn\u0027t we check that this is true in this method.  E.g. what happens if they didn\u0027t specify a domain_id for a top level project?","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"72a880d99988b0bbe1389895f3c6e48f61069b82","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Called when is_domain is false, hence the project"},{"line_number":112,"context_line":"        must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_5d2c4cab","line":112,"in_reply_to":"9a1a9d01_a525005d","updated":"2015-10-05 18:08:58.000000000","message":"We already check. If they don\u0027t specify it, we normalize the domain_id in controller: https://review.openstack.org/#/c/213448/18/keystone/resource/controllers.py","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b57027ace75228f125842680301fae081940f965","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        # it will be inferred from it\u0027s position in the hierarchy, i.e. unless"},{"line_number":168,"context_line":"        # it is a top level project then its domain will be the same domain"},{"line_number":169,"context_line":"        # as its parent. If this is a top level project, then it must be"},{"line_number":170,"context_line":"        # acting as a domain - and for such projects the domain_id is the"},{"line_number":171,"context_line":"        # project_id, so we don\u0027t bother to store a separate domain_id."},{"line_number":172,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":173,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a1a9d01_c55a74f2","line":170,"updated":"2015-10-03 10:06:09.000000000","message":"actually...sorry..having suggested this...it\u0027s not true (yet) I think that a top level project must be a domain is it? In which case this 2nd sentence should say something like:\n\n\"If this is a top level project action as a domain, the domain_id is the project_id, and for such projects we don\u0027t both to store a separate domain_id. If this is a non-domain top level project, then the domain_id must have been specified by the caller (this is checked as part of the project constraints).\"\n\nI also think this comment would be bette moved to before line 176.","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"72a880d99988b0bbe1389895f3c6e48f61069b82","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        # it will be inferred from it\u0027s position in the hierarchy, i.e. unless"},{"line_number":168,"context_line":"        # it is a top level project then its domain will be the same domain"},{"line_number":169,"context_line":"        # as its parent. If this is a top level project, then it must be"},{"line_number":170,"context_line":"        # acting as a domain - and for such projects the domain_id is the"},{"line_number":171,"context_line":"        # project_id, so we don\u0027t bother to store a separate domain_id."},{"line_number":172,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"},{"line_number":173,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_009bc7ca","line":170,"in_reply_to":"9a1a9d01_c55a74f2","updated":"2015-10-05 18:08:58.000000000","message":"it is correct, except that the project will have no domain_id","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"14d519667bd6e3add51a8058ffc4208119895024","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Called when is_domain is false, hence the project"},{"line_number":112,"context_line":"        must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_85fbc97a","line":112,"updated":"2015-10-21 16:01:32.000000000","message":"as per my earlier comment on a previous patch, this comment sounds like we should be checking for this in this method (whereas I think your point is that the controller will do this). In which case, we should say something like:\n\n\"Called when is_domain is false, and the project will contain a valid parent_id or domain_id (this is checked in the controller). If the parent....\"","commit_id":"23a05507b7aa009a042ac28a78475a87fb2b9bfc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"e023258a59a3d4831f479bb6232829d92420bb98","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        \"\"\"Enforces regular project hierarchy constraints"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        Called when is_domain is false, hence the project"},{"line_number":112,"context_line":"        must contain a valid parent_id or domain_id. If the parent is a"},{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da85f559_b00544c3","line":112,"in_reply_to":"3a29b11f_85fbc97a","updated":"2015-11-09 14:56:59.000000000","message":"Done","commit_id":"23a05507b7aa009a042ac28a78475a87fb2b9bfc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"14d519667bd6e3add51a8058ffc4208119895024","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # If this is a top level project acting as a domain, the project has"},{"line_number":171,"context_line":"        # no domain_id, and for such projects we don\u0027t bother to store a"},{"line_number":172,"context_line":"        # separate domain_id. If this is a non-domain top level project,"},{"line_number":173,"context_line":"        # then the domain_id must have been specified by the caller"},{"line_number":174,"context_line":"        # (this is checked as part of the project constraints)"},{"line_number":175,"context_line":"        domain_id \u003d tenant.get(\u0027domain_id\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_4504d148","line":172,"updated":"2015-10-21 16:01:32.000000000","message":"even though some of the words are mine, I think a few were missed out...I think the following would be clearer:\n\n\"If this is a top level project acting as a domain, then the project_id is, effectively, the domain_id - and so for such projects we don\u0027t bother to store a copy of it in the domain_id attribute. If this is a non-domain top.....\"","commit_id":"23a05507b7aa009a042ac28a78475a87fb2b9bfc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"e023258a59a3d4831f479bb6232829d92420bb98","unresolved":false,"context_lines":[{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # If this is a top level project acting as a domain, the project has"},{"line_number":171,"context_line":"        # no domain_id, and for such projects we don\u0027t bother to store a"},{"line_number":172,"context_line":"        # separate domain_id. If this is a non-domain top level project,"},{"line_number":173,"context_line":"        # then the domain_id must have been specified by the caller"},{"line_number":174,"context_line":"        # (this is checked as part of the project constraints)"},{"line_number":175,"context_line":"        domain_id \u003d tenant.get(\u0027domain_id\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da85f559_70827c02","line":172,"in_reply_to":"3a29b11f_4504d148","updated":"2015-11-09 14:56:59.000000000","message":"Done","commit_id":"23a05507b7aa009a042ac28a78475a87fb2b9bfc"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1ceb65a91b1a58061fba18baa8b8fd57e8cc4774","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            is_domain_parent \u003d parent_ref.get(\u0027is_domain\u0027)"},{"line_number":125,"context_line":"            parent_domain_id \u003d parent_ref.get(\u0027domain_id\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            if not is_domain_parent and parent_domain_id !\u003d domain[\u0027id\u0027]:"},{"line_number":128,"context_line":"                raise exception.ValidationError("},{"line_number":129,"context_line":"                    message\u003d_(\u0027Cannot create project, since it specifies \u0027"},{"line_number":130,"context_line":"                              \u0027its owner as domain %(domain_id)s, but \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a29b11f_e5578b24","line":127,"updated":"2015-10-27 01:14:00.000000000","message":"question: in this patch it is possible to have only root projects acting as domains, correct? A subproject can *never* be a domain, in this case, its domain_id should *always* match its parent domain_id, independently if it is a project acting as a domain or not. Correct?\n\nIf so, I think the \"not is_domain_parent\" part should be removed.","commit_id":"4691ed8000e2554470ce8a1971d364e677a36c42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"fbf022759eea26cf036b2c1dd7d37d9c11e11dad","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            is_domain_parent \u003d parent_ref.get(\u0027is_domain\u0027)"},{"line_number":125,"context_line":"            parent_domain_id \u003d parent_ref.get(\u0027domain_id\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            if not is_domain_parent and parent_domain_id !\u003d domain[\u0027id\u0027]:"},{"line_number":128,"context_line":"                raise exception.ValidationError("},{"line_number":129,"context_line":"                    message\u003d_(\u0027Cannot create project, since it specifies \u0027"},{"line_number":130,"context_line":"                              \u0027its owner as domain %(domain_id)s, but \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"1a26ad4f_99251b5e","line":127,"in_reply_to":"3a29b11f_9c6dcd34","updated":"2015-10-27 07:38:38.000000000","message":"hmm true, thanks for the explanation","commit_id":"4691ed8000e2554470ce8a1971d364e677a36c42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4054ce8dd8beebd0ef4f6171d27161aff4563416","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            is_domain_parent \u003d parent_ref.get(\u0027is_domain\u0027)"},{"line_number":125,"context_line":"            parent_domain_id \u003d parent_ref.get(\u0027domain_id\u0027)"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            if not is_domain_parent and parent_domain_id !\u003d domain[\u0027id\u0027]:"},{"line_number":128,"context_line":"                raise exception.ValidationError("},{"line_number":129,"context_line":"                    message\u003d_(\u0027Cannot create project, since it specifies \u0027"},{"line_number":130,"context_line":"                              \u0027its owner as domain %(domain_id)s, but \u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a29b11f_9c6dcd34","line":127,"in_reply_to":"3a29b11f_e5578b24","updated":"2015-10-27 05:23:05.000000000","message":"Actually, no. Because  the project that acts as a domain has domain_id None. That\u0027s why we need to check the first condition.","commit_id":"4691ed8000e2554470ce8a1971d364e677a36c42"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"02edab5d6a1e388bbbdb4c2b0c0de359f073cdef","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        * the project name is not the reserved name for a federated domain"},{"line_number":91,"context_line":"        * the project is a root project"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":94,"context_line":"            was not satisfied."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_665eea77","line":93,"updated":"2015-10-30 14:30:06.000000000","message":"colon after ValidationError\n\nCapitalize \u0027if\u0027","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb1d02c8e8e6d9a3aa8f74d21a7e667db0a06508","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        * the project name is not the reserved name for a federated domain"},{"line_number":91,"context_line":"        * the project is a root project"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":94,"context_line":"            was not satisfied."},{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":"        if (not self.identity_api.multiple_domains_supported and"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_29b6f3dc","line":93,"in_reply_to":"1a26ad4f_665eea77","updated":"2015-11-03 16:34:31.000000000","message":"Done","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"02edab5d6a1e388bbbdb4c2b0c0de359f073cdef","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_26d8f2ee","line":116,"updated":"2015-10-30 14:30:06.000000000","message":"colon after ValidationError\n\ncapitalize \u0027if\u0027","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb1d02c8e8e6d9a3aa8f74d21a7e667db0a06508","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        regular project, this project must be in the same domain of"},{"line_number":114,"context_line":"        its parent."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_a9f983ca","line":116,"in_reply_to":"1a26ad4f_26d8f2ee","updated":"2015-11-03 16:34:31.000000000","message":"Done","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"02edab5d6a1e388bbbdb4c2b0c0de359f073cdef","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_66ecaa8f","line":118,"updated":"2015-10-30 14:30:06.000000000","message":"colon after DomainNotFound and a 1 line explanation why.","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb1d02c8e8e6d9a3aa8f74d21a7e667db0a06508","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        :raises keystone.exception.ValidationError if one of the constraints"},{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_49949736","line":118,"in_reply_to":"1a26ad4f_66ecaa8f","updated":"2015-11-03 16:34:31.000000000","message":"Done","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"02edab5d6a1e388bbbdb4c2b0c0de359f073cdef","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if parent_ref:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_ba35f2da","line":120,"updated":"2015-10-30 14:30:06.000000000","message":"Remove this blank line (your pep8 failure)","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb1d02c8e8e6d9a3aa8f74d21a7e667db0a06508","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            was not satisfied."},{"line_number":118,"context_line":"        :raises keystone.exception.DomainNotFound"},{"line_number":119,"context_line":"        \"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        domain \u003d self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if parent_ref:"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_099e8f56","line":120,"in_reply_to":"1a26ad4f_ba35f2da","updated":"2015-11-03 16:34:31.000000000","message":"Done","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"}],"keystone/resource/schema.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bf64d05eae4403b3423b1994390bb22519ac26d0","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    # some backends. The identity-api should be updated to be consistent with"},{"line_number":21,"context_line":"    # the implementation. domain_id must be passed as null or equals to the"},{"line_number":22,"context_line":"    # parent_id in the controller layer if it is a project acting as a domain."},{"line_number":23,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":24,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":25,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"},{"line_number":26,"context_line":"    \u0027parent_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_24a05bf4","line":23,"updated":"2015-08-17 13:36:46.000000000","message":"isn\u0027t this related to the controller layer?","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2b15933ed8f4c442e949929977ed6bf9f6ba934e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    # some backends. The identity-api should be updated to be consistent with"},{"line_number":21,"context_line":"    # the implementation. domain_id must be passed as null or equals to the"},{"line_number":22,"context_line":"    # parent_id in the controller layer if it is a project acting as a domain."},{"line_number":23,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":24,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":25,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"},{"line_number":26,"context_line":"    \u0027parent_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_f7ebecae","line":23,"in_reply_to":"fa1b9901_24a05bf4","updated":"2015-08-17 17:43:52.000000000","message":"not exactly. that\u0027s because we now are able to store a null domain_id in Manager layer.","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f086e4a16d7303abed7857880839d886b7d69a91","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    # some backends. The identity-api should be updated to be consistent with"},{"line_number":21,"context_line":"    # the implementation. domain_id must be passed as null or equals to the"},{"line_number":22,"context_line":"    # parent_id in the controller layer if it is a project acting as a domain."},{"line_number":23,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":24,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":25,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"},{"line_number":26,"context_line":"    \u0027parent_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_5875f295","line":23,"in_reply_to":"fa1b9901_f7ebecae","updated":"2015-08-18 17:09:46.000000000","message":"this schema validation is for controller calls - this patch isn\u0027t supposed to update the controller yet","commit_id":"23f6186e78023a36dfe69ec2b4187e63b11fdd61"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c2acf0ffe8cfe990f7d832373cd5f9a5d477481e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad, htruta): domain_id isn\u0027t nullable according to"},{"line_number":20,"context_line":"    # some backends. The identity-api should be updated to be consistent with"},{"line_number":21,"context_line":"    # the implementation. domain_id must be passed as null or equals to the"},{"line_number":22,"context_line":"    # parent_id in the controller layer if it is a project acting as a domain."},{"line_number":23,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":24,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_b2a6df51","line":21,"updated":"2015-08-22 09:29:11.000000000","message":"s/equals/equal/","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"df1317fa7486c637ee77e3e4be104a685e7c6ef6","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad, htruta): domain_id isn\u0027t nullable according to"},{"line_number":20,"context_line":"    # some backends. The identity-api should be updated to be consistent with"},{"line_number":21,"context_line":"    # the implementation. domain_id must be passed as null or equals to the"},{"line_number":22,"context_line":"    # parent_id in the controller layer if it is a project acting as a domain."},{"line_number":23,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":24,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_f47aff76","line":21,"in_reply_to":"fa1b9901_b2a6df51","updated":"2015-08-22 18:00:56.000000000","message":"Done","commit_id":"0d2c456fab6113b6fdc803bfd5d249d779df62aa"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1133227ad74ea777ddeb5f19a9a0f5aa2e5601ab","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad): domain_id isn\u0027t nullable according to some backends."},{"line_number":20,"context_line":"    # The identity-api should be updated to be consistent with the"},{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":23,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":24,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a29b11f_40374de3","line":21,"updated":"2015-10-27 01:18:49.000000000","message":"should have a comment explaining why it isn\u0027t nullable in some backends but the controller accepts it?","commit_id":"4691ed8000e2554470ce8a1971d364e677a36c42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4054ce8dd8beebd0ef4f6171d27161aff4563416","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad): domain_id isn\u0027t nullable according to some backends."},{"line_number":20,"context_line":"    # The identity-api should be updated to be consistent with the"},{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":23,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":24,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3a29b11f_7c49d1b6","line":21,"in_reply_to":"3a29b11f_40374de3","updated":"2015-10-27 05:23:05.000000000","message":"ok. I\u0027ll do that in another patchset.","commit_id":"4691ed8000e2554470ce8a1971d364e677a36c42"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"a4d65fa68dad56aee3364b6d84290e015f6b1490","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def new_project_ref(self, domain_id\u003dNone, parent_id\u003dNone, is_domain\u003dFalse):"},{"line_number":303,"context_line":"        ref \u003d self.new_ref()"},{"line_number":304,"context_line":"        if domain_id:"},{"line_number":305,"context_line":"            ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":306,"context_line":"        ref[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":307,"context_line":"        ref[\u0027is_domain\u0027] \u003d is_domain"}],"source_content_type":"text/x-python","patch_set":10,"id":"da20952f_e76b6a1c","line":304,"updated":"2015-09-01 04:02:30.000000000","message":"i think it is unnecessary, domain_id\u003dNone is OK, it will not happen KeyError.\n\nAnd if you add this, why don\u0027t add \u0027if parent_id:\u0027 on line 306, \u0027if is_domain:\u0027 on line 307 and so on","commit_id":"3a280c9ed78ca456a765fbddb19b7e55af94c92d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3cb7250e46610df452df24e98761332d447a8320","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    def new_project_ref(self, domain_id\u003dNone, parent_id\u003dNone, is_domain\u003dFalse):"},{"line_number":303,"context_line":"        ref \u003d self.new_ref()"},{"line_number":304,"context_line":"        if domain_id:"},{"line_number":305,"context_line":"            ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":306,"context_line":"        ref[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":307,"context_line":"        ref[\u0027is_domain\u0027] \u003d is_domain"},{"line_number":308,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_d7becad3","line":305,"updated":"2015-09-02 10:53:47.000000000","message":"To Lei\u0027s comment, this does look an odd change.  I think you are doing it because we know there is a big that we don\u0027t handle it being passed as None.  The question is why do we need this change in this patch.  If your new code breaks without fixing the underlying bug, then you should insert a patch preceding this one that fixes the bug.","commit_id":"c49c4ebf90526297fb37b64965e8af9e550acb38"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fcbfc90f030f543c1f67767eb12bbd127b2ef493","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    def new_project_ref(self, domain_id\u003dNone, parent_id\u003dNone, is_domain\u003dFalse):"},{"line_number":303,"context_line":"        ref \u003d self.new_ref()"},{"line_number":304,"context_line":"        if domain_id:"},{"line_number":305,"context_line":"            ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":306,"context_line":"        ref[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":307,"context_line":"        ref[\u0027is_domain\u0027] \u003d is_domain"},{"line_number":308,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_85ba536d","line":305,"in_reply_to":"da20952f_d7becad3","updated":"2015-09-02 13:45:48.000000000","message":"as discussed in IRC, this is not a bug. We\u0027ve introduced the possibility of None domain_id in this patch and should fix at this one","commit_id":"c49c4ebf90526297fb37b64965e8af9e550acb38"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"61c630c227eba6f74de5b01962946ceadf0e9a26","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                  body\u003d{\u0027project\u0027: ref},"},{"line_number":513,"context_line":"                  expected_status\u003dhttp_client.NOT_IMPLEMENTED)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def test_create_project_without_parent_id_and_domain_id_none(self):"},{"line_number":516,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Grant a domain role for the user"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a1a9d01_45a8a477","line":515,"updated":"2015-10-03 10:17:14.000000000","message":"so is the test meant to be without parent_id or parent_id is None - right now it is the latter","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"72a880d99988b0bbe1389895f3c6e48f61069b82","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                  body\u003d{\u0027project\u0027: ref},"},{"line_number":513,"context_line":"                  expected_status\u003dhttp_client.NOT_IMPLEMENTED)"},{"line_number":514,"context_line":""},{"line_number":515,"context_line":"    def test_create_project_without_parent_id_and_domain_id_none(self):"},{"line_number":516,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":517,"context_line":""},{"line_number":518,"context_line":"        # Grant a domain role for the user"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a2fa921_9648812f","line":515,"in_reply_to":"9a1a9d01_45a8a477","updated":"2015-10-05 18:08:58.000000000","message":"Done","commit_id":"3c64a4b6628ef30bd029f2139eb9e49d0af2ffe1"},{"author":{"_account_id":17123,"name":"Tom Cocozzello (tjcocozz)","email":"tjcocozz@us.ibm.com","username":"tcocozzello"},"change_message_id":"02edab5d6a1e388bbbdb4c2b0c0de359f073cdef","unresolved":false,"context_lines":[{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def test_create_project_with_parent_id_none_and_domain_id_none(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        # Grant a domain role for the user"},{"line_number":515,"context_line":"        collection_url \u003d ("},{"line_number":516,"context_line":"            \u0027/domains/%(domain_id)s/users/%(user_id)s/roles\u0027 % {"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a26ad4f_1a10a64d","line":513,"updated":"2015-10-30 14:30:06.000000000","message":"Remove this blank line (your pep8 failure)","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb1d02c8e8e6d9a3aa8f74d21a7e667db0a06508","unresolved":false,"context_lines":[{"line_number":510,"context_line":""},{"line_number":511,"context_line":"    def test_create_project_with_parent_id_none_and_domain_id_none(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        # Grant a domain role for the user"},{"line_number":515,"context_line":"        collection_url \u003d ("},{"line_number":516,"context_line":"            \u0027/domains/%(domain_id)s/users/%(user_id)s/roles\u0027 % {"}],"source_content_type":"text/x-python","patch_set":25,"id":"fa80f949_69207bf8","line":513,"in_reply_to":"1a26ad4f_1a10a64d","updated":"2015-11-03 16:34:31.000000000","message":"Done","commit_id":"2083de4066cfdddd8c8b0063d21f281ed0610f4b"}]}
