)]}'
{"keystone/resource/backends/ldap.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"352908f93d31a66ca2e755536c396ed87c0ab13d","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def create_project(self, tenant_id, tenant):"},{"line_number":118,"context_line":"        self.project.check_allow_create()"},{"line_number":119,"context_line":"        tenant \u003d self._validate_default_domain(tenant)"},{"line_number":120,"context_line":"        self._validate_parent_project_is_none(tenant)"},{"line_number":121,"context_line":"        tenant[\u0027name\u0027] \u003d clean.project_name(tenant[\u0027name\u0027])"},{"line_number":122,"context_line":"        data \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_ffca156d","side":"PARENT","line":119,"updated":"2015-03-04 14:36:27.000000000","message":"Why is this changing? The existing code seems to think that you have to be using the default domain with this backend and there is nothing in the commit message to indicate why you are changing the behavior.","commit_id":"8846077817defc5c947a0cf2b9eb7c0a360da0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8d77e3cae57b4105a984d314607039747ed6e8d4","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def create_project(self, tenant_id, tenant):"},{"line_number":118,"context_line":"        self.project.check_allow_create()"},{"line_number":119,"context_line":"        tenant \u003d self._validate_default_domain(tenant)"},{"line_number":120,"context_line":"        self._validate_parent_project_is_none(tenant)"},{"line_number":121,"context_line":"        tenant[\u0027name\u0027] \u003d clean.project_name(tenant[\u0027name\u0027])"},{"line_number":122,"context_line":"        data \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7ff38573","side":"PARENT","line":119,"in_reply_to":"9a80dd14_ffca156d","updated":"2015-03-04 14:40:30.000000000","message":"get_domain() from LDAP backend already does this _validate_default_domain() checking. Since we are adding get_domain() in create_project() in the Manager layer, I removed this line since would be double checking the same thing.","commit_id":"8846077817defc5c947a0cf2b9eb7c0a360da0c8"}],"keystone/resource/controllers.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"69667da43d1d5c92c030e4c46611c83db7678de7","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":164,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":165,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":166,"context_line":"            raise exception.ValidationError(str(e))"},{"line_number":167,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_ea6210d8","line":166,"updated":"2015-03-12 01:44:14.000000000","message":"Is the str needed here? If it is you maybe you could use six.text_type so it\u0027s Python 3 friendly.","commit_id":"370a69443f9e8a526f56433c2c4bcd4b2691198f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7703a9a336496c88ea9bb5c71f360d7e5fadd034","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":164,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":165,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":166,"context_line":"            raise exception.ValidationError(str(e))"},{"line_number":167,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_37a39f50","line":166,"in_reply_to":"9a80dd14_ea6210d8","updated":"2015-03-12 12:19:17.000000000","message":"yeah, seems like we can pass \"e\" directly","commit_id":"370a69443f9e8a526f56433c2c4bcd4b2691198f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9c586f3fd7df41e54d77d06079159254cecb2912","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a80dd14_844665be","line":209,"updated":"2015-03-20 16:11:15.000000000","message":"so certainly for users and groups we let the DomainNotFound escape, rather than suppressing it...is there a reason to do it differently here (or maybe you think the users/groups version is wrong!)","commit_id":"0dbe4e9627ad2dd5910561eceecdc0ee386aeef4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6e815d9b21b76e7960c923a92780dbb7acc2d335","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_344f39bf","line":209,"in_reply_to":"9a80dd14_7b2cab02","updated":"2015-03-24 09:54:38.000000000","message":"OK, fair enough","commit_id":"0dbe4e9627ad2dd5910561eceecdc0ee386aeef4"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bc31fc6f4f7e618b564effd5e0440fdf6d795527","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a80dd14_7b2cab02","line":209,"in_reply_to":"9a80dd14_844665be","updated":"2015-03-20 17:01:44.000000000","message":"this was dstanek\u0027s suggestion, I agree with him that this should be a Bad Request, and since we pass the previous exception, the message is also meaningful","commit_id":"0dbe4e9627ad2dd5910561eceecdc0ee386aeef4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"9a6d8626cb7709d0c3fbd783927296c5d46265b6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_4be8b8e2","line":209,"updated":"2015-04-02 18:32:46.000000000","message":"why is the NotFound error gets converted to ValidationError? We don\u0027t do it for other operations, why do it here now?\n\nI looked at the previous comment about domain_id being empty, but that won\u0027t happen.  If the user didn\u0027t specify a domain_id, it will be defaulted to the domain_id in the token, it that is not found it will raise an exception\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/controller.py#L755-L756","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ab3f2f8c3ecebd710385dd9c9b69922b4affffd6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_d3990470","line":209,"in_reply_to":"baa041b7_04804b45","updated":"2015-04-03 12:34:55.000000000","message":"I was working off the old RFC. 400 works for me.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"afc22a443dc6aac757f7f3db6c38e42798738c23","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_4a56405d","line":209,"in_reply_to":"baa041b7_0addd80d","updated":"2015-04-04 19:31:34.000000000","message":"One more thing. should the try-except block move to the Manager instead?  Manager class is responsible for the logic, and the controller is just for pre-processing before forwarding the request to the manager.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"48b99ca59ea4613560a74dd53917bdb680a5ff14","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_04804b45","line":209,"in_reply_to":"baa041b7_22b7c787","updated":"2015-04-03 10:16:45.000000000","message":"There is a good discussion here about which one (400/403) is correct: http://stackoverflow.com/questions/3290182/rest-http-status-codes-for-failed-validation-or-invalid-duplicate\n\nin the new spec, 400 is now described as \"the server cannot or will not process the request due to something that is perceived to be a client error\"\n\nI checked Nova and Cinder, they are both using 400 for invalid request. We should follow that for consistency.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0bbfb7f5bacd7801898e6ef79142c4c62725b1c9","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_deeb5d77","line":209,"in_reply_to":"baa041b7_3bbb7be7","updated":"2015-04-02 22:37:06.000000000","message":"okay. Returning 404 for a POST request doesn\u0027t look right anyway, that standard makes sense.\n\nwhen creating a child project, there is also a validation if the parent_id exists.  This needs to be changed to be more generic exception.NotFound or explicitly add the exceptions.ProjectNotFound.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d025a0e8546296d4dceb5b6f4a23a49a022f48c3","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_3bbb7be7","line":209,"in_reply_to":"baa041b7_4be8b8e2","updated":"2015-04-02 22:06:53.000000000","message":"So I asked the same question...and I think there is a move to make this the standard....what I would like to see are defects raised to fix the other cases when we don\u0027t do this.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"30b0d24fb0bc6d1252e3f9177b6ec5301ee7d39e","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_22b7c787","line":209,"in_reply_to":"baa041b7_671cc4c1","updated":"2015-04-03 06:05:50.000000000","message":"dstanek: I believe it was your suggestion on the ValidationError here.....care to comment?","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"cd675ebbd7b61edf98b045cb542ffd544da584e9","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_8a832804","line":209,"in_reply_to":"baa041b7_8050b95f","updated":"2015-04-04 18:33:43.000000000","message":"Err, thinking about it. It could be fixed here or as follow-up patch since the change in this patch is for Domain checking and may be out of scope. \n\nI am fine either way.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8985226216e7bad53878d2ef0008722baf1dd416","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_0addd80d","line":209,"in_reply_to":"baa041b7_8a832804","updated":"2015-04-04 18:55:39.000000000","message":"+1 will submit the follow up patch","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7666a1f35ea819a2a35d1088a7fb67505987c82e","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_8050b95f","line":209,"in_reply_to":"baa041b7_d3990470","updated":"2015-04-03 16:31:03.000000000","message":"Btw, we still need to catch the ProjectNotFound exception for the case when the client specified a non-existing parent_id","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"8d5a2c617645d0c74e58bd1660b39e62a57e8767","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"baa041b7_671cc4c1","line":209,"in_reply_to":"baa041b7_deeb5d77","updated":"2015-04-03 01:21:20.000000000","message":"A 400 Bad Request response is also incorrect. 400 should only be used when the server can\u0027t interpret the request (e.g., if it\u0027s invalid JSON). A 403 should be used when the server refuses to honor a request.","commit_id":"8527b04f33cb2a5300890b20a2271088ec5befde"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"726258c9fb3878bce69617e12104ece3b1b009a9","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"9aa53dc9_d978e5f4","line":209,"updated":"2015-04-08 18:25:26.000000000","message":"...is this really a validation error?  I know we seem to flogging this particular unfortunate equestrian mammal to death....but we don\u0027t know if domain_id was None (in which case I\u0027d agree with you), or whether it was just, for instance, a valid domain_id five minutes ago, but has since been deleted....\n\nI think that in the project parent patch where we return ValidationError we ONLY do this if the parameter was not specified (i.e. None)...not if simply an invalid ID was defined.\n\nI just think we need to be consistent.","commit_id":"cc6dc35bfe7ca445440ecbfa6b93474dcfa5a091"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"3d8cbac488c05d1f28920e0be2446343f825f1d9","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"},{"line_number":207,"context_line":"                                                   initiator\u003dinitiator)"},{"line_number":208,"context_line":"        except exception.DomainNotFound as e:"},{"line_number":209,"context_line":"            raise exception.ValidationError(e)"},{"line_number":210,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":27,"id":"9aa53dc9_5fcb95a5","line":209,"in_reply_to":"9aa53dc9_d978e5f4","updated":"2015-04-08 19:08:32.000000000","message":"I added a comment on the project patch to also raise a ValidationError for consistency: https://review.openstack.org/#/c/158720/\n\nI think raising ValidationError for both cases it the right approach.  From a client perspective,  I am doing a POST to create a project and returning a 404 response seems off.  Logically, we\u0027re really doing a validation and not a GET (which 404 is more applicable in that case).\n\nShould this try-except move to Manager? I think the logic of translating to ValidationError should be taken care in the Manager class.","commit_id":"cc6dc35bfe7ca445440ecbfa6b93474dcfa5a091"}],"keystone/resource/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"352908f93d31a66ca2e755536c396ed87c0ab13d","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":91,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":94,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":95,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":96,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5f8fa123","line":93,"updated":"2015-03-04 14:36:27.000000000","message":"What happens if no domain_id is specified? I\u0027m guessing a 500 error because SQLAlchemy won\u0027t know what to do with a None.\n\nAlso I think a change is needed in the controller to catch the exception.DomainNoFound and raise an \u0027exception.ValidationError(e)\u0027","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8d77e3cae57b4105a984d314607039747ed6e8d4","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":91,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":94,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":95,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":96,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5f63211a","line":93,"in_reply_to":"9a80dd14_5f8fa123","updated":"2015-03-04 14:40:30.000000000","message":"According to the tests here, will be a DomainNotFound where the domain_id is None.\n\nAgree with transforming into a ValidationError.","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"69667da43d1d5c92c030e4c46611c83db7678de7","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":91,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":94,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":95,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":96,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_8a09942e","line":93,"updated":"2015-03-12 01:44:14.000000000","message":"I think this will cause a 404 instead of a 400 if the domain doesn\u0027t exist","commit_id":"370a69443f9e8a526f56433c2c4bcd4b2691198f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"7703a9a336496c88ea9bb5c71f360d7e5fadd034","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":91,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":94,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":95,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":96,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_b42a2d8e","line":93,"in_reply_to":"9a80dd14_8a09942e","updated":"2015-03-12 12:19:17.000000000","message":"You are right, but do you think it\u0027s necessary to add a check here even with the controller not accepting null values? (the json schema doesn\u0027t allow null values and it sets the domain_id to default if it is null)","commit_id":"370a69443f9e8a526f56433c2c4bcd4b2691198f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"17bec1b2ee671a1f92a93e4413cf9147ff243748","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":91,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":94,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":95,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":96,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a80dd14_c34445b9","line":93,"in_reply_to":"9a80dd14_b42a2d8e","updated":"2015-03-12 12:47:00.000000000","message":"this is the behavior when creating user (it assumes the domain_id is already set): https://github.com/openstack/keystone/blob/master/keystone/identity/controllers.py#L213 and https://github.com/openstack/keystone/blob/master/keystone/identity/core.py#L662-L663","commit_id":"370a69443f9e8a526f56433c2c4bcd4b2691198f"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"3d8cbac488c05d1f28920e0be2446343f825f1d9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":87,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.get_domain(tenant.get(\u0027domain_id\u0027))"},{"line_number":90,"context_line":"        if tenant.get(\u0027parent_id\u0027) is not None:"},{"line_number":91,"context_line":"            parent_ref \u003d self.get_project(tenant.get(\u0027parent_id\u0027))"},{"line_number":92,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":27,"id":"9aa53dc9_dff205d2","line":89,"updated":"2015-04-08 19:08:32.000000000","message":"I am thinking if we should create an _assert_domain() method that raises validation error. That seems like a cleaner way to implement it and consistent with the project check","commit_id":"cc6dc35bfe7ca445440ecbfa6b93474dcfa5a091"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"352908f93d31a66ca2e755536c396ed87c0ab13d","unresolved":false,"context_lines":[{"line_number":1976,"context_line":"                          project[\u0027id\u0027],"},{"line_number":1977,"context_line":"                          project)"},{"line_number":1978,"context_line":""},{"line_number":1979,"context_line":"    def test_create_project_invalid_domain_id(self):"},{"line_number":1980,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1981,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1982,"context_line":"                   # Random domain_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_bf117dae","line":1979,"updated":"2015-03-04 14:36:27.000000000","message":"I think we should make a similar test in the v3 tests that checks for a 400 error.","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8d77e3cae57b4105a984d314607039747ed6e8d4","unresolved":false,"context_lines":[{"line_number":1976,"context_line":"                          project[\u0027id\u0027],"},{"line_number":1977,"context_line":"                          project)"},{"line_number":1978,"context_line":""},{"line_number":1979,"context_line":"    def test_create_project_invalid_domain_id(self):"},{"line_number":1980,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1981,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1982,"context_line":"                   # Random domain_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_5f4a4184","line":1979,"in_reply_to":"9a80dd14_bf117dae","updated":"2015-03-04 14:40:30.000000000","message":"++","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"352908f93d31a66ca2e755536c396ed87c0ab13d","unresolved":false,"context_lines":[{"line_number":1979,"context_line":"    def test_create_project_invalid_domain_id(self):"},{"line_number":1980,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1981,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1982,"context_line":"                   # Random domain_id"},{"line_number":1983,"context_line":"                   \u0027domain_id\u0027: uuid.uuid4().hex,"},{"line_number":1984,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1985,"context_line":"        self.assertRaises(exception.DomainNotFound,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_7fbb85c4","line":1982,"updated":"2015-03-04 14:36:27.000000000","message":"unnecessary comment","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0421f0589afd97cd28223c1259ca74532fb06637","unresolved":false,"context_lines":[{"line_number":1979,"context_line":"    def test_create_project_invalid_domain_id(self):"},{"line_number":1980,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":1981,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":1982,"context_line":"                   # Random domain_id"},{"line_number":1983,"context_line":"                   \u0027domain_id\u0027: uuid.uuid4().hex,"},{"line_number":1984,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1985,"context_line":"        self.assertRaises(exception.DomainNotFound,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a80dd14_02095231","line":1982,"in_reply_to":"9a80dd14_7fbb85c4","updated":"2015-03-04 17:07:50.000000000","message":"Done","commit_id":"060bdd2475678d8e34b9e6050018962d9cea3295"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6e815d9b21b76e7960c923a92780dbb7acc2d335","unresolved":false,"context_lines":[{"line_number":2844,"context_line":"        leaf_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2845,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2846,"context_line":"                        \u0027description\u0027: \u0027\u0027,"},{"line_number":2847,"context_line":"                        \u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":2848,"context_line":"                        \u0027enabled\u0027: True,"},{"line_number":2849,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027]}"},{"line_number":2850,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_3482d994","line":2847,"updated":"2015-03-24 09:54:38.000000000","message":"so this is really a different test...it\u0027s a valid domain, just not the same domain as the parent. (and yes, I know you are testing the straight invalid domain case higher up...but maybe both tests are still valid.","commit_id":"0dbe4e9627ad2dd5910561eceecdc0ee386aeef4"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ba676271294b06a374bbc13fdd0fb0887c154e7f","unresolved":false,"context_lines":[{"line_number":2844,"context_line":"        leaf_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2845,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2846,"context_line":"                        \u0027description\u0027: \u0027\u0027,"},{"line_number":2847,"context_line":"                        \u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":2848,"context_line":"                        \u0027enabled\u0027: True,"},{"line_number":2849,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027]}"},{"line_number":2850,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1a6ced46_59c0662a","line":2847,"in_reply_to":"1a6ced46_3482d994","updated":"2015-03-24 12:26:52.000000000","message":"you are right, going to rename this test","commit_id":"0dbe4e9627ad2dd5910561eceecdc0ee386aeef4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f5c341c04129ff0b33ebc89828abba73f09686ea","unresolved":false,"context_lines":[{"line_number":2829,"context_line":"                          project)"},{"line_number":2830,"context_line":""},{"line_number":2831,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2832,"context_line":"    def test_create_leaf_project_with_invalid_domain(self):"},{"line_number":2833,"context_line":"        root_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2834,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2835,"context_line":"                        \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"baa041b7_c3e7213f","line":2832,"updated":"2015-04-02 11:10:40.000000000","message":"I think we were going to rename this test, no? e.g. someone like\n\ntest_create_leaf_project_with_different_domain()","commit_id":"40cd018799db51f3e425a44e2f4205ba571a4e15"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"5d0c37ad08238a1d55277406bc64fd95e658d1f1","unresolved":false,"context_lines":[{"line_number":2829,"context_line":"                          project)"},{"line_number":2830,"context_line":""},{"line_number":2831,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2832,"context_line":"    def test_create_leaf_project_with_invalid_domain(self):"},{"line_number":2833,"context_line":"        root_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2834,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2835,"context_line":"                        \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"baa041b7_1cec46c6","line":2832,"in_reply_to":"baa041b7_c3e7213f","updated":"2015-04-02 12:40:47.000000000","message":"Ok, I\u0027ll update the test name.","commit_id":"40cd018799db51f3e425a44e2f4205ba571a4e15"}]}
