)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add is_domain field in Project Table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Field to enable the possibility to have a project with the"},{"line_number":10,"context_line":"domain \"feature\"."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":13,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":72,"id":"3a50d1a3_480f2237","line":10,"updated":"2015-07-22 09:57:59.000000000","message":"Maybe reword to: Provide the underpinnings for allowing a project to act as a domain. Subsequent follow-on patches will build on this to provide full domain operations on such projects.","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add is_domain field in Project Table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Field to enable the possibility to have a project with the"},{"line_number":10,"context_line":"domain \"feature\"."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":13,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":72,"id":"3a50d1a3_dc251709","line":10,"in_reply_to":"3a50d1a3_480f2237","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":13,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"},{"line_number":14,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":17,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":72,"id":"3a50d1a3_a8b9067b","line":14,"updated":"2015-07-22 09:57:59.000000000","message":"In this patch I think we are providing manager support for creating a project specifying a parent_id but not a domain_id, but we will leave the controller code in place that requires a domain_id.  This code will be removed once the follow-on patch that ensures all projects are part of hierarchies wis merged (provide link to it...)","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":13,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"},{"line_number":14,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":17,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":72,"id":"3a50d1a3_bc8b6bc2","line":14,"in_reply_to":"3a50d1a3_a8b9067b","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c3a57e3ba084c161460d1e289730971d7104bfa3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add is_domain field in Project Table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Maybe reword to: Provide the underpinnings for allowing a project to act"},{"line_number":10,"context_line":"as a domain. Subsequent follow-on patches will build on this to provide"},{"line_number":11,"context_line":"full domain operations on such projects."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_0cd4aeba","line":9,"updated":"2015-07-22 19:26:39.000000000","message":"I think we can drop the \"maybe reword to:\" bit!!","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c9b7817e33bd8b09be95517c88c0c692ec4b2654","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add is_domain field in Project Table"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Maybe reword to: Provide the underpinnings for allowing a project to act"},{"line_number":10,"context_line":"as a domain. Subsequent follow-on patches will build on this to provide"},{"line_number":11,"context_line":"full domain operations on such projects."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_bf4a7a24","line":9,"in_reply_to":"3a50d1a3_0cd4aeba","updated":"2015-07-22 19:38:34.000000000","message":"hahaha. Kind of agree","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c3a57e3ba084c161460d1e289730971d7104bfa3","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":14,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"},{"line_number":15,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_6c91b2f0","line":15,"updated":"2015-07-22 19:26:39.000000000","message":"I suggest we drop this paragraph - it feels too low level to be in a commit comment and this explanation should be covered in the docstrings or comments in the code.","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c9b7817e33bd8b09be95517c88c0c692ec4b2654","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Projects with is_domain\u003dtrue will have the parent_id\u003ddomain_id, while"},{"line_number":14,"context_line":"projects with is_domain\u003dfalse will have the domain_id set to the id of"},{"line_number":15,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_3f33caac","line":15,"in_reply_to":"3a50d1a3_6c91b2f0","updated":"2015-07-22 19:38:34.000000000","message":"Done","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c3a57e3ba084c161460d1e289730971d7104bfa3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"},{"line_number":19,"context_line":"requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":20,"context_line":"that ensures all projects are part of hierarchies was merged:"},{"line_number":21,"context_line":"https://review.openstack.org/#/c/143763/"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_ccafa628","line":18,"updated":"2015-07-22 19:26:39.000000000","message":"s/We leave/However, we leave/","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c9b7817e33bd8b09be95517c88c0c692ec4b2654","unresolved":false,"context_lines":[{"line_number":15,"context_line":"the closest is_domain\u003dTrue project upwards in its tree."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"},{"line_number":19,"context_line":"requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":20,"context_line":"that ensures all projects are part of hierarchies was merged:"},{"line_number":21,"context_line":"https://review.openstack.org/#/c/143763/"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_3f8f4a2b","line":18,"in_reply_to":"3a50d1a3_ccafa628","updated":"2015-07-22 19:38:34.000000000","message":"Done","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"c3a57e3ba084c161460d1e289730971d7104bfa3","unresolved":false,"context_lines":[{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"},{"line_number":19,"context_line":"requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":20,"context_line":"that ensures all projects are part of hierarchies was merged:"},{"line_number":21,"context_line":"https://review.openstack.org/#/c/143763/"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_ecb38298","line":20,"updated":"2015-07-22 19:26:39.000000000","message":"s/was merged/is merged/","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"c9b7817e33bd8b09be95517c88c0c692ec4b2654","unresolved":false,"context_lines":[{"line_number":17,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":18,"context_line":"parent_id but not a domain_id. We leave the controller code in place that"},{"line_number":19,"context_line":"requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":20,"context_line":"that ensures all projects are part of hierarchies was merged:"},{"line_number":21,"context_line":"https://review.openstack.org/#/c/143763/"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":73,"id":"3a50d1a3_df7f4615","line":20,"in_reply_to":"3a50d1a3_ecb38298","updated":"2015-07-22 19:38:34.000000000","message":"Done","commit_id":"347eb4e58811347ad8a333d01de94432bf6dd864"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6239f7dc031e509a50e5b45f740eaab833240118","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":14,"context_line":"parent_id but not a domain_id. However, we leave the controller code in place"},{"line_number":15,"context_line":"that requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":16,"context_line":"that ensures all projects are part of hierarchies is merged:"},{"line_number":17,"context_line":"https://review.openstack.org/#/c/143763/"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":90,"id":"1a4dcd0f_14bac10a","line":15,"updated":"2015-08-11 07:51:49.000000000","message":"I think you have changed this now...and this patch DOES update the controller to no longer require a domain ID.","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"35185041a65c1156ae494c1fee6702564f90c0ac","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"In this patch we provide manager support for creating a project specifying a"},{"line_number":14,"context_line":"parent_id but not a domain_id. However, we leave the controller code in place"},{"line_number":15,"context_line":"that requires a domain_id. This code will be removed once the follow-on patch"},{"line_number":16,"context_line":"that ensures all projects are part of hierarchies is merged:"},{"line_number":17,"context_line":"https://review.openstack.org/#/c/143763/"},{"line_number":18,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":90,"id":"1a4dcd0f_61ffb701","line":15,"in_reply_to":"1a4dcd0f_14bac10a","updated":"2015-08-11 15:27:36.000000000","message":"Done","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4c5b1c715729644dceea9ade626282b5cf872158","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_3d945d41","line":17,"updated":"2015-08-11 17:41:38.000000000","message":"will it be removed? Surely if neither domain_id or parent_id is specified we\u0027ll still \"normalise\" it (i.e. try end get it from the token)? It won\u0027t be a requirement to provide parent_id...","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cc831ebad86e4444d35bfb98f66c936843f8e499","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_83b8b476","line":17,"in_reply_to":"1a4dcd0f_3d945d41","updated":"2015-08-11 18:24:51.000000000","message":"for is_domain projects we do nothing. For regular projects we throw an exception if both aren\u0027t provided.","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bd930d696a4677b7380511551fe9257b8803f728","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_f1d5bee4","line":17,"in_reply_to":"1a4dcd0f_660c96ec","updated":"2015-08-11 19:01:20.000000000","message":"ok... just remembered why we can\u0027t do this. If it is a regular project we haven\u0027t provided the domain_id, we can\u0027t use the domain in the token or the default domain since we will need to check the next \"valid\" domain - find_domain_id() in the resource/core.py here: https://review.openstack.org/#/c/143763/","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bd5060a791b4bdf9d1227ecc7f109314cb823f51","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_c6d6ca4e","line":17,"in_reply_to":"1a4dcd0f_83b8b476","updated":"2015-08-11 18:33:24.000000000","message":"not sure I follow that logic....if it is a regular project I can supply either, both or none (and in the last case we\u0027ll look in the token)....no?","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1ebab6197afb294ce1a3107d8160984c04fef8b0","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_660c96ec","line":17,"in_reply_to":"1a4dcd0f_c6d6ca4e","updated":"2015-08-11 18:37:55.000000000","message":"makes sense... thought we would remove the normalize_domain_id() call, but it seems to be a break of contract as well.","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ed3720e99a08de4d4e3122e4e66cf97a4a30df1f","unresolved":false,"context_lines":[{"line_number":14,"context_line":"specifying a parent_id but not a domain_id. However, in the"},{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":91,"id":"1a4dcd0f_9818df1f","line":17,"in_reply_to":"1a4dcd0f_f1d5bee4","updated":"2015-08-12 20:43:57.000000000","message":"Nope, still don\u0027t understand this.  Are we saying that reseller breaks the current contract (I hope not). Ignore the default domain fall back - that\u0027s really a \"bug\".....why would we not use the domain Id in the token (or the project_id of a project acting as a domain) if the caller did not provide a domain_id in the entity in the create request","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d88b05464bf54c7f1f0d37c04f273fe88aa013b4","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_58a337b2","line":18,"updated":"2015-08-12 20:45:26.000000000","message":"Nope, still don\u0027t understand this. Are we saying that reseller breaks the current contract (I hope not). Ignore the default domain fall back - that\u0027s really a \"bug\".....why would we not use the domain Id in the token (or the project_id of a project acting as a domain) if the caller did not provide a domain_id in the entity in the create request","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6f0e777b99b7653fc8f491413055028bffe18cea","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_e95820fb","line":18,"in_reply_to":"1a4dcd0f_13eb3b14","updated":"2015-08-13 09:38:39.000000000","message":"Rodrigo - no, today, you can create a regular project by using a domain scoped token as the indicator the the domain in which to place that project.\n\nAlso remember the fallback to the domain default is now deprecated (at least it will be when I get my patch in!)","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1557ec15be3fcfeb13f5fe42ef994af5ca233034","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_f95f89e2","line":18,"in_reply_to":"1a4dcd0f_24062f86","updated":"2015-08-13 11:17:20.000000000","message":"So I agree that\u0027s what we are saying. However, what I am worried about is whether it is obvious to a caller....think of this situation.  Imagine I have a 3 level hierarchy of projects acting as a domain...and I\u0027m creating projects below the bottom domain.  When I create a regular project, I know I can leave out the domain_id and parent_id and the domain will be picked up from the token.  However, if I then want to create another sub-domain, I might easily think that all I do is set is_domain\u003dTrue in a new entity (and leave the domain_id and parent_id empty) just like I did with a regular project.  But that\u0027s not what will happen...I just created a root level domain, not a sub-domain.\n\nI\u0027m not sure I have an answer for this.","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f9391de2c4b2710315214b80e232f71dd70e14e3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_8a9161f3","line":18,"in_reply_to":"1a4dcd0f_58a337b2","updated":"2015-08-13 00:19:39.000000000","message":"hmm... just realized that we could use the domain_id from the token if both parent_id and domain weren\u0027t provided. Let\u0027s analyze the 6 cases:\n\n  is_domain \u003d True\n\n* domain_id \u003d None, parent_id \u003d None -\u003e valid\n* domain_id \u003d X, parent_id \u003d None -\u003e parent_id should be set to X\n* domain_id \u003d None, parent_id \u003d X -\u003e domain_id should be set to X\n\n  is_domain \u003d False\n\n* domain_id \u003d None, parent_id \u003d None -\u003e domain_id should be set to the one in the token and the parent_id should be the equal to the domain_id\n* domain_id \u003d X, parent_id \u003d None -\u003e parent_id should be set to X\n* domain_id \u003d None, parent_id \u003d X -\u003e domain_id should be set to X if the parent acts as a domain, or to X\u0027s domain_id if it is regular project\n\nMakes sense?","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fa96b99dd66cfde8bbc9a167bebe70a402e70133","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_941743a2","line":18,"in_reply_to":"1a4dcd0f_8a9161f3","updated":"2015-08-13 01:59:14.000000000","message":"++Rodrigo. Except for one case, the one with is_Domain\u003dFalse and no parent or domain_id were set. We have two cases: One if it is a domain scoped token or a project that acts as a domain scoped token... In this case we can easily get the domain_id. What if it\u0027s not a project acting as a domain? Should we raise an error or use its domain_id, setting the project as child of the one in the token?","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6f0e777b99b7653fc8f491413055028bffe18cea","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_a9a0d890","line":18,"in_reply_to":"1a4dcd0f_8a9161f3","updated":"2015-08-13 09:38:39.000000000","message":"So I agree with all that.....one issue is....How do I create a top level project acting as as a domain?  I don\u0027t want the domain to be filled in from the token...because I don\u0027t want it to be in any domain?  Is the fact that I have specified (explicitly) parent_id \u003d None in the entity enough?  What if I just leave parent_id out of the entity?  Does that mean use the domain from the token...or does it mean give me a root project acting as a domain?","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a2c6936218d99eea4b5dc026381ef3d45e49d9ca","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_13eb3b14","line":18,"in_reply_to":"1a4dcd0f_941743a2","updated":"2015-08-13 08:53:20.000000000","message":"if I have a domain scoped token, won\u0027t it always be a project acting as a domain?\n\nIf I have a project scoped token, the fallback is the domain default","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a19cf770938a26080a097eaf0350f5b2ffad13c5","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_24062f86","line":18,"in_reply_to":"1a4dcd0f_a9a0d890","updated":"2015-08-13 10:04:33.000000000","message":"Didn\u0027t fully get it... But for projects acting as a domain, if I pass parent_id \u003d None and domain_id \u003d None, neither of them are going to be replaced and it will be a \"root project\".","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"edd9d7af33b01d465d40bd47343831d243dfa963","unresolved":false,"context_lines":[{"line_number":15,"context_line":"controller layer we still normalize the domain_id if no"},{"line_number":16,"context_line":"parent_id or domain_id were provided. This code will be removed"},{"line_number":17,"context_line":"once the follow-on patch that ensures all projects are part of"},{"line_number":18,"context_line":"hierarchies is merged: https://review.openstack.org/#/c/143763/"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":21,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":94,"id":"1a4dcd0f_4d4277ac","line":18,"in_reply_to":"1a4dcd0f_f95f89e2","updated":"2015-08-13 12:48:28.000000000","message":"More that I think about this, I believe we should raise an error if both parent_id and domain_id are not provided for regular projects - with reseller, we don\u0027t have anymore the \"container\" ownership between domains and projects, we now have a hierarchy and doesn\u0027t seem natural to create a project below another one just by using the token information.\n\nTrying to always not break tiny API contracts and doing too much hacks to work alongside them is making features like Reseller impracticable. We end by adding new features with really bad UX - no one uses something with bad UX.\n\n(just make clear that I\u0027m agreeing with you, and we might end by using this solution with bad UX you highlighted in your comment)","commit_id":"fe07d67f0b17b12c4c0fd85275be345f0c322260"}],"keystone/assignment/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"ad2e56d58d8f6fa44b342e0b1ce47defd92a6162","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_d48aab63","line":620,"updated":"2015-08-07 01:57:51.000000000","message":"either the interface is stable and we can\u0027t add a new required parameter or it\u0027s unstable and there\u0027s no need for it to be deprecated.\n\nMy opinion is the interface is unstable, see https://review.openstack.org/#/c/210174/","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"908ae2ad69d8778aa2d821d45a8d85d13807dafc","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_e48d902b","line":620,"in_reply_to":"1a4dcd0f_81e35e05","updated":"2015-08-12 12:57:08.000000000","message":"yes, we set to False in the patchset 86","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fc4491c03696ee5c77ed44caa3f363f5d07c9615","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_ea5eb778","line":620,"in_reply_to":"1a4dcd0f_81e35e05","updated":"2015-08-07 19:47:32.000000000","message":"yes... we\u0027ve already changed it in patch set 86","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"50da4321c517e96b804ebf058484eb986fde5668","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_d9ac0da1","line":620,"in_reply_to":"1a4dcd0f_d48aab63","updated":"2015-08-07 12:45:04.000000000","message":"I agree with you. so what do we do now? would we need your patch merged to get this one moving forward?","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95e42381b2bb53dce601c4e548e4af25954d968e","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_81e35e05","line":620,"in_reply_to":"1a4dcd0f_d9ac0da1","updated":"2015-08-07 18:31:40.000000000","message":"Why does this parameter need to be required now? According to the model this defaults to False.","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"890d4bf5ed91d50e4fa3529426e1e1ae47cf90e1","unresolved":false,"context_lines":[{"line_number":617,"context_line":"        return self.resource_api.create_project(project_id, project)"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @deprecated_to_resource_api"},{"line_number":620,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain):"},{"line_number":621,"context_line":"        return self.resource_api.get_project_by_name("},{"line_number":622,"context_line":"            tenant_name, domain_id, is_domain)"},{"line_number":623,"context_line":""}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_a1b45a82","line":620,"in_reply_to":"1a4dcd0f_d9ac0da1","updated":"2015-08-07 18:18:51.000000000","message":"turns out that this change is unnecessary","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"}],"keystone/common/sql/migrate_repo/versions/067_add_is_domain_project.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"343c551ac9bd82de6bc5f4e379576f3017879d8b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    orig_project_table.drop()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"def downgrade(migrate_engine):"},{"line_number":87,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":88,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"baa041b7_c5aa8c70","line":86,"updated":"2015-04-02 09:11:30.000000000","message":"don\u0027t need this anymore","commit_id":"7432fd4b5893db6f0c978250a60b86ee792236a0"}],"keystone/common/sql/migrate_repo/versions/068_add_is_domain_project.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":17,"context_line":"_ORIG_PROJECT_TABLE_NAME \u003d \u0027orig_project\u0027"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_1e3b059e","line":14,"updated":"2015-04-02 22:23:49.000000000","message":"extra space after this one?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":17,"context_line":"_ORIG_PROJECT_TABLE_NAME \u003d \u0027orig_project\u0027"},{"line_number":18,"context_line":"_IS_DOMAIN_COLUMN_NAME \u003d \u0027is_domain\u0027"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_7e0451bf","line":16,"updated":"2015-04-02 22:23:49.000000000","message":"seems not used, is there going to be a revision to this patch later?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":17,"context_line":"_ORIG_PROJECT_TABLE_NAME \u003d \u0027orig_project\u0027"},{"line_number":18,"context_line":"_IS_DOMAIN_COLUMN_NAME \u003d \u0027is_domain\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_de291d39","line":17,"updated":"2015-04-02 22:23:49.000000000","message":"same here, not used","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_DOMAIN_TABLE_NAME \u003d \u0027domain\u0027"},{"line_number":17,"context_line":"_ORIG_PROJECT_TABLE_NAME \u003d \u0027orig_project\u0027"},{"line_number":18,"context_line":"_IS_DOMAIN_COLUMN_NAME \u003d \u0027is_domain\u0027"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_378f4325","line":17,"in_reply_to":"baa041b7_de291d39","updated":"2015-04-06 17:25:22.000000000","message":"We removed the downgrade and forget remove this constants, I\u0027ll fix this.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"}],"keystone/common/sql/migrate_repo/versions/073_add_is_domain_project.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"daf88e0e223a26c6b0500cd6e5935423145c9a78","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    is_domain \u003d sql.Column(_IS_DOMAIN_COLUMN_NAME, sql.Boolean, nullable\u003dFalse,"},{"line_number":25,"context_line":"                           server_default\u003d\u00270\u0027, default\u003dFalse)"},{"line_number":26,"context_line":"    project_table.create_column(is_domain)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_7f49f98a","line":25,"updated":"2015-04-13 17:33:18.000000000","message":"out of interest, what is it we are achieving with server_default here?","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"2bead8377d4515a952ce574ac1242e7b987d2d53","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    is_domain \u003d sql.Column(_IS_DOMAIN_COLUMN_NAME, sql.Boolean, nullable\u003dFalse,"},{"line_number":25,"context_line":"                           server_default\u003d\u00270\u0027, default\u003dFalse)"},{"line_number":26,"context_line":"    project_table.create_column(is_domain)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_cd0500c3","line":25,"in_reply_to":"7aaa499b_6a8a55c1","updated":"2015-04-13 19:10:36.000000000","message":"Hum... Now I remember why, without this we got a error: sqlalchemy.exc.OperationalError: (OperationalError) Cannot add a NOT NULL column with default value NULL u\u0027\\nALTER TABLE project ADD is_domain BOOLEAN NOT NULL\u0027 ()\n\nAnd I don\u0027t know why we have this error, since we have set the default value.","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"a72750eaf9d06af973e72167a592fae6043514ee","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    project_table \u003d sql.Table(_PROJECT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"    is_domain \u003d sql.Column(_IS_DOMAIN_COLUMN_NAME, sql.Boolean, nullable\u003dFalse,"},{"line_number":25,"context_line":"                           server_default\u003d\u00270\u0027, default\u003dFalse)"},{"line_number":26,"context_line":"    project_table.create_column(is_domain)"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_6a8a55c1","line":25,"in_reply_to":"7aaa499b_7f49f98a","updated":"2015-04-13 18:17:16.000000000","message":"In fact, I think that I\u0027m just following other similar migration script and I saw this but I think that we can remove.","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_IS_DOMAIN_COLUMN_NAME \u003d \u0027is_domain\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_55f86ae5","line":13,"updated":"2015-04-17 17:26:01.000000000","message":"(nit) should be an extra newline here","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":10,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import sqlalchemy as sql"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"},{"line_number":16,"context_line":"_IS_DOMAIN_COLUMN_NAME \u003d \u0027is_domain\u0027"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_d5035a0e","line":13,"in_reply_to":"3ab451fb_55f86ae5","updated":"2015-04-17 17:44:26.000000000","message":"Done","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"}],"keystone/resource/backends/ldap.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _validate_is_domain_project_is_false(self, ref):"},{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027Domains are read-only against LDAP\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _set_default_attributes(self, project_ref):"},{"line_number":88,"context_line":"        project_ref \u003d self._set_default_domain(project_ref)"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_ee2685b9","line":85,"updated":"2015-04-02 15:34:02.000000000","message":"although technically accurate, this isn\u0027t a very helpful description or what the user has done wrong...","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _validate_is_domain_project_is_false(self, ref):"},{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027Domains are read-only against LDAP\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _set_default_attributes(self, project_ref):"},{"line_number":88,"context_line":"        project_ref \u003d self._set_default_domain(project_ref)"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_37bce36b","line":85,"in_reply_to":"baa041b7_ee2685b9","updated":"2015-04-06 17:25:22.000000000","message":"Ok, I\u0027ll rephrase this sentence.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":149,"context_line":"        self.project.check_allow_update()"},{"line_number":150,"context_line":"        tenant \u003d self._validate_default_domain(tenant)"},{"line_number":151,"context_line":"        if \u0027name\u0027 in tenant:"},{"line_number":152,"context_line":"            tenant[\u0027name\u0027] \u003d clean.project_name(tenant[\u0027name\u0027])"},{"line_number":153,"context_line":"        return self._set_default_attributes("}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_080d203e","line":150,"updated":"2015-04-02 15:34:02.000000000","message":"do you need to check is_domain here....? or at least pop it?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":149,"context_line":"        self.project.check_allow_update()"},{"line_number":150,"context_line":"        tenant \u003d self._validate_default_domain(tenant)"},{"line_number":151,"context_line":"        if \u0027name\u0027 in tenant:"},{"line_number":152,"context_line":"            tenant[\u0027name\u0027] \u003d clean.project_name(tenant[\u0027name\u0027])"},{"line_number":153,"context_line":"        return self._set_default_attributes("}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_7706eb21","line":150,"in_reply_to":"baa041b7_080d203e","updated":"2015-04-06 17:25:22.000000000","message":"You\u0027re right, we need pop this information as we did in create_project.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027LDAP does not support project with \u0027"},{"line_number":86,"context_line":"                                        \u0027is_domain flag enabled\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _set_default_attributes(self, project_ref):"},{"line_number":89,"context_line":"        project_ref \u003d self._set_default_domain(project_ref)"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_e0cd77b8","line":86,"updated":"2015-07-04 15:01:05.000000000","message":"maybe slight improvement in the wording, perhaps: \"LDAP does not support projects with....\"","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027LDAP does not support project with \u0027"},{"line_number":86,"context_line":"                                        \u0027is_domain flag enabled\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _set_default_attributes(self, project_ref):"},{"line_number":89,"context_line":"        project_ref \u003d self._set_default_domain(project_ref)"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_729a79c7","line":86,"in_reply_to":"ba3cc151_e0cd77b8","updated":"2015-07-06 17:21:31.000000000","message":"Done","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        elif isinstance(ref, list):"},{"line_number":69,"context_line":"            return [self._set_default_is_domain_project(x) for x in ref]"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            raise ValueError(_(\u0027Expected dict or list: %s\u0027) % type(ref))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _validate_parent_project_is_none(self, ref):"},{"line_number":74,"context_line":"        \"\"\"If a parent_id different from None was given,"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_e04a625b","line":71,"updated":"2015-07-09 23:26:42.000000000","message":"Is this message targeted at developers or users? If it\u0027s for users we probably don\u0027t want it to have something like: \"\u003ctype \u0027something\u0027\u003e\" in the message.","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        elif isinstance(ref, list):"},{"line_number":69,"context_line":"            return [self._set_default_is_domain_project(x) for x in ref]"},{"line_number":70,"context_line":"        else:"},{"line_number":71,"context_line":"            raise ValueError(_(\u0027Expected dict or list: %s\u0027) % type(ref))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _validate_parent_project_is_none(self, ref):"},{"line_number":74,"context_line":"        \"\"\"If a parent_id different from None was given,"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_e9600d10","line":71,"in_reply_to":"ba3cc151_e04a625b","updated":"2015-07-10 01:12:58.000000000","message":"it\u0027s for developers, I guess. same behavior as the method above","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _validate_is_domain_project_is_false(self, ref):"},{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027LDAP does not support projects with \u0027"},{"line_number":86,"context_line":"                                        \u0027is_domain flag enabled\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _set_default_attributes(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_8091169d","line":85,"updated":"2015-07-09 23:26:42.000000000","message":"Is this really a Forbidden operation? Feels more like a validation error. Forbidden errors are usually associated with the server denying a client request because of credential or other auth issues: https://tools.ietf.org/html/rfc7231#section-6.5.3","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _validate_is_domain_project_is_false(self, ref):"},{"line_number":83,"context_line":"        is_domain \u003d ref.get(\u0027is_domain\u0027)"},{"line_number":84,"context_line":"        if is_domain:"},{"line_number":85,"context_line":"            raise exception.Forbidden(_(\u0027LDAP does not support projects with \u0027"},{"line_number":86,"context_line":"                                        \u0027is_domain flag enabled\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def _set_default_attributes(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_c99bc965","line":85,"in_reply_to":"ba3cc151_8091169d","updated":"2015-07-10 01:12:58.000000000","message":"you\u0027re right. I\u0027ll fix this here: https://review.openstack.org/#/c/200295/1","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique. We can not have two"},{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_e8867cb8","line":262,"updated":"2015-04-02 15:34:02.000000000","message":"true..not quite sure of the relevance here...","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique. We can not have two"},{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_97516f65","line":262,"in_reply_to":"baa041b7_3594b189","updated":"2015-04-06 17:25:22.000000000","message":"This is unrelated change, I\u0027ll send this for the next patch.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f084edf723a74cb4439af50d2f63afa3fda0dd2c","unresolved":false,"context_lines":[{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique. We can not have two"},{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_3594b189","line":262,"in_reply_to":"baa041b7_e8867cb8","updated":"2015-04-02 17:29:45.000000000","message":"maybe this is meant to be in the follow on patch where add is_domain to the uniquecontraint?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_28a46455","line":264,"updated":"2015-04-02 15:34:02.000000000","message":"is this being changed?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_577407fc","line":264,"in_reply_to":"baa041b7_28a46455","updated":"2015-04-06 17:25:22.000000000","message":"This is a unrelated change, we change this in the next patch.\n\nIt\u0027s a lot of patches, sometimes it\u0027s difficult to separate the modifications between then. Sorry about that.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"7309bca8ca3ed9925e56c8a15c2fd790a5f23bec","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique."},{"line_number":261,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":42,"id":"9aa53dc9_c60c9d3d","line":258,"updated":"2015-04-08 09:58:51.000000000","message":"server_default was added in migration script but missed here. See traceback from models and migrations comparison - http://paste.openstack.org/show/200281/","commit_id":"cd5e39945d04887093a876333f5230975d2ed953"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"f44261ceb504b4c3cd9f0edf44171fa5e6c4c8c8","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique."},{"line_number":261,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"}],"source_content_type":"text/x-python","patch_set":42,"id":"9aa53dc9_08e4c738","line":258,"in_reply_to":"9aa53dc9_c60c9d3d","updated":"2015-04-08 14:35:54.000000000","message":"Done","commit_id":"cd5e39945d04887093a876333f5230975d2ed953"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"310639801b7919a4ab3d4a87f6002803130a6975","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":250,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":251,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"},{"line_number":252,"context_line":"                           nullable\u003dFalse)"},{"line_number":253,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":254,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":255,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_c4cab94f","line":252,"updated":"2015-07-20 14:47:39.000000000","message":"I think this becomes nullable...","commit_id":"d9fa302b041a334f5f764a6c7d015d4e3e69f07e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"32e1bb5a8c601c9121fdae09af1ee861754e1bf7","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":250,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":251,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"},{"line_number":252,"context_line":"                           nullable\u003dFalse)"},{"line_number":253,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":254,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":255,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_7d7ecce5","line":252,"in_reply_to":"3a50d1a3_c4cab94f","updated":"2015-07-20 16:47:26.000000000","message":"it is done in the next patch (Change project name constraint)","commit_id":"d9fa302b041a334f5f764a6c7d015d4e3e69f07e"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"5ed0b340a5d75867485cd10b1917525212d3de6b","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":250,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":251,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"},{"line_number":252,"context_line":"                           nullable\u003dFalse)"},{"line_number":253,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":254,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":255,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":90,"id":"1a4dcd0f_731cd66a","line":252,"updated":"2015-08-08 06:00:04.000000000","message":"based on the schema update, this should change to nullable, for the case when domain-aware projects are created at root\n\nadd migration script too?","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"af0635647c3c43a6f893efeb6969a7b00231e7aa","unresolved":false,"context_lines":[{"line_number":249,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":250,"context_line":"    name \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":251,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"},{"line_number":252,"context_line":"                           nullable\u003dFalse)"},{"line_number":253,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":254,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":255,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":90,"id":"1a4dcd0f_59cf74b3","line":252,"in_reply_to":"1a4dcd0f_731cd66a","updated":"2015-08-08 16:37:44.000000000","message":"at this point, we only receive domain_id as null, but we don\u0027t store it as null. this storage is only done from this patch: https://review.openstack.org/#/c/143763/7 and the migration is done in this one: https://review.openstack.org/#/c/158372/ which treats the project name constraints, involving the null domain_id","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"}],"keystone/resource/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"daf88e0e223a26c6b0500cd6e5935423145c9a78","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":216,"context_line":"            # TODO(rodrigods): The parent_id must be present in this point, if"},{"line_number":217,"context_line":"            # not provided by the user, we set it to the same value as the"},{"line_number":218,"context_line":"            # domain_id"},{"line_number":219,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":220,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_ff4bc9ae","line":217,"updated":"2015-04-13 17:33:18.000000000","message":"where do we do we set this?","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"f44a14c47c0004246000ad68b10fcc4ce512dc17","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":216,"context_line":"            # TODO(rodrigods): The parent_id must be present in this point, if"},{"line_number":217,"context_line":"            # not provided by the user, we set it to the same value as the"},{"line_number":218,"context_line":"            # domain_id"},{"line_number":219,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":220,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":46,"id":"3ab451fb_24ca5da2","line":217,"in_reply_to":"7aaa499b_d75eb1e8","updated":"2015-04-17 13:27:27.000000000","message":"In fact, we can only do this after the patch: Honor domain operations in project table, when Keystone knows find a domain in the project table, before this, we will get a ProjectNotFound error.\n\nMaybe I can put this in the TODO message, to make this more clear.","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"a72750eaf9d06af973e72167a592fae6043514ee","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":216,"context_line":"            # TODO(rodrigods): The parent_id must be present in this point, if"},{"line_number":217,"context_line":"            # not provided by the user, we set it to the same value as the"},{"line_number":218,"context_line":"            # domain_id"},{"line_number":219,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":220,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_d75eb1e8","line":217,"in_reply_to":"7aaa499b_ff4bc9ae","updated":"2015-04-13 18:17:16.000000000","message":"I\u0027ll do this todo, right now :P","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            return project_ref"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":212,"context_line":"        if \u0027is_domain\u0027 in ref and ref[\u0027is_domain\u0027]:"},{"line_number":213,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_b74c3771","line":212,"updated":"2015-05-01 13:56:30.000000000","message":"couldn\u0027t this just be changed to: \n\n    if ref.get(\u0027is_domain\u0027):\n\nthen we should only be executing the def _normalize_is_domain_project_domain_id method \nwhen \u0027is_domain\u0027 is True, right?","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            return project_ref"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":212,"context_line":"        if \u0027is_domain\u0027 in ref and ref[\u0027is_domain\u0027]:"},{"line_number":213,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_9816e7a5","line":212,"in_reply_to":"3acd31a7_b74c3771","updated":"2015-05-04 13:59:48.000000000","message":"Yes. I\u0027ll update the code.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"95adb271640e2e2e736f5ca0a262c55b9acde435","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":216,"context_line":"            # TODO(rodrigods): The parent_id must be present in this point, if"},{"line_number":217,"context_line":"            # not provided by the user, we set it to the same value as the"},{"line_number":218,"context_line":"            # domain_id"},{"line_number":219,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_af377be2","line":216,"updated":"2015-05-01 01:35:22.000000000","message":"what is the TODO here?   It looks like just a note.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":216,"context_line":"            # TODO(rodrigods): The parent_id must be present in this point, if"},{"line_number":217,"context_line":"            # not provided by the user, we set it to the same value as the"},{"line_number":218,"context_line":"            # domain_id"},{"line_number":219,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_1892d757","line":216,"in_reply_to":"3acd31a7_af377be2","updated":"2015-05-04 13:59:48.000000000","message":"We will remove this TODO, we already discuss this in a previous patch. thanks.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bd4d8f4447e8fcf42da42d59703c746dd44e442b","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        def _normalize_is_domain_project_domain_id(self, project_ref):"},{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Cannot set domain_id for projects with the \u0027"},{"line_number":205,"context_line":"                        \u0027is_domain feature enabled.\u0027)"},{"line_number":206,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            project_ref[\u0027domain_id\u0027] \u003d project_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":56,"id":"1aca2d91_f02e34f9","line":205,"updated":"2015-05-07 16:25:43.000000000","message":"super big nit: we could add the project id in here: \n\n    \u0027Project %s is already a domain, unable to assign domain ID\u0027 % project[\u0027id\u0027] \n\nor something like that.\n\nThis could be done in a subsequent patch.","commit_id":"2fbdb740d06fd59f5293b613dfa58b38503d978d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"},{"line_number":206,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            project_ref[\u0027domain_id\u0027] \u003d project_ref[\u0027id\u0027]"},{"line_number":209,"context_line":"            return project_ref"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_203b5f9e","line":206,"updated":"2015-07-04 15:01:05.000000000","message":"So I assume the rule is that projects acting as a domain have their project_id and domain_id to be the same? Does this check mean that the caller can\u0027t set the themselves but must (just for projects acting as a domain) leave domain_id unset?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"},{"line_number":206,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"            project_ref[\u0027domain_id\u0027] \u003d project_ref[\u0027id\u0027]"},{"line_number":209,"context_line":"            return project_ref"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_92edbd27","line":206,"in_reply_to":"ba3cc151_203b5f9e","updated":"2015-07-06 17:21:31.000000000","message":"Yes, that\u0027s it. If it is a subdomain, the parent domain must be identified by parent_id.","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    @controller.protected()"},{"line_number":200,"context_line":"    @validation.validated(schema.project_create, \u0027project\u0027)"},{"line_number":201,"context_line":"    def create_project(self, context, project):"},{"line_number":202,"context_line":"        def _normalize_is_domain_project_domain_id(self, project_ref):"},{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_e034a2ad","line":202,"updated":"2015-07-09 23:26:42.000000000","message":"Is there any reason why this logic isn\u0027t part of the manager?","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3c446b1b827437c8ac9c11dc94a8319cb74aaf24","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    @controller.protected()"},{"line_number":200,"context_line":"    @validation.validated(schema.project_create, \u0027project\u0027)"},{"line_number":201,"context_line":"    def create_project(self, context, project):"},{"line_number":202,"context_line":"        def _normalize_is_domain_project_domain_id(self, project_ref):"},{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_4ff7b959","line":202,"in_reply_to":"ba3cc151_09bf7161","updated":"2015-07-10 02:42:18.000000000","message":"No, I mean since this isn\u0027t really web logic why not put it in the manager?","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"338cbac6c57f3bb9a36f6c48f726d3cceff5c6e2","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    @controller.protected()"},{"line_number":200,"context_line":"    @validation.validated(schema.project_create, \u0027project\u0027)"},{"line_number":201,"context_line":"    def create_project(self, context, project):"},{"line_number":202,"context_line":"        def _normalize_is_domain_project_domain_id(self, project_ref):"},{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_5a1535e3","line":202,"in_reply_to":"ba3cc151_4ff7b959","updated":"2015-07-10 02:59:35.000000000","message":"Since _normalize_domain_id is called here, we kust kept doing the same domain_id treatment here, this time for the is_domain\u003dtrue projects","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    @controller.protected()"},{"line_number":200,"context_line":"    @validation.validated(schema.project_create, \u0027project\u0027)"},{"line_number":201,"context_line":"    def create_project(self, context, project):"},{"line_number":202,"context_line":"        def _normalize_is_domain_project_domain_id(self, project_ref):"},{"line_number":203,"context_line":"            if project_ref.get(\u0027domain_id\u0027):"},{"line_number":204,"context_line":"                msg \u003d _(\u0027Project %s is already a domain, unable \u0027"},{"line_number":205,"context_line":"                        \u0027to assign domain ID.\u0027) % project_ref[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_09bf7161","line":202,"in_reply_to":"ba3cc151_e034a2ad","updated":"2015-07-10 01:12:58.000000000","message":"that\u0027s because for is_domain projects, the user cannot pass domain_id, once the domain_id will be its own project id","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"310639801b7919a4ab3d4a87f6002803130a6975","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":215,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":216,"context_line":"        else:"},{"line_number":217,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":218,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":219,"context_line":"        try:"},{"line_number":220,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_8434b1de","line":217,"updated":"2015-07-20 14:47:39.000000000","message":"I think what we need here is that IF parent_id is specified, then we don\u0027t touch whatever domain_id is set to.  Then in the manager we process this we decide how to user parent_id/domain_id (including checking that if BOTH have been specified, then they imply the same domain).","commit_id":"d9fa302b041a334f5f764a6c7d015d4e3e69f07e"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"32e1bb5a8c601c9121fdae09af1ee861754e1bf7","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":215,"context_line":"            ref \u003d _normalize_is_domain_project_domain_id(context, ref)"},{"line_number":216,"context_line":"        else:"},{"line_number":217,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":218,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":219,"context_line":"        try:"},{"line_number":220,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_d58fb021","line":217,"in_reply_to":"3a50d1a3_8434b1de","updated":"2015-07-20 16:47:26.000000000","message":"agreed. I\u0027ll do that","commit_id":"d9fa302b041a334f5f764a6c7d015d4e3e69f07e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    @validation.validated(schema.project_create, \u0027project\u0027)"},{"line_number":201,"context_line":"    def create_project(self, context, project):"},{"line_number":202,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":203,"context_line":"        ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":204,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"},{"line_number":205,"context_line":"        try:"},{"line_number":206,"context_line":"            ref \u003d self.resource_api.create_project(ref[\u0027id\u0027], ref,"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_a1c92a28","side":"PARENT","line":203,"updated":"2015-07-22 09:57:59.000000000","message":"I think we still need to leave this call for now....so we don\u0027t break existing functionality....but agree with your comment that we can\u0027t really support the passing of just parent_id until after domain operations are supported on the project table.","commit_id":"c387a9353ed8c06428e2ee8b1fbfe71e3b60a737"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95e42381b2bb53dce601c4e548e4af25954d968e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@dependency.requires(\u0027resource_api\u0027)"},{"line_number":38,"context_line":"class Tenant(controller.V2Controller):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @controller.v2_deprecated"},{"line_number":41,"context_line":"    def get_all_projects(self, context, **kw):"},{"line_number":42,"context_line":"        \"\"\"Gets a list of all tenants for an admin user.\"\"\""},{"line_number":43,"context_line":"        if \u0027name\u0027 in context[\u0027query_string\u0027]:"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_414a36ae","line":40,"updated":"2015-08-07 18:31:40.000000000","message":"This is deprecated. Should we be adding more logic here? Same goes for the ones below.","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fc4491c03696ee5c77ed44caa3f363f5d07c9615","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@dependency.requires(\u0027resource_api\u0027)"},{"line_number":38,"context_line":"class Tenant(controller.V2Controller):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @controller.v2_deprecated"},{"line_number":41,"context_line":"    def get_all_projects(self, context, **kw):"},{"line_number":42,"context_line":"        \"\"\"Gets a list of all tenants for an admin user.\"\"\""},{"line_number":43,"context_line":"        if \u0027name\u0027 in context[\u0027query_string\u0027]:"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_0ac0c3df","line":40,"in_reply_to":"1a4dcd0f_414a36ae","updated":"2015-08-07 19:47:32.000000000","message":"actually, we arent\u0027t adding logic. we are just keeping the current logic, making it only return regular projects, as v2 is supposed to do.","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"908ae2ad69d8778aa2d821d45a8d85d13807dafc","unresolved":false,"context_lines":[{"line_number":37,"context_line":"@dependency.requires(\u0027resource_api\u0027)"},{"line_number":38,"context_line":"class Tenant(controller.V2Controller):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @controller.v2_deprecated"},{"line_number":41,"context_line":"    def get_all_projects(self, context, **kw):"},{"line_number":42,"context_line":"        \"\"\"Gets a list of all tenants for an admin user.\"\"\""},{"line_number":43,"context_line":"        if \u0027name\u0027 in context[\u0027query_string\u0027]:"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_e4027072","line":40,"in_reply_to":"1a4dcd0f_414a36ae","updated":"2015-08-12 12:57:08.000000000","message":"this is to keep compatibility, because we are changing how project\u0027s are retrieved by their names.","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95e42381b2bb53dce601c4e548e4af25954d968e","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def create_project(self, context, project):"},{"line_number":216,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If we don\u0027t set parent_id neither domain_id, the domain_id will"},{"line_number":219,"context_line":"        # be normalized to the domain_id in the token."},{"line_number":220,"context_line":"        if not project.get(\u0027parent_id\u0027) and not project.get(\u0027domain_id\u0027):"},{"line_number":221,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_c1eba677","line":218,"updated":"2015-08-07 18:31:40.000000000","message":"this doesn\u0027t parse for me.... maybe s/neither/or/ ?","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fc4491c03696ee5c77ed44caa3f363f5d07c9615","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def create_project(self, context, project):"},{"line_number":216,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If we don\u0027t set parent_id neither domain_id, the domain_id will"},{"line_number":219,"context_line":"        # be normalized to the domain_id in the token."},{"line_number":220,"context_line":"        if not project.get(\u0027parent_id\u0027) and not project.get(\u0027domain_id\u0027):"},{"line_number":221,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_aa58af8b","line":218,"in_reply_to":"1a4dcd0f_c1eba677","updated":"2015-08-07 19:47:32.000000000","message":"Done","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"908ae2ad69d8778aa2d821d45a8d85d13807dafc","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    def create_project(self, context, project):"},{"line_number":216,"context_line":"        ref \u003d self._assign_unique_id(self._normalize_dict(project))"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If we don\u0027t set parent_id neither domain_id, the domain_id will"},{"line_number":219,"context_line":"        # be normalized to the domain_id in the token."},{"line_number":220,"context_line":"        if not project.get(\u0027parent_id\u0027) and not project.get(\u0027domain_id\u0027):"},{"line_number":221,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_c401746c","line":218,"in_reply_to":"1a4dcd0f_c1eba677","updated":"2015-08-12 12:57:08.000000000","message":"Done","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6239f7dc031e509a50e5b45f740eaab833240118","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":219,"context_line":"        # be normalized to the domain_id in the token."},{"line_number":220,"context_line":"        if not project.get(\u0027parent_id\u0027) and not project.get(\u0027domain_id\u0027):"},{"line_number":221,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"}],"source_content_type":"text/x-python","patch_set":90,"id":"1a4dcd0f_347d7d1c","line":220,"updated":"2015-08-11 07:51:49.000000000","message":"If we are going to make this change here, we need to test it...I don\u0027t see any test at the restful level for this?","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"35185041a65c1156ae494c1fee6702564f90c0ac","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"        # If we don\u0027t set parent_id or domain_id, the domain_id will"},{"line_number":219,"context_line":"        # be normalized to the domain_id in the token."},{"line_number":220,"context_line":"        if not project.get(\u0027parent_id\u0027) and not project.get(\u0027domain_id\u0027):"},{"line_number":221,"context_line":"            ref \u003d self._normalize_domain_id(context, ref)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        initiator \u003d notifications._get_request_audit_info(context)"}],"source_content_type":"text/x-python","patch_set":90,"id":"1a4dcd0f_4bde5512","line":220,"in_reply_to":"1a4dcd0f_347d7d1c","updated":"2015-08-11 15:27:36.000000000","message":"Done, we didn\u0027t have such test before :)","commit_id":"043bcd91c4b123d9a416b7f17c3ae46a003b11d2"}],"keystone/resource/core.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            raise exception.ForbiddenAction("},{"line_number":228,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":231,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":232,"context_line":"            raise exception.ForbiddenAction("},{"line_number":233,"context_line":"                action\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_5e72ad4a","line":230,"updated":"2015-04-02 22:23:49.000000000","message":"what if the user pass an empty value for is_domain, should we just ignore that and treat it as no update?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed71e04bd4d65e10b31c5920e94ff658046b02a7","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            raise exception.ForbiddenAction("},{"line_number":228,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":231,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":232,"context_line":"            raise exception.ForbiddenAction("},{"line_number":233,"context_line":"                action\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_5704027d","line":230,"in_reply_to":"9aa53dc9_b9afcf93","updated":"2015-04-06 19:42:37.000000000","message":"I mean the user passing a \"is_domain:None\", should we just ignore it? \n\nLooking at the code above, it is the same handling for \u0027parent_id\u0027. This is fine then.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":227,"context_line":"            raise exception.ForbiddenAction("},{"line_number":228,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":231,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":232,"context_line":"            raise exception.ForbiddenAction("},{"line_number":233,"context_line":"                action\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_b9afcf93","line":230,"in_reply_to":"baa041b7_5e72ad4a","updated":"2015-04-06 17:25:22.000000000","message":"You mean the user pass something like: is_domain:\"\" or don\u0027t send this information in the update project?\n\nFor the first case, this is a invalid error, since this is a boolean. in the second case we ignore that.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":262,"context_line":"                raise exception.ForbiddenAction("},{"line_number":263,"context_line":"                    action\u003d_(\u0027cannot delete a project with the domain feature \u0027"},{"line_number":264,"context_line":"                             \u0027that is enabled, please disable it first.\u0027))"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"},{"line_number":267,"context_line":"            raise exception.ForbiddenAction("}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_f431b20c","line":264,"updated":"2015-04-02 15:34:02.000000000","message":"do you mean disable the domain feature or disable the project? I Think the latter...","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":262,"context_line":"                raise exception.ForbiddenAction("},{"line_number":263,"context_line":"                    action\u003d_(\u0027cannot delete a project with the domain feature \u0027"},{"line_number":264,"context_line":"                             \u0027that is enabled, please disable it first.\u0027))"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"},{"line_number":267,"context_line":"            raise exception.ForbiddenAction("}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_3903bf11","line":264,"in_reply_to":"baa041b7_9e915555","updated":"2015-04-06 17:25:22.000000000","message":"disable the project with the domain feature, not disable the domain feature.\n\nI\u0027ll rephrase this to make more clear.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":261,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":262,"context_line":"                raise exception.ForbiddenAction("},{"line_number":263,"context_line":"                    action\u003d_(\u0027cannot delete a project with the domain feature \u0027"},{"line_number":264,"context_line":"                             \u0027that is enabled, please disable it first.\u0027))"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"},{"line_number":267,"context_line":"            raise exception.ForbiddenAction("}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_9e915555","line":264,"in_reply_to":"baa041b7_f431b20c","updated":"2015-04-02 22:23:49.000000000","message":"yeah,  you can\u0027t disable the domain feature, that should be immutable. disable the domain project, I think","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"daf88e0e223a26c6b0500cd6e5935423145c9a78","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":261,"context_line":"                raise exception.ForbiddenAction("},{"line_number":262,"context_line":"                    action\u003d_(\u0027cannot delete a project with the domain feature \u0027"},{"line_number":263,"context_line":"                             \u0027that is enabled, please disable this project \u0027"},{"line_number":264,"context_line":"                             \u0027first.\u0027))"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_aa205d9c","line":263,"updated":"2015-04-13 17:33:18.000000000","message":"the grammar might be misread here that you mean the \"domain feature is enabled\", maybe turn it around and say:\n\n\"cannot delete an enabled project with the domain feature, please disable this project first\"","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"a72750eaf9d06af973e72167a592fae6043514ee","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":261,"context_line":"                raise exception.ForbiddenAction("},{"line_number":262,"context_line":"                    action\u003d_(\u0027cannot delete a project with the domain feature \u0027"},{"line_number":263,"context_line":"                             \u0027that is enabled, please disable this project \u0027"},{"line_number":264,"context_line":"                             \u0027first.\u0027))"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"}],"source_content_type":"text/x-python","patch_set":46,"id":"7aaa499b_4a7559c9","line":263,"in_reply_to":"7aaa499b_aa205d9c","updated":"2015-04-13 18:17:16.000000000","message":"Done","commit_id":"2ce0ba1f6f2a574019ece097e26b24ba34c4d313"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                        \u0027supported\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":89,"context_line":"            raise exception.ForbiddenAction("},{"line_number":90,"context_line":"                action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":91,"context_line":"                         \u0027feature enabled under a project with \u0027"},{"line_number":92,"context_line":"                         \u0027this property disabled\u0027))"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_7599266e","line":89,"updated":"2015-04-17 17:26:01.000000000","message":"Is this really a forbidden action? Those are usually the result authorization issues and not validation issues.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                                        \u0027supported\u0027))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":89,"context_line":"            raise exception.ForbiddenAction("},{"line_number":90,"context_line":"                action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":91,"context_line":"                         \u0027feature enabled under a project with \u0027"},{"line_number":92,"context_line":"                         \u0027this property disabled\u0027))"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_c71df167","line":89,"in_reply_to":"3ab451fb_7599266e","updated":"2015-04-17 17:44:26.000000000","message":"So, I\u0027ll change all the errors for a ValidationError.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        if (parent_ref and"},{"line_number":101,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":102,"context_line":"            raise exception.ForbiddenAction("},{"line_number":103,"context_line":"                action\u003d_(\u0027cannot create a project within a \u0027"},{"line_number":104,"context_line":"                         \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_f5ad3689","line":102,"updated":"2015-04-17 17:26:01.000000000","message":"same here","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            parents_list.append(parent_ref)"},{"line_number":119,"context_line":"            for ref in parents_list:"},{"line_number":120,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"},{"line_number":121,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":122,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":123,"context_line":"                                 \u0027branch containing a disabled \u0027"},{"line_number":124,"context_line":"                                 \u0027project: %s\u0027) % ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_95bb92c4","line":121,"updated":"2015-04-17 17:26:01.000000000","message":"and here","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":230,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":231,"context_line":"            raise exception.ForbiddenAction("},{"line_number":232,"context_line":"                action\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if \u0027enabled\u0027 in tenant:"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_35cb9e55","line":231,"updated":"2015-04-17 17:26:01.000000000","message":"same here","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        project \u003d self.driver.get_project(tenant_id)"},{"line_number":259,"context_line":"        if project.get(\u0027is_domain\u0027):"},{"line_number":260,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":261,"context_line":"                raise exception.ForbiddenAction("},{"line_number":262,"context_line":"                    action\u003d_(\u0027cannot delete an enabled project with the \u0027"},{"line_number":263,"context_line":"                             \u0027domain feature, please disable this project \u0027"},{"line_number":264,"context_line":"                             \u0027first.\u0027))"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_15c8a254","line":261,"updated":"2015-04-17 17:26:01.000000000","message":"and here","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            raise exception.ValidationError("},{"line_number":90,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":91,"context_line":"                          \u0027feature enabled under a project with \u0027"},{"line_number":92,"context_line":"                          \u0027this property disabled\u0027))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":95,"context_line":"        # NOTE(rodrigods): If is_domain is false, the project must contain"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_57860366","line":92,"updated":"2015-05-01 13:56:30.000000000","message":"should we include some ids in the message?","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            raise exception.ValidationError("},{"line_number":90,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":91,"context_line":"                          \u0027feature enabled under a project with \u0027"},{"line_number":92,"context_line":"                          \u0027this property disabled\u0027))"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":95,"context_line":"        # NOTE(rodrigods): If is_domain is false, the project must contain"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_d8e1ff9b","line":92,"in_reply_to":"3acd31a7_57860366","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":102,"context_line":"            raise exception.ValidationError("},{"line_number":103,"context_line":"                message\u003d_(\u0027cannot create a project within a \u0027"},{"line_number":104,"context_line":"                          \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"},{"line_number":107,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_377dc76e","line":104,"updated":"2015-05-01 13:56:30.000000000","message":"same comment here.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":102,"context_line":"            raise exception.ValidationError("},{"line_number":103,"context_line":"                message\u003d_(\u0027cannot create a project within a \u0027"},{"line_number":104,"context_line":"                          \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"},{"line_number":107,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_38047348","line":104,"in_reply_to":"3acd31a7_377dc76e","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":108,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if project_ref[\u0027is_domain\u0027]:"},{"line_number":111,"context_line":"            self._assert_is_domain_project_constraints(project_ref, parent_ref)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            self._assert_project_constraints(project_ref, parent_ref)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_b791d79b","line":110,"updated":"2015-05-01 13:56:30.000000000","message":"if the project_id isn\u0027t assigned, this will fail on a KeyError.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":108,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        if project_ref[\u0027is_domain\u0027]:"},{"line_number":111,"context_line":"            self._assert_is_domain_project_constraints(project_ref, parent_ref)"},{"line_number":112,"context_line":"        else:"},{"line_number":113,"context_line":"            self._assert_project_constraints(project_ref, parent_ref)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_9bd70123","line":110,"in_reply_to":"3acd31a7_b791d79b","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bd4d8f4447e8fcf42da42d59703c746dd44e442b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if (parent_ref and"},{"line_number":101,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":102,"context_line":"            raise exception.ValidationError("},{"line_number":103,"context_line":"                message\u003d_(\u0027cannot create a project within %(domain_id)s\u0027"},{"line_number":104,"context_line":"                          \u0027 that is a different domain than its parent \u0027"},{"line_number":105,"context_line":"                          \u0027(%(parent_domain_id)s).\u0027)"},{"line_number":106,"context_line":"                % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":56,"id":"1aca2d91_10bd3068","line":103,"updated":"2015-05-07 16:25:43.000000000","message":"nit: \n\n    \u0027cannot create a project within domain %(domain_id), which is different than its parent...\u0027\n\nagain, i\u0027m good if this is done in a separate patch.","commit_id":"2fbdb740d06fd59f5293b613dfa58b38503d978d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bd4d8f4447e8fcf42da42d59703c746dd44e442b","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                raise exception.ValidationError("},{"line_number":265,"context_line":"                    message\u003d_(\u0027cannot delete an enabled project with the \u0027"},{"line_number":266,"context_line":"                              \u0027domain feature, please disable this project \u0027"},{"line_number":267,"context_line":"                              \u0027first.\u0027))"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"},{"line_number":270,"context_line":"            raise exception.ForbiddenAction("}],"source_content_type":"text/x-python","patch_set":56,"id":"1aca2d91_f0663428","line":267,"updated":"2015-05-07 16:25:43.000000000","message":"lets see if we can put the project id in this message as well.","commit_id":"2fbdb740d06fd59f5293b613dfa58b38503d978d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":98,"context_line":"        # NOTE(rodrigods): If is_domain is false, the project must contain"},{"line_number":99,"context_line":"        # a valid domain_id and parent_id. Also, it should be in the same"},{"line_number":100,"context_line":"        # domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_406b0386","line":98,"updated":"2015-07-04 15:01:05.000000000","message":"maybe reword for clarity, I was expecting us to be checking is_domain in this method given this comment.  I think what you mean is:\n\n\"Called when is_domain is false, hence the project must contain...\"","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":98,"context_line":"        # NOTE(rodrigods): If is_domain is false, the project must contain"},{"line_number":99,"context_line":"        # a valid domain_id and parent_id. Also, it should be in the same"},{"line_number":100,"context_line":"        # domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_f2a2099a","line":98,"in_reply_to":"ba3cc151_406b0386","updated":"2015-07-06 17:21:31.000000000","message":"Done","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_e0125709","line":103,"updated":"2015-07-04 15:01:05.000000000","message":"is there a case when a regular projects doesn\u0027t have a parent ref? Won\u0027t all project that exists before this change all have their parent set to the project acting as their domain?  Or maybe that\u0027s a change in a follow on patch when we ditch the domain table?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_92161da6","line":103,"in_reply_to":"ba3cc151_e0125709","updated":"2015-07-06 17:21:31.000000000","message":"No, it\u0027ll always have a parent ref. And you\u0027re correct, all projects will be children of their domains from here: https://review.openstack.org/#/c/143763/59/keystone/common/sql/migrate_repo/versions/076_migrate_domains_to_projects.py\nAt this point, we\u0027re just checking if the user passed a parent_id that belongs to the same domain as it does.","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":133,"context_line":"                                             parents_list)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":136,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":137,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":138,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_80da6be8","line":135,"updated":"2015-07-04 15:01:05.000000000","message":"I think somewhere we need a good long comment block that explains the rules for what we expect in domainId, project_id, parent_id with is_domain set to both True and False....it\u0027s hard to keep this in your head.  Maybe a block at the start of the project methods?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":133,"context_line":"                                             parents_list)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":136,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":137,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":138,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_cd73aa14","line":135,"in_reply_to":"ba3cc151_80da6be8","updated":"2015-07-06 17:21:31.000000000","message":"Ok. Will do it right here in this patch","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        if not original_tenant_enabled and tenant_enabled:"},{"line_number":250,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":251,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":252,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":253,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":254,"context_line":"            self._disable_project(tenant_id)"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_e0b7b7f3","line":252,"updated":"2015-07-04 15:01:05.000000000","message":"so disabling a project acting as a domain does not require the tree underneath it to have already been disabled?  I assume this is to keep compatibility with current domain functionality? If so, maybe a comment to this effect would be good here/","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        if not original_tenant_enabled and tenant_enabled:"},{"line_number":250,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":251,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":252,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":253,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":254,"context_line":"            self._disable_project(tenant_id)"},{"line_number":255,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_a2166c53","line":252,"in_reply_to":"ba3cc151_e0b7b7f3","updated":"2015-07-06 17:21:31.000000000","message":"Done","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2a4dcc87764c91128edd6cecbcaf8280b6114c27","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":136,"context_line":"        \"\"\"When is_domain is set True, the domain_id can not be passed, since"},{"line_number":137,"context_line":"        it will be set as the project own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_a44d6e3f","line":137,"updated":"2015-07-09 13:17:57.000000000","message":"s/project own/project\u0027s own/","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6e9874d615855933c08f1cafef288dae431318bd","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":136,"context_line":"        \"\"\"When is_domain is set True, the domain_id can not be passed, since"},{"line_number":137,"context_line":"        it will be set as the project own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_90e40e0d","line":137,"in_reply_to":"ba3cc151_a44d6e3f","updated":"2015-07-09 19:48:21.000000000","message":"Done","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2a4dcc87764c91128edd6cecbcaf8280b6114c27","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"When is_domain is set True, the domain_id can not be passed, since"},{"line_number":137,"context_line":"        it will be set as the project own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"},{"line_number":141,"context_line":"        the parent_id project must belong to this domain."},{"line_number":142,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_e496163d","line":139,"updated":"2015-07-09 13:17:57.000000000","message":"While I agree this is what we have spec\u0027d so far....in reality, if you specify parent_id I don\u0027t see why you should have to specify domain_id....since it is implicit. This would requires an API change however....I\u0027m going to post a quick bp/api request change for this.","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b9e4b43c71c76698205176cf645e4f149860744b","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"When is_domain is set True, the domain_id can not be passed, since"},{"line_number":137,"context_line":"        it will be set as the project own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"},{"line_number":141,"context_line":"        the parent_id project must belong to this domain."},{"line_number":142,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_ea381ff0","line":139,"in_reply_to":"ba3cc151_e496163d","updated":"2015-07-09 13:50:04.000000000","message":"Henry, the parent_id is not necessarily the domain_id","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6e9874d615855933c08f1cafef288dae431318bd","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        \"\"\"When is_domain is set True, the domain_id can not be passed, since"},{"line_number":137,"context_line":"        it will be set as the project own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"},{"line_number":141,"context_line":"        the parent_id project must belong to this domain."},{"line_number":142,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_90d88ef0","line":139,"in_reply_to":"ba3cc151_ea381ff0","updated":"2015-07-09 19:48:21.000000000","message":"As Rodrigo said, for we can, for non is_domain projects, the parent_id might not be the domain_id. But I agree with you that we need an api change for this","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"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.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_80bfd6fb","line":88,"updated":"2015-07-09 23:26:42.000000000","message":"Same thing here about forbidden","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"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.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_29ab5577","line":88,"in_reply_to":"ba3cc151_80bfd6fb","updated":"2015-07-10 01:12:58.000000000","message":"you\u0027re right. I\u0027ll fix this here: https://review.openstack.org/#/c/200295/1","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            raise exception.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_4050eed4","line":91,"updated":"2015-07-09 23:26:42.000000000","message":"I don\u0027t there is a case where parent_ref won\u0027t be a dictionary. Is there any reason why you check if it\u0027s truthy?","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3c446b1b827437c8ac9c11dc94a8319cb74aaf24","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            raise exception.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_2f7fd5ac","line":91,"in_reply_to":"ba3cc151_294cb5c7","updated":"2015-07-10 02:42:18.000000000","message":"If that\u0027s the case then L116 is broken because it assumes that it has a valid dictionary.","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"338cbac6c57f3bb9a36f6c48f726d3cceff5c6e2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            raise exception.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_1ad32d61","line":91,"in_reply_to":"ba3cc151_2f7fd5ac","updated":"2015-07-10 02:59:35.000000000","message":"actually, no... we assume that project_ref is valid, but not parent_ref","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            raise exception.Forbidden(_(\u0027Multiple domains are not \u0027"},{"line_number":89,"context_line":"                                        \u0027supported\u0027))"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_294cb5c7","line":91,"in_reply_to":"ba3cc151_4050eed4","updated":"2015-07-10 01:12:58.000000000","message":"it can be None, in L114... The case where the is_domain project is root","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_60c89257","line":93,"updated":"2015-07-09 23:26:42.000000000","message":"This message doesn\u0027t really make sense. I\u0027ll chew on this for a bit and see if I can figure out what it is saying.","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_c984290d","line":93,"in_reply_to":"ba3cc151_60c89257","updated":"2015-07-10 01:12:58.000000000","message":"is_domain projects can only be created under is_domain projects, or no project, which means it\u0027ll be root","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3c446b1b827437c8ac9c11dc94a8319cb74aaf24","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_cf3d09df","line":93,"in_reply_to":"ba3cc151_c984290d","updated":"2015-07-10 02:42:18.000000000","message":"I think what you just said or something similar is much more clear.","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"338cbac6c57f3bb9a36f6c48f726d3cceff5c6e2","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_da438512","line":93,"in_reply_to":"ba3cc151_cf3d09df","updated":"2015-07-10 02:59:35.000000000","message":"that sentence in the code is the result of some improvements... we intended to show the id of the project which has the feature enabled","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # also be in the same domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_60709274","line":103,"updated":"2015-07-09 23:26:42.000000000","message":"Same thing here about project_ref","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # also be in the same domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_e9924dfc","line":103,"in_reply_to":"ba3cc151_60709274","updated":"2015-07-10 01:12:58.000000000","message":"you mean parent_ref, right? I don\u0027t think we need it at this point, but we\u0027ll be assuming that the database is consistent","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"338cbac6c57f3bb9a36f6c48f726d3cceff5c6e2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # also be in the same domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_1ad6cd27","line":103,"in_reply_to":"ba3cc151_cf14294f","updated":"2015-07-10 02:59:35.000000000","message":"I\u0027ll check on this one deeper","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3c446b1b827437c8ac9c11dc94a8319cb74aaf24","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # also be in the same domain of its parent."},{"line_number":101,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (parent_ref and"},{"line_number":104,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":105,"context_line":"            raise exception.ValidationError("},{"line_number":106,"context_line":"                message\u003d_(\u0027cannot create a project within domain \u0027"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_cf14294f","line":103,"in_reply_to":"ba3cc151_e9924dfc","updated":"2015-07-10 02:42:18.000000000","message":"Yeah, I mean parent_ref. This is similar to above where this should be a valid dictionary already.","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            raise exception.ForbiddenAction("},{"line_number":240,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":243,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":244,"context_line":"            raise exception.ValidationError("},{"line_number":245,"context_line":"                message\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_60cf3258","line":242,"updated":"2015-07-09 23:26:42.000000000","message":"what happens if tenant doesn\u0027t have an \u0027is_domain\u0027 key, but original_tenant does? it should still fail right?","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"338cbac6c57f3bb9a36f6c48f726d3cceff5c6e2","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            raise exception.ForbiddenAction("},{"line_number":240,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":243,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":244,"context_line":"            raise exception.ValidationError("},{"line_number":245,"context_line":"                message\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_3a6ab182","line":242,"in_reply_to":"ba3cc151_2f04b516","updated":"2015-07-10 02:59:35.000000000","message":"any project update (only the name, for example) that does not include is_domain in the body is a test for that, I guess","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            raise exception.ForbiddenAction("},{"line_number":240,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":243,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":244,"context_line":"            raise exception.ValidationError("},{"line_number":245,"context_line":"                message\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_e90fad89","line":242,"in_reply_to":"ba3cc151_60cf3258","updated":"2015-07-10 01:12:58.000000000","message":"I don\u0027t think it should. If tenant doesn\u0027t have, it means that \u0027is_domain\u0027 attribute won\u0027t be updated. So, the flow goes on...","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3c446b1b827437c8ac9c11dc94a8319cb74aaf24","unresolved":false,"context_lines":[{"line_number":239,"context_line":"            raise exception.ForbiddenAction("},{"line_number":240,"context_line":"                action\u003d_(\u0027Update of `parent_id` is not allowed.\u0027))"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"        if (\u0027is_domain\u0027 in tenant and"},{"line_number":243,"context_line":"                tenant.get(\u0027is_domain\u0027) !\u003d original_tenant.get(\u0027is_domain\u0027)):"},{"line_number":244,"context_line":"            raise exception.ValidationError("},{"line_number":245,"context_line":"                message\u003d_(\u0027Update of `is_domain` is not allowed.\u0027))"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_2f04b516","line":242,"in_reply_to":"ba3cc151_e90fad89","updated":"2015-07-10 02:42:18.000000000","message":"Is there a test for that?","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9b60f146c403e44990d807586971b3b41b0e4e5c","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        it will be set as the project\u0027s own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"},{"line_number":141,"context_line":"        the parent_id project must belong to this domain."},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        tenant \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":68,"id":"9a41bdd9_4986ac14","line":140,"updated":"2015-07-17 10:17:05.000000000","message":"nit: better wording might be: \"The domain_id must be the ID of an is_domain project....\"","commit_id":"07261277681d0b8676a812068161fcb2f31104b0"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"7c8096494ac047c801af820485a1127260933cc1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        it will be set as the project\u0027s own id. If a parent is passed, the new"},{"line_number":138,"context_line":"        is_domain project will be a subproject of it."},{"line_number":139,"context_line":"        However, if is_domain is passed as False, both domain_id and parent_id"},{"line_number":140,"context_line":"        are obligatory. The domain_id must belong to an is_domain project and"},{"line_number":141,"context_line":"        the parent_id project must belong to this domain."},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        tenant \u003d tenant.copy()"}],"source_content_type":"text/x-python","patch_set":68,"id":"9a41bdd9_426d1e31","line":140,"in_reply_to":"9a41bdd9_4986ac14","updated":"2015-07-17 12:55:24.000000000","message":"Done","commit_id":"07261277681d0b8676a812068161fcb2f31104b0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"310639801b7919a4ab3d4a87f6002803130a6975","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        # must contain a valid domain_id and parent_id. It the parent is an"},{"line_number":100,"context_line":"        # is_domain\u003dfalse project, this project must be in the same domain"},{"line_number":101,"context_line":"        # of its parent. If the parent is an is_domain\u003dtrue project, this"},{"line_number":102,"context_line":"        # project\u0027s domain_id must match the parent_id"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.get_domain(project_ref[\u0027domain_id\u0027])"},{"line_number":105,"context_line":"        if parent_ref:"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_c98974cc","line":102,"updated":"2015-07-20 14:47:39.000000000","message":"So a few things here:\n\n1) You should be able to just pass parent_id and not domain_id....in which case you need to find the closest ancestors acting as a domain and that will be the domain_id (see: https://review.openstack.org/#/c/200624/). OK, I agree, technically that API clarification has not merged, but it will be done in the next few days, so let\u0027s get this right first time.\n\n2) The setting of domain_id will be the same, irrespective of whether the project is acting as a domain","commit_id":"d9fa302b041a334f5f764a6c7d015d4e3e69f07e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # If domain_id was set and is different from parent_id, raise an error"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_483de2c2","line":94,"updated":"2015-07-22 09:57:59.000000000","message":"I suggest we drop the phrasing of \"with the domain feature..\", the words we use in the Identity spec are \"project acting as a domain\"","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        if parent_ref and not parent_ref.get(\u0027is_domain\u0027):"},{"line_number":92,"context_line":"            raise exception.ValidationError("},{"line_number":93,"context_line":"                message\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":94,"context_line":"                          \u0027feature enabled under %s, which is a project with \u0027"},{"line_number":95,"context_line":"                          \u0027this property disabled\u0027) % project_ref[\u0027id\u0027])"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        # If domain_id was set and is different from parent_id, raise an error"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_dc5d1748","line":94,"in_reply_to":"3a50d1a3_483de2c2","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":107,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":108,"context_line":"        # must contain a valid parent_id. If the parent is an is_domain\u003dfalse"},{"line_number":109,"context_line":"        # project, this project must be in the same domain of its parent."},{"line_number":110,"context_line":"        # If the parent is an is_domain\u003dtrue project, this project\u0027s domain_id"},{"line_number":111,"context_line":"        # must match the parent_id"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_052ee3a4","line":108,"updated":"2015-07-22 09:57:59.000000000","message":"While this sentence will eventually be true, I don\u0027t think it is true with this patch - since I can always create a regular project without a parent, I think?","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":107,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":108,"context_line":"        # must contain a valid parent_id. If the parent is an is_domain\u003dfalse"},{"line_number":109,"context_line":"        # project, this project must be in the same domain of its parent."},{"line_number":110,"context_line":"        # If the parent is an is_domain\u003dtrue project, this project\u0027s domain_id"},{"line_number":111,"context_line":"        # must match the parent_id"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_575480fd","line":108,"in_reply_to":"3a50d1a3_052ee3a4","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":159,"context_line":"                                             parents_list)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _normalize_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_054823cb","line":161,"updated":"2015-07-22 09:57:59.000000000","message":"maybe not call this _normalize_domain_id() so as not to confuse with the controller method.  Perhaps, _find_domain_id()?","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            self._assert_max_hierarchy_depth(project_ref.get(\u0027parent_id\u0027),"},{"line_number":159,"context_line":"                                             parents_list)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _normalize_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_f7a26cfb","line":161,"in_reply_to":"3a50d1a3_054823cb","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":295,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":296,"context_line":"            # NOTE(htruta): disabling an is_domain project will disable all of"},{"line_number":297,"context_line":"            # its children, keeping the domain funcionality behaviour."},{"line_number":298,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":299,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":300,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_e8bdceb7","line":297,"updated":"2015-07-22 09:57:59.000000000","message":"this comment (although correct) is a bit hard to understand since it is the opposite of the test below.  How about something like:\n\n\"In order to disable a regular project, all its children must already be disabled. However, to keep compatibility with the existing domain behaviour, we allow a project acting as a domain to be disabled irrespective of the state of its children. The act of disabling such a project will cause its children to be disabled.\"","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":294,"context_line":"            self._assert_all_parents_are_enabled(tenant_id)"},{"line_number":295,"context_line":"        if original_tenant_enabled and not tenant_enabled:"},{"line_number":296,"context_line":"            # NOTE(htruta): disabling an is_domain project will disable all of"},{"line_number":297,"context_line":"            # its children, keeping the domain funcionality behaviour."},{"line_number":298,"context_line":"            if not original_tenant.get(\u0027is_domain\u0027):"},{"line_number":299,"context_line":"                self._assert_whole_subtree_is_disabled(tenant_id)"},{"line_number":300,"context_line":"            self._disable_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_b7c62498","line":297,"in_reply_to":"3a50d1a3_e8bdceb7","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3ca9f6222ca1e6f583591bd9be47e0a9a3a94de6","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":313,"context_line":"                raise exception.ValidationError("},{"line_number":314,"context_line":"                    message\u003d_(\u0027cannot delete an enabled project with the \u0027"},{"line_number":315,"context_line":"                              \u0027domain feature, please disable the project \u0027"},{"line_number":316,"context_line":"                              \u0027%s first.\u0027) % project.get(\u0027id\u0027))"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_a85b46f5","line":315,"updated":"2015-07-22 09:57:59.000000000","message":"...acting as a domain...","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"05af7a2e6f53b78133794511de6dabe5925c79f2","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":313,"context_line":"                raise exception.ValidationError("},{"line_number":314,"context_line":"                    message\u003d_(\u0027cannot delete an enabled project with the \u0027"},{"line_number":315,"context_line":"                              \u0027domain feature, please disable the project \u0027"},{"line_number":316,"context_line":"                              \u0027%s first.\u0027) % project.get(\u0027id\u0027))"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        if not self.driver.is_leaf_project(tenant_id):"}],"source_content_type":"text/x-python","patch_set":72,"id":"3a50d1a3_f7790c83","line":315,"in_reply_to":"3a50d1a3_a85b46f5","updated":"2015-07-22 18:24:19.000000000","message":"Done","commit_id":"d0be9047e83ad1060cd3291e27ed16ccc69b1425"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"083169813fae53cd990c0a89071eb0272b6e2534","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":75,"id":"3a50d1a3_6951400e","line":85,"updated":"2015-07-24 09:48:14.000000000","message":"somewhere in this method we also need to make sure the name does not clash with the federated domain name (see create_domain)","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bb55948b4d18634160f743d2fc90b1e9b7e2a367","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":75,"id":"3a50d1a3_8793494f","line":85,"in_reply_to":"3a50d1a3_6951400e","updated":"2015-07-24 17:38:24.000000000","message":"Done","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8e5c259cace82616cc7c0aaefbeef462a5fbb913","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"},{"line_number":165,"context_line":"            parent_ref \u003d self.get_project(parent_ref[\u0027parent_id\u0027])"},{"line_number":166,"context_line":"        return parent_ref[\u0027domain_id\u0027]"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_d525890a","line":163,"updated":"2015-07-24 08:45:27.000000000","message":"I don\u0027t think parent_id can be None here can it? At least not the way it is currently called.  And if it where none, then parent_ref[\u0027domain_id\u0027] is going to blow up at the end of the method, I think.","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bb55948b4d18634160f743d2fc90b1e9b7e2a367","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"},{"line_number":165,"context_line":"            parent_ref \u003d self.get_project(parent_ref[\u0027parent_id\u0027])"},{"line_number":166,"context_line":"        return parent_ref[\u0027domain_id\u0027]"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_479d4158","line":163,"in_reply_to":"3a50d1a3_d525890a","updated":"2015-07-24 17:38:24.000000000","message":"Done","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8e5c259cace82616cc7c0aaefbeef462a5fbb913","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"},{"line_number":165,"context_line":"            parent_ref \u003d self.get_project(parent_ref[\u0027parent_id\u0027])"},{"line_number":166,"context_line":"        return parent_ref[\u0027domain_id\u0027]"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_954dc1c6","line":164,"updated":"2015-07-24 08:45:27.000000000","message":"I think this loop needs to take account of the fact that at the time of this patch, not all projects are in a full hierarchy....i.e. the parent might be regular project with no parent (but it\u0027s domain_id WILL be set).","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bb55948b4d18634160f743d2fc90b1e9b7e2a367","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":162,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":163,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":164,"context_line":"        while not parent_ref.get(\u0027is_domain\u0027, False):"},{"line_number":165,"context_line":"            parent_ref \u003d self.get_project(parent_ref[\u0027parent_id\u0027])"},{"line_number":166,"context_line":"        return parent_ref[\u0027domain_id\u0027]"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_1589a2ca","line":164,"in_reply_to":"3a50d1a3_954dc1c6","updated":"2015-07-24 17:38:24.000000000","message":"you are right, actually we don\u0027t need a loop here. At this point, the domain_id is the parent\u0027s domain_id.","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a94a46dff298cb5e0b971921441a50602b032da5","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # TODO(rodrigods): If domain_id was set and is different from"},{"line_number":99,"context_line":"        # parent_id, raise an error"},{"line_number":100,"context_line":"        #"},{"line_number":101,"context_line":"        # if (parent_ref and project_ref.get(\u0027domain_id\u0027) and"},{"line_number":102,"context_line":"        #         project_ref.get(\u0027domain_id\u0027) !\u003d parent_ref[\u0027id\u0027]):"},{"line_number":103,"context_line":"        #     raise exception.ValidationError("},{"line_number":104,"context_line":"        #         message\u003d_(\u0027is_domain project %(id)s cannot have domain_id \u0027"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_7f4872b3","line":101,"updated":"2015-07-28 19:09:03.000000000","message":"nit: in general leaving in commented out code that will be enabled in a follow on patch is not that useful...especially if the patch is already up.","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"51d66e0993c426dc0ee01ffa8ec250c13c673e15","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # TODO(rodrigods): If domain_id was set and is different from"},{"line_number":99,"context_line":"        # parent_id, raise an error"},{"line_number":100,"context_line":"        #"},{"line_number":101,"context_line":"        # if (parent_ref and project_ref.get(\u0027domain_id\u0027) and"},{"line_number":102,"context_line":"        #         project_ref.get(\u0027domain_id\u0027) !\u003d parent_ref[\u0027id\u0027]):"},{"line_number":103,"context_line":"        #     raise exception.ValidationError("},{"line_number":104,"context_line":"        #         message\u003d_(\u0027is_domain project %(id)s cannot have domain_id \u0027"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_8243a5ae","line":101,"in_reply_to":"3a50d1a3_7f4872b3","updated":"2015-07-28 19:29:17.000000000","message":"I agree, we did this in order to make clear what were the required changes. We had also some of code that couldn\u0027t be in this patch, but we\u0027re afraid to remove and forget about them.\n\nNow that this code is working in the follow up patches, I\u0027d be ok in remove them (if you have a strong preference to do so)","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        # TODO(rodrigods): If domain_id was set and is different from"},{"line_number":99,"context_line":"        # parent_id, raise an error"},{"line_number":100,"context_line":"        #"},{"line_number":101,"context_line":"        # if (parent_ref and project_ref.get(\u0027domain_id\u0027) and"},{"line_number":102,"context_line":"        #         project_ref.get(\u0027domain_id\u0027) !\u003d parent_ref[\u0027id\u0027]):"},{"line_number":103,"context_line":"        #     raise exception.ValidationError("},{"line_number":104,"context_line":"        #         message\u003d_(\u0027is_domain project %(id)s cannot have domain_id \u0027"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_79705c08","line":101,"in_reply_to":"3a50d1a3_8243a5ae","updated":"2015-07-29 17:09:39.000000000","message":"removed the code","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a94a46dff298cb5e0b971921441a50602b032da5","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"},{"line_number":134,"context_line":"            # domain_id should point to the parent\u0027s id"},{"line_number":135,"context_line":"            #"},{"line_number":136,"context_line":"            # else:"},{"line_number":137,"context_line":"            #     if domain_id and parent_ref[\u0027id\u0027] !\u003d domain_id:"},{"line_number":138,"context_line":"            #         raise exception.ValidationError("},{"line_number":139,"context_line":"            #             message\u003d_(\u0027cannot create an is_domain\u003dfalse project \u0027"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_1fc84e21","line":136,"updated":"2015-07-28 19:09:03.000000000","message":"ditto","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"51d66e0993c426dc0ee01ffa8ec250c13c673e15","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"},{"line_number":134,"context_line":"            # domain_id should point to the parent\u0027s id"},{"line_number":135,"context_line":"            #"},{"line_number":136,"context_line":"            # else:"},{"line_number":137,"context_line":"            #     if domain_id and parent_ref[\u0027id\u0027] !\u003d domain_id:"},{"line_number":138,"context_line":"            #         raise exception.ValidationError("},{"line_number":139,"context_line":"            #             message\u003d_(\u0027cannot create an is_domain\u003dfalse project \u0027"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_e2086982","line":136,"in_reply_to":"3a50d1a3_1fc84e21","updated":"2015-07-28 19:29:17.000000000","message":"see above - it also applies for other TODOS around the code, specially in the tests","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"ab8ebdae0a318e35747a6afe4826d2f70357e033","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    def delete_project(self, tenant_id, initiator\u003dNone):"},{"line_number":303,"context_line":"        project \u003d self.driver.get_project(tenant_id)"},{"line_number":304,"context_line":"        if project.get(\u0027is_domain\u0027):"},{"line_number":305,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":306,"context_line":"                raise exception.ValidationError("},{"line_number":307,"context_line":"                    message\u003d_(\u0027cannot delete an enabled project acting as a \u0027"},{"line_number":308,"context_line":"                              \u0027domain. Please disable the project %s first.\u0027)"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_3715df9a","line":305,"updated":"2015-07-30 07:25:49.000000000","message":"this can be just:\n  \n  if project.get(\u0027is_domain\u0027) and project.get(\u0027enabled\u0027):","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a5911e25e130facd6fa1e4184b1e39186b913c5b","unresolved":false,"context_lines":[{"line_number":302,"context_line":"    def delete_project(self, tenant_id, initiator\u003dNone):"},{"line_number":303,"context_line":"        project \u003d self.driver.get_project(tenant_id)"},{"line_number":304,"context_line":"        if project.get(\u0027is_domain\u0027):"},{"line_number":305,"context_line":"            if project.get(\u0027enabled\u0027):"},{"line_number":306,"context_line":"                raise exception.ValidationError("},{"line_number":307,"context_line":"                    message\u003d_(\u0027cannot delete an enabled project acting as a \u0027"},{"line_number":308,"context_line":"                              \u0027domain. Please disable the project %s first.\u0027)"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_9f539a39","line":305,"in_reply_to":"3a50d1a3_3715df9a","updated":"2015-07-30 14:53:25.000000000","message":"Done","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e0c9943fd3a07f8675a42d2ca0a27eb87d272fb","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                % project_ref[\u0027id\u0027])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # TODO(rodrigods): If domain_id was set and is different from"},{"line_number":99,"context_line":"        # parent_id, raise an error"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":102,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_ca8e38d0","line":99,"updated":"2015-07-30 16:52:24.000000000","message":"not sure this TODO helps here","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c848faf8eb315df0dd73f0119ff490e9ae9b2968","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                % project_ref[\u0027id\u0027])"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        # TODO(rodrigods): If domain_id was set and is different from"},{"line_number":99,"context_line":"        # parent_id, raise an error"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":102,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_9de398a4","line":99,"in_reply_to":"3a50d1a3_ca8e38d0","updated":"2015-07-30 17:08:41.000000000","message":"Done","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e0c9943fd3a07f8675a42d2ca0a27eb87d272fb","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                        % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":124,"context_line":"                           \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":125,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"},{"line_number":126,"context_line":"            # domain_id should point to the parent\u0027s id"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"},{"line_number":129,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_4a70e8dc","line":126,"updated":"2015-07-30 16:52:24.000000000","message":"TODOs like this are confusing, we don\u0027t know if we should wait until you fix it before we approve or not.  I suggest you remove this.","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c848faf8eb315df0dd73f0119ff490e9ae9b2968","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                        % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":124,"context_line":"                           \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":125,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"},{"line_number":126,"context_line":"            # domain_id should point to the parent\u0027s id"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"},{"line_number":129,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_7df1ec69","line":126,"in_reply_to":"3a50d1a3_4a70e8dc","updated":"2015-07-30 17:08:41.000000000","message":"Done","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e0c9943fd3a07f8675a42d2ca0a27eb87d272fb","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":152,"context_line":"        # TODO(htruta): At this point, the nearest domain_id will be the"},{"line_number":153,"context_line":"        # parent\u0027s domain_id. Once we migrate domains to the project table"},{"line_number":154,"context_line":"        # we need to check if the parent is a project acting as a domain."},{"line_number":155,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":156,"context_line":"        return parent_ref[\u0027domain_id\u0027]"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_6a1044ac","line":153,"updated":"2015-07-30 16:52:24.000000000","message":"In fact, why won\u0027t this always be true? Although conceptually we are finding the closed project acting as a domain...in reality the immediate parent will have done that search for you when it was created.  So don\u0027t we just use the parent\u0027s domain_id ?","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c848faf8eb315df0dd73f0119ff490e9ae9b2968","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":152,"context_line":"        # TODO(htruta): At this point, the nearest domain_id will be the"},{"line_number":153,"context_line":"        # parent\u0027s domain_id. Once we migrate domains to the project table"},{"line_number":154,"context_line":"        # we need to check if the parent is a project acting as a domain."},{"line_number":155,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":156,"context_line":"        return parent_ref[\u0027domain_id\u0027]"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_bd49b4b9","line":153,"in_reply_to":"3a50d1a3_6a1044ac","updated":"2015-07-30 17:08:41.000000000","message":"not really, once we have migrated domains to the project table we\u0027ll have two cases:\n\n  1) If the parent is a project acting as a domain, my domain_id will be the parent\u0027s id\n  2) if the parent is a \"pure\" project, my domain_id will be its domain_id","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f0829dd559ad5922b9133326ec3eadae3b5bb626","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":152,"context_line":"        # TODO(htruta): At this point, the nearest domain_id will be the"},{"line_number":153,"context_line":"        # parent\u0027s domain_id. Once we migrate domains to the project table"},{"line_number":154,"context_line":"        # we need to check if the parent is a project acting as a domain."},{"line_number":155,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"},{"line_number":156,"context_line":"        return parent_ref[\u0027domain_id\u0027]"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_203fbb88","line":153,"in_reply_to":"3a50d1a3_bd49b4b9","updated":"2015-07-30 17:13:49.000000000","message":"You are correct sir, as usual!","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e0c9943fd3a07f8675a42d2ca0a27eb87d272fb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":163,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":164,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":165,"context_line":"        # project_id of the closest is_domain\u003dTrue project upward its tree."},{"line_number":166,"context_line":"        # Root projects (i.e. is_domain\u003dTrue projects with no parent)"},{"line_number":167,"context_line":"        # have no domain_id."},{"line_number":168,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_aafacc41","line":165,"updated":"2015-07-30 16:52:24.000000000","message":"(opinion): I personally find the use of \"is_domain\u003dTrue\" as an adjective hard to read...how about using the term \"acting as a domain\", i.e.:\n\n\"...of the closest project acting as a domain upward in the tree\"","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c848faf8eb315df0dd73f0119ff490e9ae9b2968","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":163,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":164,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":165,"context_line":"        # project_id of the closest is_domain\u003dTrue project upward its tree."},{"line_number":166,"context_line":"        # Root projects (i.e. is_domain\u003dTrue projects with no parent)"},{"line_number":167,"context_line":"        # have no domain_id."},{"line_number":168,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_3dd4c4bb","line":165,"in_reply_to":"3a50d1a3_aafacc41","updated":"2015-07-30 17:08:41.000000000","message":"Done","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e0c9943fd3a07f8675a42d2ca0a27eb87d272fb","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":164,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":165,"context_line":"        # project_id of the closest is_domain\u003dTrue project upward its tree."},{"line_number":166,"context_line":"        # Root projects (i.e. is_domain\u003dTrue projects with no parent)"},{"line_number":167,"context_line":"        # have no domain_id."},{"line_number":168,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":169,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_4aa2284d","line":166,"updated":"2015-07-30 16:52:24.000000000","message":"ditto","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c848faf8eb315df0dd73f0119ff490e9ae9b2968","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":164,"context_line":"        # be set from the parent_id. The domain_id of a project is the"},{"line_number":165,"context_line":"        # project_id of the closest is_domain\u003dTrue project upward its tree."},{"line_number":166,"context_line":"        # Root projects (i.e. is_domain\u003dTrue projects with no parent)"},{"line_number":167,"context_line":"        # have no domain_id."},{"line_number":168,"context_line":"        tenant.setdefault(\u0027parent_id\u0027, None)"},{"line_number":169,"context_line":"        tenant.setdefault(\u0027domain_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":82,"id":"3a50d1a3_9d563829","line":166,"in_reply_to":"3a50d1a3_4aa2284d","updated":"2015-07-30 17:08:41.000000000","message":"Done","commit_id":"855e40517187d033a0397e47de74a80a7395d0c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cde9bd5cc2dc8369cf8afe57ef5ffaa8fbddc3ee","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                              \u0027specifies a parent in a different domain \u0027"},{"line_number":117,"context_line":"                              \u0027(%(parent_domain_id)s).\u0027)"},{"line_number":118,"context_line":"                    % {\u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":119,"context_line":"                        \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":122,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_ec3997a4","line":119,"updated":"2015-07-31 18:22:58.000000000","message":"nit: indentation could be moved back one space here.\n\n    \u0027domain_id\u0027: domain[\u0027id\u0027],\n    \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})\n\nthis could be fixed in a follow on patch, too.","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"800361ff850c4e2b92948aa1a5affd2c92b48684","unresolved":false,"context_lines":[{"line_number":116,"context_line":"                              \u0027specifies a parent in a different domain \u0027"},{"line_number":117,"context_line":"                              \u0027(%(parent_domain_id)s).\u0027)"},{"line_number":118,"context_line":"                    % {\u0027domain_id\u0027: domain[\u0027id\u0027],"},{"line_number":119,"context_line":"                        \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    def _find_domain_id(self, project_ref):"},{"line_number":122,"context_line":"        parent_ref \u003d self.get_project(project_ref[\u0027parent_id\u0027])"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_ea4f2d32","line":119,"in_reply_to":"3a50d1a3_ec3997a4","updated":"2015-08-01 00:15:51.000000000","message":"Done","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cde9bd5cc2dc8369cf8afe57ef5ffaa8fbddc3ee","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        if not domain_id and parent_id:"},{"line_number":130,"context_line":"            project_ref[\u0027domain_id\u0027] \u003d self._find_domain_id(project_ref)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":133,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_acadcf9c","line":130,"updated":"2015-07-31 18:22:58.000000000","message":"This only works up to three layers, right? _find_domain_id doesn\u0027t recursively find the domain_id of the project_ref in question. What happens if we nest several projects and end up with a bunch of layers? \n\n\n    A (domain)\n    | \n    B\n    |\n    C\n    |\n    D (project_ref we\u0027re working with here)\n\nLet\u0027s say that _enforce_project_constraints is called with project D\u0027s reference. How does that work in determining project D belongs to project/domain A?","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"35a61eee4851cde0aec5bf7e9d505fd0d66d72e8","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        parent_id \u003d project_ref.get(\u0027parent_id\u0027)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        if not domain_id and parent_id:"},{"line_number":130,"context_line":"            project_ref[\u0027domain_id\u0027] \u003d self._find_domain_id(project_ref)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        parent_ref \u003d self.get_project(parent_id) if parent_id else None"},{"line_number":133,"context_line":"        if project_ref.get(\u0027is_domain\u0027):"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_72cc7c61","line":130,"in_reply_to":"3a50d1a3_acadcf9c","updated":"2015-07-31 19:07:40.000000000","message":"it\u0027s guaranteed that C\u0027s domain is already correctly set, because it has passed the same validation that we are doing here, B as well","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cde9bd5cc2dc8369cf8afe57ef5ffaa8fbddc3ee","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":153,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":154,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":155,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":156,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":157,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":158,"context_line":"        # be set from the parent_id. The domain_id of a project is the"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_6c07c71d","line":155,"updated":"2015-07-31 18:22:58.000000000","message":"can this not be enforced in the controller layer with the validation module?","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"35a61eee4851cde0aec5bf7e9d505fd0d66d72e8","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"},{"line_number":153,"context_line":"        tenant \u003d tenant.copy()"},{"line_number":154,"context_line":"        tenant.setdefault(\u0027enabled\u0027, True)"},{"line_number":155,"context_line":"        tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":156,"context_line":"        tenant.setdefault(\u0027description\u0027, \u0027\u0027)"},{"line_number":157,"context_line":"        # The domain_id is an optional property, that, if not specified, will"},{"line_number":158,"context_line":"        # be set from the parent_id. The domain_id of a project is the"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_12f2d89a","line":155,"in_reply_to":"3a50d1a3_6c07c71d","updated":"2015-07-31 19:07:40.000000000","message":"you are right, but we are just keeping the legacy code (today, it does the same thing)","commit_id":"459ddb7877d987038feb69c42e0a619e1f524daa"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"851136b848ca9aed6d442b7f8efb368a77538922","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                message\u003d_(\u0027cannot create a project acting as a domain under \u0027"},{"line_number":96,"context_line":"                          \u0027%s, which is a regular project.\u0027)"},{"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"}],"source_content_type":"text/x-python","patch_set":95,"id":"1a4dcd0f_788ef8d1","line":98,"updated":"2015-08-13 20:26:07.000000000","message":"It is unclear to me why we are not checking that parent_id, domain_id etc. are correct and don\u0027t clash here - in the same way that we do for regular projects below.  It appears that we are allowing what will soon be illegal hierarchies to be created between the time this patch merges and subsequent ones.  What if we made the cut to liberty just after this patch?","commit_id":"4f5039641af07a4ad906a54b3196a60aa17d7bea"}],"keystone/resource/schema.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"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":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_a81d14bf","line":22,"updated":"2015-04-02 15:34:02.000000000","message":"well not always, update project is fine to pass back in the current domain_id, for instance.  Also, nothing is every really passed in as \"null\". I think you mean that for creates, the controller level will assign the domain_id for is_domain projects, so these must not be specified by the caller.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"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":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_596c439c","line":22,"in_reply_to":"baa041b7_9ed95586","updated":"2015-04-06 17:25:22.000000000","message":"Henry,  if we are not allowing update domain_id in update project, even though we have to allow set the domain_id here and prohib in the controller level,  in all the operations?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"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":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_9ed95586","line":22,"in_reply_to":"baa041b7_a81d14bf","updated":"2015-04-02 22:23:49.000000000","message":"yeah, that sounds right.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3d72245584a782498b94df1a88ed82792d369c87","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":26,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":27,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_68a6ecc2","line":24,"updated":"2015-04-02 15:34:02.000000000","message":"This sounds odd....you mean they both must null?","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"35aa205c7690b3b563406a30d2e19a37c191577f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":26,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":27,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":38,"id":"baa041b7_fef3c108","line":24,"in_reply_to":"baa041b7_68a6ecc2","updated":"2015-04-02 22:23:49.000000000","message":"I think project_id and domain_id must have the same value if it is a domain project","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0603dbf847080134625cc36c20958fd224634e1a","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":26,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":27,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9aa53dc9_4e811b8f","line":24,"in_reply_to":"baa041b7_fef3c108","updated":"2015-04-06 17:25:22.000000000","message":"Lin is correct, project_id and domain_id will be equal.","commit_id":"3545c51671219330758c8c73ab58dc1872914597"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":26,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":27,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_95095298","line":24,"updated":"2015-04-17 17:26:01.000000000","message":"Hmmm...so the domain_id is still required if the is_domain field is False or not provided?","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    # implementation."},{"line_number":22,"context_line":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":26,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":27,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_874da974","line":24,"in_reply_to":"3ab451fb_95095298","updated":"2015-04-17 17:44:26.000000000","message":"Yes, because a domain still behavior as a container of projects, so I can\u0027t have a project without a domain.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"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":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_f74cef43","line":22,"updated":"2015-05-01 13:56:30.000000000","message":"If you want, you could roll this in to the previous comment: \n\n    # NOTE(rodrigods, lbragstad): ...","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"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":"    # NOTE(rodrigods): domain_id must be passed as null in the Controller layer"},{"line_number":23,"context_line":"    # if it is an is_domain project. Both project_id and domain_id fields"},{"line_number":24,"context_line":"    # should match in this case."},{"line_number":25,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_5bb849e5","line":22,"in_reply_to":"3acd31a7_f74cef43","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","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 in the Controller"},{"line_number":22,"context_line":"    # layer if it is an is_domain project. Both project_id and domain_id"},{"line_number":23,"context_line":"    # fields should match in this case."},{"line_number":24,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":25,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":26,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_00873b13","line":23,"updated":"2015-07-04 15:01:05.000000000","message":"in which case?  I thought we just said a caller must set the domain_id to Null? Are you trying to say both should be Null, or that the code will set them both to the same value?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","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 in the Controller"},{"line_number":22,"context_line":"    # layer if it is an is_domain project. Both project_id and domain_id"},{"line_number":23,"context_line":"    # fields should match in this case."},{"line_number":24,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"},{"line_number":25,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":26,"context_line":"    \u0027is_domain\u0027: parameter_types.boolean,"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_a2874cd6","line":23,"in_reply_to":"ba3cc151_00873b13","updated":"2015-07-06 17:21:31.000000000","message":"the latter. The code will set them both to this case. I\u0027ll rephrase","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"b77a77e00d64b827c8586b2598e1b288b88e562c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad, rodrigods): 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 in the Controller"},{"line_number":22,"context_line":"    # layer if it is an is_domain project. Keystone will set project_id as"},{"line_number":23,"context_line":"    # the domain_id in this case."},{"line_number":24,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_c085decf","line":21,"updated":"2015-07-09 23:26:42.000000000","message":"s/Controller/controller/","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"f2b650afc62b1e1b3ab838f0faf50b04a47e737a","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    \u0027description\u0027: validation.nullable(parameter_types.description),"},{"line_number":19,"context_line":"    # NOTE(lbragstad, rodrigods): 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 in the Controller"},{"line_number":22,"context_line":"    # layer if it is an is_domain project. Keystone will set project_id as"},{"line_number":23,"context_line":"    # the domain_id in this case."},{"line_number":24,"context_line":"    \u0027domain_id\u0027: validation.nullable(parameter_types.id_string),"}],"source_content_type":"text/x-python","patch_set":64,"id":"ba3cc151_69cf1d58","line":21,"in_reply_to":"ba3cc151_c085decf","updated":"2015-07-10 01:12:58.000000000","message":"Done","commit_id":"123abdb87e2c0ae3759175307feac760f7e4915f"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6a97c2b3f7e90a7cda1acf3a2c821725c7dc5a63","unresolved":false,"context_lines":[{"line_number":2184,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2185,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":2186,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2187,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2188,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2189,"context_line":"                   \u0027domain_id\u0027: project_id,"},{"line_number":2190,"context_line":"                   \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":47,"id":"dac4157f_e8645b4a","line":2187,"updated":"2015-04-19 09:13:43.000000000","message":"seems odd that we create two uuid project_ids....I\u0027d suggest we either use project_id or project[\u0027id\u0027]...but not both...same comment in other tests","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0c90046857ced0f2c85660251e7d4497088add7f","unresolved":false,"context_lines":[{"line_number":2184,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2185,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":2186,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2187,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2188,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2189,"context_line":"                   \u0027domain_id\u0027: project_id,"},{"line_number":2190,"context_line":"                   \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":47,"id":"dac4157f_c3ba2323","line":2187,"in_reply_to":"dac4157f_e8645b4a","updated":"2015-04-22 12:23:50.000000000","message":"Right, I\u0027ll fix this.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":5614,"context_line":"                        \u0027enabled\u0027: True,"},{"line_number":5615,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":5616,"context_line":"                        \u0027parent_id\u0027: None,"},{"line_number":5617,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":5618,"context_line":"        self.resource_api.create_project(root_project[\u0027id\u0027], root_project)"},{"line_number":5619,"context_line":"        leaf_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":5620,"context_line":"                        \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_55886ae7","line":5617,"updated":"2015-04-17 17:26:01.000000000","message":"Do we have to use is_domain everywhere? Is it possible for requests where the user doesn\u0027t provide this and if so is that still tested?","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"5746ac0aafb85ff00474742fc26bffb33e94e37d","unresolved":false,"context_lines":[{"line_number":5614,"context_line":"                        \u0027enabled\u0027: True,"},{"line_number":5615,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":5616,"context_line":"                        \u0027parent_id\u0027: None,"},{"line_number":5617,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":5618,"context_line":"        self.resource_api.create_project(root_project[\u0027id\u0027], root_project)"},{"line_number":5619,"context_line":"        leaf_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":5620,"context_line":"                        \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":47,"id":"bab921fb_d172f848","line":5617,"in_reply_to":"3ab451fb_07c5198d","updated":"2015-04-24 15:02:22.000000000","message":"The other reason, is that we need to match the return, as we have done putting the description, enabled, parent_id...","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":5614,"context_line":"                        \u0027enabled\u0027: True,"},{"line_number":5615,"context_line":"                        \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":5616,"context_line":"                        \u0027parent_id\u0027: None,"},{"line_number":5617,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":5618,"context_line":"        self.resource_api.create_project(root_project[\u0027id\u0027], root_project)"},{"line_number":5619,"context_line":"        leaf_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":5620,"context_line":"                        \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_07c5198d","line":5617,"in_reply_to":"3ab451fb_55886ae7","updated":"2015-04-17 17:44:26.000000000","message":"If the user don\u0027t provide, the default value will be False, but we think that include this information in the test it\u0027s good because we are explicit saying that this is only a project.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":2148,"context_line":"                               a project with one child."},{"line_number":2149,"context_line":"        :param domain_id: domain where the projects hierarchy will be created."},{"line_number":2150,"context_line":"        :param is_domain: if the hierarchy will have the is_domain flag active"},{"line_number":2151,"context_line":"                          or not. The domain_id is overriden with the"},{"line_number":2152,"context_line":"                          project_id in the case where is_domain is True."},{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"        :returns projects: a list of the projects in the created hierarchy."}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_576283ae","line":2151,"updated":"2015-05-01 13:56:30.000000000","message":"overridden*","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":2148,"context_line":"                               a project with one child."},{"line_number":2149,"context_line":"        :param domain_id: domain where the projects hierarchy will be created."},{"line_number":2150,"context_line":"        :param is_domain: if the hierarchy will have the is_domain flag active"},{"line_number":2151,"context_line":"                          or not. The domain_id is overriden with the"},{"line_number":2152,"context_line":"                          project_id in the case where is_domain is True."},{"line_number":2153,"context_line":""},{"line_number":2154,"context_line":"        :returns projects: a list of the projects in the created hierarchy."}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_dbc45960","line":2151,"in_reply_to":"3acd31a7_576283ae","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":2249,"context_line":"                   \u0027parent_id\u0027: parent[\u0027id\u0027],"},{"line_number":2250,"context_line":"                   \u0027is_domain\u0027: False}"},{"line_number":2251,"context_line":""},{"line_number":2252,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2253,"context_line":"        self.assertFalse(ref.get(\u0027is_domain\u0027))"},{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"    def test_create_project_without_is_domain_flag(self):"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_9716dbef","line":2252,"updated":"2015-05-01 13:56:30.000000000","message":"Should we assert that the ref.get(\u0027parent_id\u0027) is in fact parent[\u0027id\u0027]?","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":2249,"context_line":"                   \u0027parent_id\u0027: parent[\u0027id\u0027],"},{"line_number":2250,"context_line":"                   \u0027is_domain\u0027: False}"},{"line_number":2251,"context_line":""},{"line_number":2252,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2253,"context_line":"        self.assertFalse(ref.get(\u0027is_domain\u0027))"},{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"    def test_create_project_without_is_domain_flag(self):"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_7bac25a0","line":2252,"in_reply_to":"3acd31a7_9716dbef","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"975536765d632c09e45452d945ee98610f54eba8","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"        return projects"},{"line_number":2182,"context_line":""},{"line_number":2183,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2184,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":2185,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2186,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2187,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":57,"id":"7a016987_97451244","line":2184,"updated":"2015-05-22 22:41:54.000000000","message":"you are just creating domain , don\u0027t worry bout labling them project_is_domain","commit_id":"7127d8cb7bb4635113964ca5badd1fd7350a9639"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":2996,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027],"},{"line_number":2997,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":2998,"context_line":""},{"line_number":2999,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3000,"context_line":"                          self.resource_api.create_project,"},{"line_number":3001,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":3002,"context_line":"                          leaf_project)"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_e00fb786","line":2999,"updated":"2015-07-04 15:01:05.000000000","message":"this seems odd....so we are changing the exception raised in the current case (since, by definition, is_domain is effectively False in today\u0027s code)....shouldn\u0027t that be in a separate patch?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":2996,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027],"},{"line_number":2997,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":2998,"context_line":""},{"line_number":2999,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3000,"context_line":"                          self.resource_api.create_project,"},{"line_number":3001,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":3002,"context_line":"                          leaf_project)"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_edf78e8a","line":2999,"in_reply_to":"ba3cc151_e00fb786","updated":"2015-07-06 17:21:31.000000000","message":"I guess the ForbiddenAction was wrong all the time. A ValidationError fits better in this case to me... We are kind of modifying the restriction in this patch, so I think it\u0027s the right place to modify this.","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2a4dcc87764c91128edd6cecbcaf8280b6114c27","unresolved":false,"context_lines":[{"line_number":2996,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027],"},{"line_number":2997,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":2998,"context_line":""},{"line_number":2999,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3000,"context_line":"                          self.resource_api.create_project,"},{"line_number":3001,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":3002,"context_line":"                          leaf_project)"}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_84194ad3","line":2999,"updated":"2015-07-09 13:17:57.000000000","message":"As per my comment on the previous patch, I think I\u0027d ideally prefer this in a separate patch (one that this perhaps was dependant on)","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6e9874d615855933c08f1cafef288dae431318bd","unresolved":false,"context_lines":[{"line_number":2996,"context_line":"                        \u0027parent_id\u0027: root_project[\u0027id\u0027],"},{"line_number":2997,"context_line":"                        \u0027is_domain\u0027: False}"},{"line_number":2998,"context_line":""},{"line_number":2999,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3000,"context_line":"                          self.resource_api.create_project,"},{"line_number":3001,"context_line":"                          leaf_project[\u0027id\u0027],"},{"line_number":3002,"context_line":"                          leaf_project)"}],"source_content_type":"text/x-python","patch_set":63,"id":"ba3cc151_ab5527c2","line":2999,"in_reply_to":"ba3cc151_84194ad3","updated":"2015-07-09 19:48:21.000000000","message":"ok, I\u0027ll do this in a separate patch.","commit_id":"8ee4be9ee583ecf14d14ecfc7fdb1b765bf341d5"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f28eb43cb16b81d7718d1edfda2463e55c06b78","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"        return projects"},{"line_number":2182,"context_line":""},{"line_number":2183,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2184,"context_line":"    def test_create_domain(self):"},{"line_number":2185,"context_line":"        # TODO(htruta): Pass None as domain_id"},{"line_number":2186,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2187,"context_line":"        project \u003d {\u0027id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_ab0d15ea","line":2184,"updated":"2015-07-24 07:18:12.000000000","message":"maybe call it something like \"test_create_domain_with_project_api\" ?","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bb55948b4d18634160f743d2fc90b1e9b7e2a367","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"        return projects"},{"line_number":2182,"context_line":""},{"line_number":2183,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2184,"context_line":"    def test_create_domain(self):"},{"line_number":2185,"context_line":"        # TODO(htruta): Pass None as domain_id"},{"line_number":2186,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2187,"context_line":"        project \u003d {\u0027id\u0027: project_id,"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_ddae00e7","line":2184,"in_reply_to":"3a50d1a3_ab0d15ea","updated":"2015-07-24 17:38:24.000000000","message":"Done","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9f28eb43cb16b81d7718d1edfda2463e55c06b78","unresolved":false,"context_lines":[{"line_number":2261,"context_line":"                          self.resource_api.create_project,"},{"line_number":2262,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":2263,"context_line":""},{"line_number":2264,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":2265,"context_line":"    def test_create_project_under_domain_hierarchy(self):"},{"line_number":2266,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(is_domain\u003dTrue)"},{"line_number":2267,"context_line":"        parent \u003d projects_hierarchy[1]"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_4b51f1d7","line":2264,"updated":"2015-07-24 07:18:12.000000000","message":"still don\u0027t understand why this is here...all this is doing is making the test skip if it fails....and I don\u0027t understand why we expect it to fail...","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bb55948b4d18634160f743d2fc90b1e9b7e2a367","unresolved":false,"context_lines":[{"line_number":2261,"context_line":"                          self.resource_api.create_project,"},{"line_number":2262,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":2263,"context_line":""},{"line_number":2264,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":2265,"context_line":"    def test_create_project_under_domain_hierarchy(self):"},{"line_number":2266,"context_line":"        projects_hierarchy \u003d self._create_projects_hierarchy(is_domain\u003dTrue)"},{"line_number":2267,"context_line":"        parent \u003d projects_hierarchy[1]"}],"source_content_type":"text/x-python","patch_set":75,"id":"3a50d1a3_1d08e827","line":2264,"in_reply_to":"3a50d1a3_4b51f1d7","updated":"2015-07-24 17:38:24.000000000","message":"actually this fails because we are setting the domain_id to be parent\u0027s id, this isn\u0027t possible yet since the domain_id column still points to the domain table","commit_id":"afe1e15e3e54b34d4491d3b55eda31b747898fce"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":2150,"context_line":"        :param domain_id: domain where the projects hierarchy will be created."},{"line_number":2151,"context_line":"        :param is_domain: if the hierarchy will have the is_domain flag active"},{"line_number":2152,"context_line":"                          or not. The domain_id is overridden with the"},{"line_number":2153,"context_line":"                          project_id in the case where is_domain is True."},{"line_number":2154,"context_line":""},{"line_number":2155,"context_line":"        :returns projects: a list of the projects in the created hierarchy."},{"line_number":2156,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_82effae7","line":2153,"updated":"2015-07-29 14:27:50.000000000","message":"please fix the description, because it is not true with this patch.","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":2150,"context_line":"        :param domain_id: domain where the projects hierarchy will be created."},{"line_number":2151,"context_line":"        :param is_domain: if the hierarchy will have the is_domain flag active"},{"line_number":2152,"context_line":"                          or not. The domain_id is overridden with the"},{"line_number":2153,"context_line":"                          project_id in the case where is_domain is True."},{"line_number":2154,"context_line":""},{"line_number":2155,"context_line":"        :returns projects: a list of the projects in the created hierarchy."},{"line_number":2156,"context_line":""}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_d457f557","line":2153,"in_reply_to":"3a50d1a3_82effae7","updated":"2015-07-29 17:09:39.000000000","message":"Done","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":2220,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref.get(\u0027domain_id\u0027))"},{"line_number":2221,"context_line":""},{"line_number":2222,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2223,"context_line":"    def test_is_domain_sub_project_has_parent_domain_id(self):"},{"line_number":2224,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2225,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2226,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_e2ad9e31","line":2223,"updated":"2015-07-29 14:27:50.000000000","message":"I don\u0027t understand. Does this test do what it says in the function name or not? Why is the actual check in TODO?","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":2220,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref.get(\u0027domain_id\u0027))"},{"line_number":2221,"context_line":""},{"line_number":2222,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2223,"context_line":"    def test_is_domain_sub_project_has_parent_domain_id(self):"},{"line_number":2224,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2225,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2226,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_b9ad8432","line":2223,"in_reply_to":"3a50d1a3_e2ad9e31","updated":"2015-07-29 17:09:39.000000000","message":"changed the TODO message in order to make clearer why this is a TODO","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":2367,"context_line":"                    \u0027enabled\u0027: True,"},{"line_number":2368,"context_line":"                    \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2369,"context_line":"                    \u0027parent_id\u0027: project2[\u0027id\u0027],"},{"line_number":2370,"context_line":"                    \u0027is_domain\u0027: False}"},{"line_number":2371,"context_line":"        self.resource_api.create_project(project4[\u0027id\u0027], project4)"},{"line_number":2372,"context_line":""},{"line_number":2373,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project1[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_ae046749","line":2370,"updated":"2015-07-29 14:27:50.000000000","message":"I am concerned that you set `\u0027is_domain\u0027: False` in this test and in tests below. Will the tests work without this change? If yes, remove the change. If no, won\u0027t the change break backward compatibility with clients?","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3b58194b1c2e3a977874a4d798a404100643f340","unresolved":false,"context_lines":[{"line_number":2367,"context_line":"                    \u0027enabled\u0027: True,"},{"line_number":2368,"context_line":"                    \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2369,"context_line":"                    \u0027parent_id\u0027: project2[\u0027id\u0027],"},{"line_number":2370,"context_line":"                    \u0027is_domain\u0027: False}"},{"line_number":2371,"context_line":"        self.resource_api.create_project(project4[\u0027id\u0027], project4)"},{"line_number":2372,"context_line":""},{"line_number":2373,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project1[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_bda80d8d","line":2370,"in_reply_to":"3a50d1a3_1460fda3","updated":"2015-07-29 17:53:29.000000000","message":"Oh, it\u0027s for comparison. OK. Are you making sure anywhere that old calls (without explicit is_domain\u003dFalse) still work?","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":2367,"context_line":"                    \u0027enabled\u0027: True,"},{"line_number":2368,"context_line":"                    \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2369,"context_line":"                    \u0027parent_id\u0027: project2[\u0027id\u0027],"},{"line_number":2370,"context_line":"                    \u0027is_domain\u0027: False}"},{"line_number":2371,"context_line":"        self.resource_api.create_project(project4[\u0027id\u0027], project4)"},{"line_number":2372,"context_line":""},{"line_number":2373,"context_line":"        subtree \u003d self.resource_api.list_projects_in_subtree(project1[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_1460fda3","line":2370,"in_reply_to":"3a50d1a3_ae046749","updated":"2015-07-29 17:09:39.000000000","message":"You mean, without setting it explicitly? They will work, we are just passing it here to ease the comparison in the asserts below.\n\nAll Reseller changes includes client changes as well (it was predicted in the spec).","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3c1686495d5f0451a08eb44060c5e0edb249a0b","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"        # if is_domain is True, then its parent_id and its domain_id will"},{"line_number":2168,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2169,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2170,"context_line":"        # that acts as domain."},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"        self.resource_api.create_project(project_id, project)"},{"line_number":2173,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_838eeece","line":2170,"updated":"2015-07-30 10:58:52.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c20fd01a2ed3a0718e39c95527470ccf23b72481","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"        # if is_domain is True, then its parent_id and its domain_id will"},{"line_number":2168,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2169,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2170,"context_line":"        # that acts as domain."},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"        self.resource_api.create_project(project_id, project)"},{"line_number":2173,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_b5e0fd97","line":2170,"in_reply_to":"3a50d1a3_838eeece","updated":"2015-07-30 11:15:22.000000000","message":"this test isn\u0027t following the expected behavior yet. We have 2 options:\n\n- write a test that passes in this patch and put a TODO \n- write a test that doesn\u0027t pass in this patch and use the WIP decorator\n\nWhat do you think?","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"a48fb2eefbb6f0e0ff72d0e22a08eea42dc2f36b","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"        # if is_domain is True, then its parent_id and its domain_id will"},{"line_number":2168,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2169,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2170,"context_line":"        # that acts as domain."},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"        self.resource_api.create_project(project_id, project)"},{"line_number":2173,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_98a89822","line":2170,"in_reply_to":"3a50d1a3_981bb873","updated":"2015-07-30 11:39:51.000000000","message":"I agree with that. Please remove all mentions of what \"will be\".","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a5911e25e130facd6fa1e4184b1e39186b913c5b","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"        # if is_domain is True, then its parent_id and its domain_id will"},{"line_number":2168,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2169,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2170,"context_line":"        # that acts as domain."},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"        self.resource_api.create_project(project_id, project)"},{"line_number":2173,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_94d13832","line":2170,"in_reply_to":"3a50d1a3_98a89822","updated":"2015-07-30 14:53:25.000000000","message":"Done","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4e5f1ed12871edc2745dd8af5b44a556b4137831","unresolved":false,"context_lines":[{"line_number":2167,"context_line":"        # if is_domain is True, then its parent_id and its domain_id will"},{"line_number":2168,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2169,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2170,"context_line":"        # that acts as domain."},{"line_number":2171,"context_line":""},{"line_number":2172,"context_line":"        self.resource_api.create_project(project_id, project)"},{"line_number":2173,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_981bb873","line":2170,"in_reply_to":"3a50d1a3_b5e0fd97","updated":"2015-07-30 11:22:05.000000000","message":"Tests should test the functionality of this patch.  Period. TODOs should really only be used when there is a bug to be fixed, and this bug is referenced in the code.  The TODOs in these tests make it much harder to review.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3c1686495d5f0451a08eb44060c5e0edb249a0b","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"            # TODO(rodrigods): For non root projects, we will have the"},{"line_number":2184,"context_line":"            # following invariants: if is_domain is True, its domain_id"},{"line_number":2185,"context_line":"            # will be its parent\u0027s id. If is_domain is False, the domain_id"},{"line_number":2186,"context_line":"            # will be its parent\u0027s domain_id."},{"line_number":2187,"context_line":""},{"line_number":2188,"context_line":"            new_project[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":2189,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_23ba7a72","line":2186,"updated":"2015-07-30 10:58:52.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a5911e25e130facd6fa1e4184b1e39186b913c5b","unresolved":false,"context_lines":[{"line_number":2183,"context_line":"            # TODO(rodrigods): For non root projects, we will have the"},{"line_number":2184,"context_line":"            # following invariants: if is_domain is True, its domain_id"},{"line_number":2185,"context_line":"            # will be its parent\u0027s id. If is_domain is False, the domain_id"},{"line_number":2186,"context_line":"            # will be its parent\u0027s domain_id."},{"line_number":2187,"context_line":""},{"line_number":2188,"context_line":"            new_project[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":2189,"context_line":""}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_b4d6b425","line":2186,"in_reply_to":"3a50d1a3_23ba7a72","updated":"2015-07-30 14:53:25.000000000","message":"Done","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3c1686495d5f0451a08eb44060c5e0edb249a0b","unresolved":false,"context_lines":[{"line_number":2200,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2201,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2202,"context_line":"        # that acts as domain. We should update this test once these"},{"line_number":2203,"context_line":"        # invariants are implemented."},{"line_number":2204,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2205,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2206,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_03b97e79","line":2203,"updated":"2015-07-30 10:58:52.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a5911e25e130facd6fa1e4184b1e39186b913c5b","unresolved":false,"context_lines":[{"line_number":2200,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2201,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2202,"context_line":"        # that acts as domain. We should update this test once these"},{"line_number":2203,"context_line":"        # invariants are implemented."},{"line_number":2204,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2205,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2206,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_54dbb04f","line":2203,"in_reply_to":"3a50d1a3_03b97e79","updated":"2015-07-30 14:53:25.000000000","message":"Done","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3c1686495d5f0451a08eb44060c5e0edb249a0b","unresolved":false,"context_lines":[{"line_number":2256,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2257,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2258,"context_line":"        # that acts as domain. We should update this test once these"},{"line_number":2259,"context_line":"        # invariants are implemented."},{"line_number":2260,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2261,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2262,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_63a88221","line":2259,"updated":"2015-07-30 10:58:52.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a5911e25e130facd6fa1e4184b1e39186b913c5b","unresolved":false,"context_lines":[{"line_number":2256,"context_line":"        # be None - the domain_id argument will be ignored. If is_domain is"},{"line_number":2257,"context_line":"        # False, the parent_id and domain_id will point to the same project"},{"line_number":2258,"context_line":"        # that acts as domain. We should update this test once these"},{"line_number":2259,"context_line":"        # invariants are implemented."},{"line_number":2260,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2261,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2262,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_d4efc0e7","line":2259,"in_reply_to":"3a50d1a3_63a88221","updated":"2015-07-30 14:53:25.000000000","message":"Done for all TODOs in this file","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a3c1686495d5f0451a08eb44060c5e0edb249a0b","unresolved":false,"context_lines":[{"line_number":2303,"context_line":"        # TODO(rodrigods): The domain table will be dropped and the domain_id"},{"line_number":2304,"context_line":"        # column will point to the project table, we should update the test"},{"line_number":2305,"context_line":"        # so the domain_id column of the subproject points to another project"},{"line_number":2306,"context_line":"        # (its parent_id) for this case."},{"line_number":2307,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2308,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2309,"context_line":"                   \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":81,"id":"3a50d1a3_83a58e48","line":2306,"updated":"2015-07-30 10:58:52.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"f603628f592e4fb329e9301fd8c7d0002b8f98f7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95e42381b2bb53dce601c4e548e4af25954d968e","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2194,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2195,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2196,"context_line":"        self.assertTrue(ref.get(\u0027is_domain\u0027))"},{"line_number":2197,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref.get(\u0027domain_id\u0027))"},{"line_number":2198,"context_line":""},{"line_number":2199,"context_line":"    @tests.skip_if_no_multiple_domains_support"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_610bb22c","line":2196,"updated":"2015-08-07 18:31:40.000000000","message":"Why are we using .get for all of these tests? Is there a case where we expect the key to not be in the ref?","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fc4491c03696ee5c77ed44caa3f363f5d07c9615","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2194,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2195,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2196,"context_line":"        self.assertTrue(ref.get(\u0027is_domain\u0027))"},{"line_number":2197,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref.get(\u0027domain_id\u0027))"},{"line_number":2198,"context_line":""},{"line_number":2199,"context_line":"    @tests.skip_if_no_multiple_domains_support"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_75a2889c","line":2196,"in_reply_to":"1a4dcd0f_610bb22c","updated":"2015-08-07 19:47:32.000000000","message":"not in these cases... just programming style. I\u0027ll change that","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"908ae2ad69d8778aa2d821d45a8d85d13807dafc","unresolved":false,"context_lines":[{"line_number":2193,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2194,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2195,"context_line":"        ref \u003d self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2196,"context_line":"        self.assertTrue(ref.get(\u0027is_domain\u0027))"},{"line_number":2197,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref.get(\u0027domain_id\u0027))"},{"line_number":2198,"context_line":""},{"line_number":2199,"context_line":"    @tests.skip_if_no_multiple_domains_support"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_24e4d8aa","line":2196,"in_reply_to":"1a4dcd0f_610bb22c","updated":"2015-08-12 12:57:08.000000000","message":"not really, just programming style I guess","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"}],"keystone/tests/unit/test_backend_ldap.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"        # Returning projects to be used across the tests"},{"line_number":1640,"context_line":"        return [project1, project2]"},{"line_number":1641,"context_line":""},{"line_number":1642,"context_line":"    def _assert_create_is_domain_project_not_allowed(self):"},{"line_number":1643,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1644,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_55bbca72","line":1641,"updated":"2015-04-17 17:26:01.000000000","message":"I see two new test cases that you need here in addition to what already existed: one for is_domain\u003d\u003dTrue and one for is_domain\u003d\u003dFalse","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"        # Returning projects to be used across the tests"},{"line_number":1640,"context_line":"        return [project1, project2]"},{"line_number":1641,"context_line":""},{"line_number":1642,"context_line":"    def _assert_create_is_domain_project_not_allowed(self):"},{"line_number":1643,"context_line":"        domain \u003d self._get_domain_fixture()"},{"line_number":1644,"context_line":"        project \u003d {\u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_67317da2","line":1641,"in_reply_to":"3ab451fb_55bbca72","updated":"2015-04-17 17:44:26.000000000","message":"We updated the test_project_crud with the is_domain\u003d\u003dFalse case, and  _assert_create_is_domain_project_not_allowed test the is_domain\u003d\u003dTrue case. Besides that, I need create a test for is_domain\u003d\u003dFalse case?","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"                          self.resource_api.create_project,"},{"line_number":1654,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1655,"context_line":""},{"line_number":1656,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":1657,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"    def test_create_is_domain_project_under_project_hierarchy(self):"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_3555de4f","line":1656,"updated":"2015-04-17 17:26:01.000000000","message":"Is there some magic with these test methods that make them test something different? There are 4 methods with only 2 real, unique tests.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"                          self.resource_api.create_project,"},{"line_number":1654,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1655,"context_line":""},{"line_number":1656,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":1657,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"    def test_create_is_domain_project_under_project_hierarchy(self):"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_67d85d54","line":1656,"in_reply_to":"3ab451fb_3555de4f","updated":"2015-04-17 17:44:26.000000000","message":"No, there isn\u0027t. \u003dP We have done one this way because the test coverage the both behaviors in the same method but I\u0027ll create different tests for each case.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":1659,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"    def test_create_not_is_domain_project_under_is_domain_hierarchy(self):"},{"line_number":1662,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":1665,"context_line":"        self._assert_create_is_domain_project_not_allowed()"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_f7962f4b","line":1662,"updated":"2015-05-01 13:56:30.000000000","message":"this test case is running the same code as the test case above, yet they have different names but the same outcome?","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":1659,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"    def test_create_not_is_domain_project_under_is_domain_hierarchy(self):"},{"line_number":1662,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":1665,"context_line":"        self._assert_create_is_domain_project_not_allowed()"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_bbc87d23","line":1662,"in_reply_to":"3acd31a7_f7962f4b","updated":"2015-05-04 13:59:48.000000000","message":"No, this test covers both behaviors. maybe I can create two different tests for this.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":1655,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def test_create_is_domain_project_under_project_hierarchy(self):"},{"line_number":1658,"context_line":"        self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_62042e14","line":1655,"updated":"2015-07-29 14:27:50.000000000","message":"test name says test_delete, but we call _assert_create. And we call create_project in the _assert_... function.","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":1655,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def test_create_is_domain_project_under_project_hierarchy(self):"},{"line_number":1658,"context_line":"        self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_f4b471f1","line":1655,"in_reply_to":"3a50d1a3_62042e14","updated":"2015-07-29 17:09:39.000000000","message":"if we can\u0027t create an is_domain project than we can\u0027t delete it...","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3b58194b1c2e3a977874a4d798a404100643f340","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                          project[\u0027id\u0027], project)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":1655,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def test_create_is_domain_project_under_project_hierarchy(self):"},{"line_number":1658,"context_line":"        self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_1d3101a2","line":1655,"in_reply_to":"3a50d1a3_f4b471f1","updated":"2015-07-29 17:53:29.000000000","message":"That is assumed. It would be good to have it in stone. It will 1) assure us that deleting indeed doesn\u0027t work 2) save us from explaining newcomers this not-so-obvious fact","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"343c551ac9bd82de6bc5f4e379576f3017879d8b","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            self.assertDictEqual(exp_extra, extra, msg)"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    def test_project_is_domain_upgrade(self):"},{"line_number":536,"context_line":"        self.upgrade(67)"},{"line_number":537,"context_line":"        self.assertTableColumns(\u0027project\u0027,"},{"line_number":538,"context_line":"                                [\u0027id\u0027, \u0027name\u0027, \u0027extra\u0027, \u0027description\u0027,"},{"line_number":539,"context_line":"                                 \u0027enabled\u0027, \u0027domain_id\u0027, \u0027parent_id\u0027,"}],"source_content_type":"text/x-python","patch_set":37,"id":"baa041b7_85e244d4","line":536,"updated":"2015-04-02 09:11:30.000000000","message":"67 has already been taken....need to move your migration number up....","commit_id":"7432fd4b5893db6f0c978250a60b86ee792236a0"}],"keystone/tests/unit/test_v2_controller.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95e42381b2bb53dce601c4e548e4af25954d968e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.assignment import controllers as assignment_controllers"},{"line_number":19,"context_line":"from keystone.exception import ProjectNotFound"},{"line_number":20,"context_line":"from keystone.resource import controllers as resource_controllers"},{"line_number":21,"context_line":"from keystone.tests import unit as tests"},{"line_number":22,"context_line":"from keystone.tests.unit import default_fixtures"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_c40c143e","line":19,"updated":"2015-08-07 18:31:40.000000000","message":"import the module","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"908ae2ad69d8778aa2d821d45a8d85d13807dafc","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.assignment import controllers as assignment_controllers"},{"line_number":19,"context_line":"from keystone.exception import ProjectNotFound"},{"line_number":20,"context_line":"from keystone.resource import controllers as resource_controllers"},{"line_number":21,"context_line":"from keystone.tests import unit as tests"},{"line_number":22,"context_line":"from keystone.tests.unit import default_fixtures"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_44e1e499","line":19,"in_reply_to":"1a4dcd0f_c40c143e","updated":"2015-08-12 12:57:08.000000000","message":"Done","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"fc4491c03696ee5c77ed44caa3f363f5d07c9615","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import uuid"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.assignment import controllers as assignment_controllers"},{"line_number":19,"context_line":"from keystone.exception import ProjectNotFound"},{"line_number":20,"context_line":"from keystone.resource import controllers as resource_controllers"},{"line_number":21,"context_line":"from keystone.tests import unit as tests"},{"line_number":22,"context_line":"from keystone.tests.unit import default_fixtures"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_6a25c708","line":19,"in_reply_to":"1a4dcd0f_c40c143e","updated":"2015-08-07 19:47:32.000000000","message":"Done","commit_id":"62aa416d02da1e053d6102fcc784c86ff1094b42"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"fd9d90a1d8a4e21f4a64380d68d49581d5df8dd9","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        ref \u003d self.new_ref()"},{"line_number":304,"context_line":"        ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":305,"context_line":"        ref[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":306,"context_line":"        ref[\u0027is_domain\u0027] \u003d is_domain"},{"line_number":307,"context_line":"        return ref"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def new_user_ref(self, domain_id, project_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_95f39273","line":306,"updated":"2015-04-17 17:26:01.000000000","message":"I may default this to None and not include it if it\u0027s None. And then when you specifically want it set you can just use True or False. This is under the assumption that users don\u0027t have to specify this value.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"90cb780ad35a2a212b7615dcb6f39b2817d0e8f3","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        ref \u003d self.new_ref()"},{"line_number":304,"context_line":"        ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":305,"context_line":"        ref[\u0027parent_id\u0027] \u003d parent_id"},{"line_number":306,"context_line":"        ref[\u0027is_domain\u0027] \u003d is_domain"},{"line_number":307,"context_line":"        return ref"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    def new_user_ref(self, domain_id, project_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":47,"id":"3ab451fb_678dfd30","line":306,"in_reply_to":"3ab451fb_95f39273","updated":"2015-04-17 17:44:26.000000000","message":"Right, I liked your suggestion, I\u0027ll update this patch with this behavior.","commit_id":"dcb92e23c88b74065bf3bcad8d65cebf805fd676"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":949,"context_line":"    def assertValidProject(self, entity, ref\u003dNone):"},{"line_number":950,"context_line":"        self.assertIsNotNone(entity.get(\u0027domain_id\u0027))"},{"line_number":951,"context_line":"        if ref:"},{"line_number":952,"context_line":"            if ref[\u0027is_domain\u0027]:"},{"line_number":953,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027parent_id\u0027])"},{"line_number":954,"context_line":"            else:"},{"line_number":955,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_dc22c9b8","line":952,"updated":"2015-07-29 14:27:50.000000000","message":"I don\u0027t see any new usage of assertValidProject in the patchset. Does the change break compatibility? If no, this change should be reverted.","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":949,"context_line":"    def assertValidProject(self, entity, ref\u003dNone):"},{"line_number":950,"context_line":"        self.assertIsNotNone(entity.get(\u0027domain_id\u0027))"},{"line_number":951,"context_line":"        if ref:"},{"line_number":952,"context_line":"            if ref[\u0027is_domain\u0027]:"},{"line_number":953,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027parent_id\u0027])"},{"line_number":954,"context_line":"            else:"},{"line_number":955,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_54744534","line":952,"in_reply_to":"3a50d1a3_dc22c9b8","updated":"2015-07-29 17:09:39.000000000","message":"you are right, I\u0027ll revert it","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"8025ead6029a86b64f0ef46ab4702200caba69de","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        ref \u003d self.new_project_ref(domain_id\u003duuid.uuid4().hex)"},{"line_number":527,"context_line":"        self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref}, expected_status\u003d400)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d1, is_domain\u003dFalse):"},{"line_number":530,"context_line":"        \"\"\"Creates a single-branched project hierarchy with the specified size."},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        :param hierarchy_size: the desired hierarchy size, default is 1 -"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_b74116ab","line":529,"updated":"2015-07-29 14:27:50.000000000","message":"I don\u0027t see any new tests using this function. Why do you need to change it?","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"48e1619e81423e60fa570cd04dc5084317f17467","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        ref \u003d self.new_project_ref(domain_id\u003duuid.uuid4().hex)"},{"line_number":527,"context_line":"        self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref}, expected_status\u003d400)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d1, is_domain\u003dFalse):"},{"line_number":530,"context_line":"        \"\"\"Creates a single-branched project hierarchy with the specified size."},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        :param hierarchy_size: the desired hierarchy size, default is 1 -"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_d48055c1","line":529,"in_reply_to":"3a50d1a3_b74116ab","updated":"2015-07-29 17:09:39.000000000","message":"the projects refs will now return the is_domain field, we are not adding new tests but we need to assert the field returned","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"3b58194b1c2e3a977874a4d798a404100643f340","unresolved":false,"context_lines":[{"line_number":526,"context_line":"        ref \u003d self.new_project_ref(domain_id\u003duuid.uuid4().hex)"},{"line_number":527,"context_line":"        self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref}, expected_status\u003d400)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d1, is_domain\u003dFalse):"},{"line_number":530,"context_line":"        \"\"\"Creates a single-branched project hierarchy with the specified size."},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        :param hierarchy_size: the desired hierarchy size, default is 1 -"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_80604802","line":529,"in_reply_to":"3a50d1a3_d48055c1","updated":"2015-07-29 17:53:29.000000000","message":"I reverted this change and ran tests. None failed. So the change seems to be not necessary.","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4c5b1c715729644dceea9ade626282b5cf872158","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_1dd3a105","line":533,"updated":"2015-08-11 17:41:38.000000000","message":"I really suggest we don\u0027t do that...use a domain scoped token instead for this test.  See https://bugs.launchpad.net/keystone/+bug/1482330","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cc831ebad86e4444d35bfb98f66c936843f8e499","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_80850ad0","line":533,"in_reply_to":"1a4dcd0f_1dd3a105","updated":"2015-08-11 18:24:51.000000000","message":"Done","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1ebab6197afb294ce1a3107d8160984c04fef8b0","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_66b1f600","line":533,"in_reply_to":"1a4dcd0f_26b1ae47","updated":"2015-08-11 18:37:55.000000000","message":"yeah... then, I\u0027ll keep the test like it is","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bd5060a791b4bdf9d1227ecc7f109314cb823f51","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_26b1ae47","line":533,"in_reply_to":"1a4dcd0f_4612ba58","updated":"2015-08-11 18:33:24.000000000","message":"we\u0027ll we are going deprecate the use of default domain in this cycle, so not sure we want our own tests generating deprecated messages....","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cade6d941c61d2361bdb8f0f842d9f150b9c96de","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_912c7a03","line":533,"in_reply_to":"1a4dcd0f_463e3a29","updated":"2015-08-11 19:02:33.000000000","message":"ok, I got it... but we will change this behavior in https://review.openstack.org/#/c/143763/ , see my comment in the commit message","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0dee062408b19dbb7ab21ef0e253497d01fde317","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_463e3a29","line":533,"in_reply_to":"1a4dcd0f_66b1f600","updated":"2015-08-11 18:41:48.000000000","message":"sorry, maybe I wasn\u0027t clear...no, I don\u0027t think we can keep the test as is....we should not be using undocumented (and deprecated) features in our tests","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b9a755ad48149ec8748d60ba8b1b6b3853a85f75","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        \"\"\"Call ``POST /projects``.\"\"\""},{"line_number":531,"context_line":"        # Without domain_id and parent_id, the domain_id should be"},{"line_number":532,"context_line":"        # normalized to the domain default since we are using a project"},{"line_number":533,"context_line":"        # scoped token."},{"line_number":534,"context_line":"        ref \u003d self.new_project_ref()"},{"line_number":535,"context_line":"        r \u003d self.post("},{"line_number":536,"context_line":"            \u0027/projects\u0027,"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_4612ba58","line":533,"in_reply_to":"1a4dcd0f_80850ad0","updated":"2015-08-11 18:27:47.000000000","message":"actually, we can\u0027t use a domain scoped token here because the policy. We can try to update it similarly test_v3_protection, but would be worthed?","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4c5b1c715729644dceea9ade626282b5cf872158","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            body\u003d{\u0027project\u0027: ref})"},{"line_number":538,"context_line":"        ref[\u0027domain_id\u0027] \u003d CONF.identity.default_domain_id"},{"line_number":539,"context_line":"        self.assertValidProjectResponse(r, ref)"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d1):"},{"line_number":542,"context_line":"        \"\"\"Creates a single-branched project hierarchy with the specified size."},{"line_number":543,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_fd1a75c5","line":540,"updated":"2015-08-11 17:41:38.000000000","message":"Shouldn\u0027t we also have a test for the case when parent_id is set?  ...if we are supporting not providing a domain_id via the controller call, we should test all options.","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"cc831ebad86e4444d35bfb98f66c936843f8e499","unresolved":false,"context_lines":[{"line_number":537,"context_line":"            body\u003d{\u0027project\u0027: ref})"},{"line_number":538,"context_line":"        ref[\u0027domain_id\u0027] \u003d CONF.identity.default_domain_id"},{"line_number":539,"context_line":"        self.assertValidProjectResponse(r, ref)"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def _create_projects_hierarchy(self, hierarchy_size\u003d1):"},{"line_number":542,"context_line":"        \"\"\"Creates a single-branched project hierarchy with the specified size."},{"line_number":543,"context_line":""}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_6080febf","line":540,"in_reply_to":"1a4dcd0f_fd1a75c5","updated":"2015-08-11 18:24:51.000000000","message":"Done","commit_id":"445ad14f36ac842e8dab654cd00b90d7317c51a9"}],"keystone/tests/unit/test_validation.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def test_validate_project_update_request_with_valid_domain_id(self):"},{"line_number":422,"context_line":"        \"\"\"Test that we validate `domain_id` in create project requests.\"\"\""},{"line_number":423,"context_line":"        # domain_id is nullable"},{"line_number":424,"context_line":"        request_to_validate \u003d {\u0027name\u0027: self.project_name,"},{"line_number":425,"context_line":"                               \u0027domain_id\u0027: None}"},{"line_number":426,"context_line":"        self.create_project_validator.validate(request_to_validate)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_179d2b59","line":423,"updated":"2015-05-01 13:56:30.000000000","message":"Could simplify the following with: \n\n    for domain_id in [None, uuid.uuid4().hex]:\n        request_to_validate \u003d {\u0027name\u0027: self.project_name,\n                               \u0027domain_id\u0027: domain_id}\n        self.create_project_validator.validate(request_to_validate)","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":420,"context_line":""},{"line_number":421,"context_line":"    def test_validate_project_update_request_with_valid_domain_id(self):"},{"line_number":422,"context_line":"        \"\"\"Test that we validate `domain_id` in create project requests.\"\"\""},{"line_number":423,"context_line":"        # domain_id is nullable"},{"line_number":424,"context_line":"        request_to_validate \u003d {\u0027name\u0027: self.project_name,"},{"line_number":425,"context_line":"                               \u0027domain_id\u0027: None}"},{"line_number":426,"context_line":"        self.create_project_validator.validate(request_to_validate)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_7bd2e5d3","line":423,"in_reply_to":"3acd31a7_179d2b59","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b3bc1f27fc062f0787958d6a85ec82b9c73bf3d0","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                               \u0027domain_id\u0027: \u0027fake project\u0027}"},{"line_number":441,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":442,"context_line":"                          self.create_project_validator.validate,"},{"line_number":443,"context_line":"                          request_to_validate)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"class DomainValidationTestCase(unit.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_37b147e2","line":443,"updated":"2015-05-01 13:56:30.000000000","message":"the same comment can be applied here.","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"21abed85e3164dd7856050807afc9f7204a3cd56","unresolved":false,"context_lines":[{"line_number":440,"context_line":"                               \u0027domain_id\u0027: \u0027fake project\u0027}"},{"line_number":441,"context_line":"        self.assertRaises(exception.SchemaValidationError,"},{"line_number":442,"context_line":"                          self.create_project_validator.validate,"},{"line_number":443,"context_line":"                          request_to_validate)"},{"line_number":444,"context_line":""},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"class DomainValidationTestCase(unit.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":55,"id":"3acd31a7_5bd5e9b6","line":443,"in_reply_to":"3acd31a7_37b147e2","updated":"2015-05-04 13:59:48.000000000","message":"Done","commit_id":"c567167cf73fd7cfc19c71a58fd345ec0f4d4567"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b30ef3d9d837a6e82565bf9aef740aa6d63d6dd4","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                                   \u0027domain_id\u0027: domain_id}"},{"line_number":435,"context_line":"            self.assertRaises(exception.SchemaValidationError,"},{"line_number":436,"context_line":"                              self.create_project_validator.validate,"},{"line_number":437,"context_line":"                              request_to_validate)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"class DomainValidationTestCase(unit.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_604ac7ae","line":437,"updated":"2015-07-04 15:01:05.000000000","message":"I note that we use the create_project validator for both these tests (whereas the one you are replacing used the update_project validator).  Is there a reason for this?","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"49a385e83e14053375bbda6128e9714d88af937b","unresolved":false,"context_lines":[{"line_number":434,"context_line":"                                   \u0027domain_id\u0027: domain_id}"},{"line_number":435,"context_line":"            self.assertRaises(exception.SchemaValidationError,"},{"line_number":436,"context_line":"                              self.create_project_validator.validate,"},{"line_number":437,"context_line":"                              request_to_validate)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"class DomainValidationTestCase(unit.BaseTestCase):"}],"source_content_type":"text/x-python","patch_set":62,"id":"ba3cc151_430c4242","line":437,"in_reply_to":"ba3cc151_604ac7ae","updated":"2015-07-06 17:21:31.000000000","message":"There is not. The test name is wrong. I\u0027ll fix it.","commit_id":"9cc1f8d52ec202b66910925f84b522d911f53744"}]}
